所以,我在计算机考试中得到了这个(C gcc-4.9.2): 以下陈述是否会提供相同的输出?假设a是一个数组。
a)printf("%d", a + 1);
b)printf("%d", &a + 1);
c)printf("%d", a[0] + 1);
答案 0 :(得分:1)
以下陈述是否会提供相同的输出?
简短回答:不。
以下详细信息:
假设a
被定义为
int a[N];
带
N >= 1
和至少a
的第一个元素已正确初始化(案例3取决于后一个要求)。
printf("%d", a + 1);
a + 1
计算值为
的指针((char*) &a[0]) + 1 * sizeof a[0]
使用%d
打印它会调用UB。任何事情都可能发生/打印出来。使用%p
打印void
- 指针的值。使用(void*)
投射指针。
printf("%d", &a + 1);
&a + 1
计算值为
的指针((char*) &a) + 1 * sizeof a
(后者的值与1. N > 1
的结果不同。)
使用%d
打印它会调用UB。任何事情都可能发生/打印出来。使用%p
打印void
- 指针的值。使用(void*)
投射指针。
printf("%d", a[0] + 1);
根据数组的第一个元素的初始化,将打印一些整数值+ 1。
答案 1 :(得分:-1)
a)printf("%d", a + 1);
获取数组a
的地址。向其添加1表示指针现在指向第二个元素(即指针以sizeof(int)
个字节递增)。未定义将地址作为数字打印。要打印地址,请使用printf("%p", a);
。
b)printf("%d", &a + 1);
在&a
中,类型是'指向int数组的指针',添加1将添加整个数组的大小,而不是int的大小。因此,数组之外的第一个元素的地址将提供给printf(参见上面的打印地址)。
c)printf("%d", a[0] + 1);
将打印a
的第一个元素的值加1。
C11标准草案n1570:6.3.2.1左值,数组和函数指示符3 除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数。运算符,或者是用于初始化数组的字符串文字,具有类型''数组类型''的表达式将转换为类型为''指针类型''[...] 的表达式
感谢用户EOF,他在本答案的早期版本中指出了一些错误。
答案 2 :(得分:-2)
注意:数组变量的名称给出了它的起始地址。
printf("%d", a + 1);
所以等于&a[0]
。所以上面的陈述等于&a[0]+sizeof(a)*1
等于&a[1]
。这是a[1]
的地址。
printf("%d", &a + 1);
这可以近似为a[0] + 1
地址的地址,这将是一些胡言乱语。
printf("%d", a[0] + 1);
这是a[0]+1
的值。