看一下这个例子:
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[5] = {1,2,3,4,5}; // LINE A
int (*b)[5] = &a; // LINE B
printf("%d\n", (*b)[0]); // LINE C
}
我尝试在int (*b)[5] = a
上写LINE B
,但它没有用。任何人都可以解释为什么这不起作用?我虽然数组已经衰减成指针,但我不能理解为什么我需要明确地通过a
获取&a
的地址。就像a
已经是一个指针因为它已经腐烂了,但现在我拿了一个指针的地址?双指针?咦?
任何人都可以解释(*b)[0]
的工作原理吗?它就像我取消引用b
,它本身就是一个指向5个整数的数组的指针,但我不知何故取了它的[0]&#39;元素?在这种情况下,不是[0]元素是5个整数吗?我不知何故最终得到一个整数,它打印1
。
我真的很困惑。感谢。
答案 0 :(得分:2)
int a[5]={1,2,3,4,5};
-------In Memory----------
| 1 || 2 || 3 || 4 || 5 |
---------------------------
101 105 109 113 117 //Assume these are addresses
默认情况下,数组名称就像指向第一个元素的指针一样。
所以a
就像指向第一个元素的指针(这里的元素是整数)
因此a
已经沦为int *a
;
这就是为什么如果你增加1然后它将跳转到元素的下一个地址,如下所示
它会像这样计算:第一个元素的地址+(n * sizeof(int))
(a+0)--->101 // 101 + 0*sizeof(int)
(a+1)--->105 // 101 + 1*sizeof(int)
(a+2)--->109 // 101 + 2*sizeof(int)
(a+3)--->113 // 101 + 3*sizeof(int)
(a+4)--->117 // 101 + 4*sizeof(int)
但是&a
就像一个指向完整数组的指针(在这种情况下指向5个整数),这意味着
当你向它添加一个时,它将尝试指向接下来的5个整数。如下所示
(&a+1)----->121 //101 + 1*sizeof(a)
这就是为什么在这一行中int (*b)[5] = &a;
没有问题,但当你尝试int(*b)[5]=a;
时
它给出了错误,因为 a
是指向单个整数的指针,其中as(* b)[5]是指向5个整数的指针。你不能指定不兼容的指针类型。
答案 1 :(得分:0)
b
是指向数组a
的指针。取消引用b
将提供整个数组a
。因此,当您在表达式中使用*b
时,它表示该解除引用数组的名称。由于数组名称被转换为指向数组第一个元素的指针,*b
衰减到指向a
(或*b
)的第一个元素的指针。衰变后*b
的类型为int *
。因此(*b)[i]
将给出b
指向的数组的i th 元素。
答案 2 :(得分:-4)
当你声明 - int a [5]时 - 编译器使用'a'作为内部存储器的引用。 'a'本身不是变量。因此,&amp; a不起作用。