将数组分配给指针时,这些方法之间有什么区别

时间:2013-12-06 23:32:51

标签: c arrays pointers assign

当我们需要为指针分配数组时,我们会做类似的事情。

int numbers[] = {7,5,9,3};
int *ptr = NULL;
ptr = &numbers[0];  // <<

我们也可以这样做。

int numbers[] = {7,5,9,3};
int *ptr = NULL;
ptr = numbers;  // <<

两种方式有什么区别?
哪一个是推荐的?

3 个答案:

答案 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 = ...

可能会有所帮助