int main()
{
int (*x)[5]; //pointer to an array of integers
int y[6] = {1,2,3,4,5,6}; //array of integers
int *z; //pointer to integer
z = y;
for(int i=0;i<6;i++)
printf("%d ",z[i]);
x = y;
for(int i=0;i<6;i++)
printf("%d ",(*x)[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以上printfs都打印数字1到6.
如果" 指向整数数组的指针 "和" 指向整数的指针 "都可以做同样的事情,它们是否具有相同的内部表示?
编辑:这个代码确实在编译时发出警告,如下面的答案所指出的,但它确实在我的x86_64机器上使用gcc正确打印值
AnT*_*AnT 18
首先,您的代码将无法编译.数组有类型int[6](6个元素),而指针有类型int (*)[5].您不能使此指针指向该数组,因为类型不同.
其次,当你初始化(赋值)这样的指针时,你必须&在数组上使用:x = &y,而不仅仅是x = y代码中的plain .
我假设您只是输入代码,而不是复制粘贴真实代码.
第三,关于内部代表性.通常,在实践中,您应该期望所有数据指针都使用相同的内部表示.此外,在上述分配(如果正确写入)之后,指针将具有相同的数值.之间的差int (*)[5]和int *只存在于概念层次,即在语言的水平:类型不同.它有一些后果.例如,如果你递增z它将跳转到数组的下一个成员,但如果你递增y,它将跳过整个数组等.所以,这些指针并不真正"做同样的事情".
Ara*_*raK 11
简短的回答:有区别,但你的例子是有缺陷的.
答案很长:
不同之处在于int*指向int类型,但int (*x)[6]指向6个int的数组.实际上在你的例子中,
x = y;
Run Code Online (Sandbox Code Playgroud)
是未定义的**行为,你知道它们有两种不同的类型,但在C中你可以做你想做的事.我只是使用一个指向六个整数数组的指针.
拿这个修改过的例子:
int (*x)[6]; //pointer to an array of integers
int y[6] = {1,2,3,4,5,6}; //array of integers
int *z; //pointer to integer
int i;
z = y;
for(i = 0;i<6;i++)
printf("%d ",z[i]);
x = y; // should be x = &y but leave it for now!
for(i = 0;i<6;i++)
printf("%d ",x[i]); // note: x[i] not (*x)[i]
Run Code Online (Sandbox Code Playgroud)
第一,
1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
会被打印出来.然后,我们到了x[0].x [0]只不过是6个整数的数组.C中的数组是第一个元素的地址.因此,y将打印地址,然后next在下一次迭代中打印数组的地址.例如,在我的机器上:
1 2 3 4 5 6 109247792 109247816 109247840 109247864 109247888 109247912
Run Code Online (Sandbox Code Playgroud)
如您所见,连续地址之间的区别只是:
sizeof(int[6]) // 24 on my machine!
Run Code Online (Sandbox Code Playgroud)
总之,这是两种不同的指针类型.
**我认为这是未定义的行为,如果错误,请随时更正我的帖子.
从标题中回答你的问题,来自 comp.lang.c FAQ:由于数组引用衰减为指针,如果 arr 是一个数组,那么 arr 和 &arr 之间有什么区别?
但是,您发布的代码存在其他问题(您分配的是y,而不是分配给,并且是一个 6 元素数组,但它是一个 5 元素数组;这两个都应该生成编译警告)。&yxy*x
希望这段代码有帮助:
int main() {
int arr[5] = {4,5,6,7,8};
int (*pa)[5] = &arr;
int *pi = arr;
for(int i = 0; i< 5; i++) {
printf("\n%d %d", arr[i], (*pa)[i]);
}
printf("\n0x%x -- 0x%x", pi, pa);
pi++;
pa++;
printf("\n0x%x -- 0x%x", pi, pa);
}
Run Code Online (Sandbox Code Playgroud)
打印以下内容:
4 4
5 5
6 6
7 7
8 8
0x5fb0be70 -- 0x5fb0be70
0x5fb0be74 -- 0x5fb0be84
Run Code Online (Sandbox Code Playgroud)
更新: 您可以注意到指向整数的指针增加了 4 个字节(32 位整数的大小),而指向整数数组的指针增加了 20 个字节(int arr[5] 的大小,即每个 32 位的 5 个 int 的大小)。这说明了差异。