调用数组数据类型进行打印的不同方法?

时间:2016-03-19 16:58:44

标签: c arrays reference

所以,我在计算机考试中得到了这个(C gcc-4.9.2): 以下陈述是否会提供相同的输出?假设a是一个数组。

a)printf("%d", a + 1);

b)printf("%d", &a + 1);

c)printf("%d", a[0] + 1);

3 个答案:

答案 0 :(得分:1)

  

以下陈述是否会提供相同的输出?

简短回答:不。

以下详细信息:

假设a被定义为

int a[N];

N >= 1

至少a的第一个元素已正确初始化(案例3取决于后一个要求)。

  1. printf("%d", a + 1);

    a + 1 
    

    计算值为

    的指针
    ((char*) &a[0]) + 1 * sizeof a[0]
    

    使用%d打印它会调用UB。任何事情都可能发生/打印出来。使用%p打印void - 指针的值。使用(void*)投射指针。

  2. printf("%d", &a + 1);

    &a + 1
    

    计算值为

    的指针
    ((char*) &a) + 1 * sizeof a
    

    (后者的值与1. N > 1的结果不同。)

    使用%d打印它会调用UB。任何事情都可能发生/打印出来。使用%p打印void - 指针的值。使用(void*)投射指针。

  3. 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的值。