如果';a';是C中的整数数组,为什么是';a和x2B;1';和'&;a和x2B;1';不同? #包括 int main(){ int a[2]={0,1}; printf(“%d\n”,a); printf(“&a+1%d\n”、&a+1); printf(“a+1%d\n”,a+1); 返回0; }
结果如下: 6422232 &a+1 6422240 a+1 6422236如果';a';是C中的整数数组,为什么是';a和x2B;1';和'&;a和x2B;1';不同? #包括 int main(){ int a[2]={0,1}; printf(“%d\n”,a); printf(“&a+1%d\n”、&a+1); printf(“a+1%d\n”,a+1); 返回0; },c,C,结果如下: 6422232 &a+1 6422240 a+1 6422236 为什么&a+1和a+1不同?在&a+1中,&a取数组的地址。这将生成一个指向数组的指针,因此添加一个将增加一个数组的大小。这是因为每种类型的指针都有自己的测量单位,添加一个指针总是添加一个指向的对象 在a+1中,a是数组本身。C自动将数组转换为第一个元素的地址。因此,a生成指向元素的指针,因此添加一个元素会增加一个元素的大小 (在&a+1中,a未自动转换为指向第一个元素的指针。将&与数组一起使用是转换的例外。请参见下面
为什么
&a+1
和a+1
不同?在&a+1
中,&a
取数组的地址。这将生成一个指向数组的指针,因此添加一个将增加一个数组的大小。这是因为每种类型的指针都有自己的测量单位,添加一个指针总是添加一个指向的对象
在a+1
中,a
是数组本身。C自动将数组转换为第一个元素的地址。因此,a
生成指向元素的指针,因此添加一个元素会增加一个元素的大小
(在&a+1
中,a
未自动转换为指向第一个元素的指针。将&
与数组一起使用是转换的例外。请参见下面的注释1。)
笔记
sizeof
、&
或\u Alignof
的参数时,或者当数组是用于初始化数组的字符串文字时,不会发生此错误%d
打印指针。C标准中没有定义这种行为。要打印指针,请将其转换为void*
并使用%p
打印:
#include<stdio.h>
int main(){
int a[2] = {0, 1};
printf("%d\n",a);
printf("&a + 1 %d\n",&a + 1);
printf("a + 1 %d\n",a + 1);
return 0;
}
%p
不一定产生实际的内存地址。C标准允许实现生成指针的其他表示形式。在没有复杂内存模型的良好C实现中,%p
将打印指向对象的内存地址。但是,这是一个实现质量特性首先要非常清楚,数组的名称是指向数组的常量指针。所以它总是指向内存中存储数组第一个元素的地址。&a+1和a+1的答案不同,这是因为&a+1以普通字递增数组的地址以递增数组的大小,而a+1除了打印数组的第一个元素外,还打印数组的值,尽管
a
和&a
具有相同的值。他们的类型不同。在指针算术类型问题上
例如,这里的a
衰减为指向(a+1
)中第一个元素(int*
)的指针,然后它被sizeof(int)
递增
其中as&a
是不会发生衰减的情况。因此&a
的类型为int(*)[2]
(指向由2个int
元素组成的数组的指针)现在,当您添加到1
时,它会按数组的大小或2*sizeof(int)
移动
这就是它们不同的原因 “数组名称是指向数组的常量指针”否。数组不是指针,指针不是数组。在许多情况下,都会出现相似之处。您不应该使用
%d
打印指针,最好使用%p
。此处发布的所有答案都讨论了所有问题。我对这些答案投了赞成票。用我自己的话来说,这只是一个答案,“指针使用它指向的任何类型对象的单位”——几乎是。更正确的说法是,指针指向的数据将被解释为X。单位的大小不取决于指针指向的对象。只有指针的类型。
printf("%p\n", (void *) a);
printf("&a + 1 %p\n", (void *) (&a + 1));
printf("a + 1 %p\n", (void *) (a + 1));