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;