数组地址的移位

牛客网专项练习——C语言错题集(6)-LMLPHP

这样才能解释通了,& 不能操作一个表达式,但 &++a[0] 却是没问题的。

下面是 C 语言运算符的优先级表(图片来自网络)

牛客网专项练习——C语言错题集(6)-LMLPHP


另外,如果题目中的数组的数据类型为 char,那么答案会是怎样的呢?答案依然是相同的,除非选项中出现了 &a + 1(原因见下文,但貌似不改题目,&a + 1 也是错的)。

题目的讨论区里还有下面这样一句话(貌似作者写错了):

这句话有点问题,把 &a + 1 改成 a + 1 才对。&a[0] + 1 的偏移量单位为数组类型的字节大小,但 &a + 1 的偏移量单位是数组总大小。

这里简单讨论一下 &a ,a,和 &a[0] 三者的关系,&a[0] 很好理解,就是取数组第一个元素的地址,& 和 [] 抵消,所以 &a[0] 等价于 a + 0(即 a),都表示数组第一个元素的首地址;而 &a 是整个数组的首地址,它的值和 a 是相同的,但意义显然不同,a + 1 是数组第二个元素的地址,而 &a + 1 就直接跳到数组外面去了。

这里可以联想到多维数组,假如有数组 b[2][3],&b[0] 表示第一个元素的地址,&b[0] + 1 等价于 b + 1 和 b[1],b[0] 和 b[1] 两个地址的差值就是 3 个数组元素的大小,也就是第二维数组的大小,而假设 b[0] 就是 a,那么 a 这个数组的大小就是 3 个元素的大小,&a + 1 偏移的大小就是 a 数组的总大小。


C 源程序和函数的关系

感觉 B 选项是对的呀。

牛客网专项练习——C语言错题集(6)-LMLPHP

二维数组值的表示方式

把数组第二维的大小看成 3 了。。。 1 * 4 + 3 = 7, B 是对的。

牛客网专项练习——C语言错题集(6)-LMLPHP

(n & (n-1)) == 0

n & n - 1 可以把 n 的二进制的最后一个 1 变为 0,如果 n & (n - 1) == 0,说明 n 的二进制中只有一位是 1,即为 2的幂。2 的幂并不全是偶数,2=1 就是一个奇数,所以该判断是错误的。前面也提到了,这个式子的含义是判断 n 是否为 2 的幂。

牛客网专项练习——C语言错题集(6)-LMLPHP

容易出错的 ++

这题出错是因为粗心,不过还是简单梳理一下:

p 是一个 struct student 类型指针,指向 stu[3] 这个数组,A 选项,p->num 等价于 p[0].num 即 6001,A 选项结果为 6002;B 选项,p++ 这个括号是多余的,最后结果就是 p->num ,即 6001;C 选项,结果是 6001;D 选项,p 先偏移一位,然后取值,即 p[1],p[1].num = 6003,选 D。

牛客网专项练习——C语言错题集(6)-LMLPHP

位运算

C 语言基本类型包括:整型数据类型、字符数据类型和浮点型数据类型。字符数据都有对应的数字编号,所以也可以参与位运算(相当于整数的位运算)。浮点数有三部分组成:符号位,指数位,数值位。移位操作会使指数位与数值位之间移动,产生的结果没有什么意义。

左移一位才是原操作数的两倍。。。

负数右移高位补 1。

牛客网专项练习——C语言错题集(6)-LMLPHP

fseek 可以实现的操作

没注意是多选题。。。

牛客网专项练习——C语言错题集(6)-LMLPHP

06-17 11:39