我了解到,只是数组名称本身具有该数组的第一个元素的地址值。例如, int num [] = {1,2,3}; 所以 num 的值为& num [0] 和a单独的地址。但是,当我尝试找到 num 的地址时,它会为我提供与& num [0] 相同的地址。 Aren他们应该有不同的地址 num 和& num [0] 。
int main(){
int num[4]={1,2,3,4};
int* int_ptr = num;
printf("%d\n", &num[0]);
printf("%d\n", num);
printf("%d\n", &num);
printf("%d", int_ptr);
}
我的输出是:
6422268
6422268
6422268
6422268
答案 0 :(得分:5)
想象一下,一群人和一个人指向队列中的第一个人(这是你的第一个元素的地址")。现在想象另一个人指向整个队列。这两个人是否指向同一个方向?
如果你告诉他们指向下一个元素(第一个队列中的第二个人,另一个队列是另一个队列)会怎样?
看到区别?
int arr[1000];
&arr[0] + 1 == &arr[1]
&arr + 1 == <pointer to inexistent array[1000] of int>
答案 1 :(得分:0)
No becacuse num不存在作为位于内存中某处的指针,并且它只是连续内存块的地址以容纳表元素。它只是计算出来的东西,但并不是作为一个单独的物理存在而存在的。指针对象。所以num,&amp; num和&amp; num [0]地址完全相同,并指向存储表元素的内存的开头。
尝试分析此示例:
int main()
{
int num[10];
int *numptr = num;
printf("num = %p, &num = %p, &num[0] = %p\n\r", num, &num, &num[0]);
printf("numptr = %p, &numptr = %p, &numptr[0] = %p\n\r", numptr, &numptr, &numptr[0]);
return 0;
}
结果:
num = 0000001F3C2FFAB0, &num = 0000001F3C2FFAB0, &num[0] = 0000001F3C2FFAB0
numptr = 0000001F3C2FFAB0, &numptr = 0000001F3C2FFAD8, &numptr[0] = 0000001F3C2FFAB0
答案 2 :(得分:-1)
num指向数组中的第一项,与&amp; num [0]相同。这就是为什么他们都给你相同的地址。 也使用%p打印地址