C 当将数组分配给指针时,这两种方法之间的区别是什么

C 当将数组分配给指针时,这两种方法之间的区别是什么,c,arrays,pointers,assign,C,Arrays,Pointers,Assign,当我们需要为指针分配一个数组时,我们可以做类似的事情 int numbers[] = {7,5,9,3}; int *ptr = NULL; ptr = &numbers[0]; // << int number[]={7,5,9,3}; int*ptr=NULL; ptr=&numbers[0];// 无差异(除非它们是sizeof运算符的运算符)。在这两种情况下,您都在分配数组第一个元素的地址&numbers[0]指定数组第一个元素的地址,而numbers将衰减为指向

当我们需要为指针分配一个数组时,我们可以做类似的事情

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

ptr=&numbers[0];// 无差异(除非它们是
sizeof
运算符的运算符)。在这两种情况下,您都在分配数组第一个元素的地址
&numbers[0]
指定数组第一个元素的地址,而
numbers
将衰减为指向数组第一个元素的指针

这是一回事。表达式
a[i]
*(a+i)
相同,因此
&a[i]
&*(a+i)
相同,定义为与
a+i
相同(甚至不计算解引用)。对于
i=0
,这意味着
a
&a[0]
相同。数组的名称将衰减为指向数组第一个元素的指针。

它们都将为您提供相同的值,但略有不同。当你这样做的时候

ptr = &numbers[0];
您正在添加两个不必要的步骤,一个解引用和一个“address of”操作,因此使用

ptr = numbers;

除非编译器对其进行优化,否则性能会更高。想想
整数[]=…]可能会很有用作为
int*numbers=…

IIRC,术语是“数组[指针]衰减”-请看,也许它们没有区别。挑你喜欢的。前者是显式的,后者是简短的。值得注意的是,尽管在这种情况下没有区别,但有时
数组
&数组[0]
不一样(例如,当它用作
sizeof
的操作数时)。如果编译器不能为这两种情况生成相同的输出,则可能是找到新编译器的时候了。“tr=numbers;将更具性能”-uggh。。。让我们试着清醒过来,生活在21世纪……谢谢,但你能澄清一下这一部分吗
数组的名称衰减为指针
@LionKing:当你使用
数字作为表达式(所谓的id表达式)时,在大多数情况下,它的值是指向数组第一个元素的
int
指针;它的值没有数组类型。这被称为“衰变”。C中没有“数组值”。
ptr = numbers;