当您希望指针指向变量的内存地址时,可以使用地址运算符(&),但是当您希望指针指向数组时,仅使用不带地址运算符的数组名称,这是为什么呢?
答案 0 :(得分:2)
前提不正确。如果不使用&
,则不会获得指向数组的指针;您将获得一个指向数组第一个元素的指针。
也就是说:
int arr[] = { 1, 2, 3, 4 };
int *p1 = arr;
int *p2 = &arr[0];
int (*p3)[4] = &arr;
p1
和p2
是等效的。它们都指向数组的第一个元素arr[0]
。
p3
是指向整个数组的指针,它确实需要&
。
答案 1 :(得分:0)
将数组实现为内存中的连续内存位置。当你写类似
int arr[] = {1, 2, 3};
int *p = arr
然后这里arr
只是基本类型int
的指针,指向数组中的第一个元素,而[]
运算符只是在帮助其递增
例如
arr[2]; // same as *(arr+2)
p[2]; // same as *(p+2) i.e. arr[2]
正如@melpomene所述,您的问题并不完全正确。指向数组的指针意味着类似
int (*p)[3] = &arr;
这里的指针的基本类型为int [3]
,因此当您递增(p++
)时,p将会递增3 int
。
在多维数组的情况下,指向数组的指针更为明显