当我们需要为指针分配数组时,我们会做类似的事情。
int numbers[] = {7,5,9,3};
int *ptr = NULL;
ptr = &numbers[0]; // <<
我们也可以这样做。
int numbers[] = {7,5,9,3};
int *ptr = NULL;
ptr = numbers; // <<
两种方式有什么区别?
哪一个是推荐的?
答案 0 :(得分:3)
这是一回事。表达式a[i]
与*(a + i)
相同,因此&a[i]
与&*(a + i)
相同,a + i
被定义为与i = 0
相同(甚至没有评估解引用)。对于a
,这意味着&a[0]
与{{1}}相同。数组的名称衰减为指向数组第一个元素的指针。
答案 1 :(得分:1)
没有区别(除非它们是sizeof
运算符的对等)。在这两种情况下,您都要分配数组的第一个元素的地址。 &numbers[0]
分配数组的第一个元素的地址,而numbers
将衰减指向数组的第一个元素。
答案 2 :(得分:-3)
他们都会给你相同的价值,但是略有不同。当你这样做
ptr = &numbers[0];
你要添加两个不必要的步骤,一个取消引用和一个“地址”操作,所以使用
ptr = numbers;
除非编译器优化它,否则会更高效。将int numbers[] = ...;
视为int *numbers = ...