int arr[3]={1,2,3};
int* ptr;
ptr=arr;
是这样的
int a[3]={1,2,3};
int(* arr)[3] =&a;
如果没有,那么差异是什么?
在第一种情况下,
int arr[3]={1,2,3};
qazxsw poi是一个包含3个整数的数组,你用括号括起来的列表qazxsw poi初始化值。都好。
在第二种情况下,
arr
{1,2,3}
是指向3个 int(* arr)[3] ={1,2,3};
s数组的指针,因此initalizer是错误的(由于多种原因,如类型不匹配,多余的初始化程序)。
但是,您可以像使用它一样使用它
arr
在哪里,这使用复合文字。这会将括号括起的列表“转换”为数组,然后使用该数组的地址初始化LHS。
在:
int
int(* arr)[3] = & (int []){1,2,3};
指向有效的数组int arr[3]={1,2,3};
int* ptr;
ptr=arr;
,因为数组在这样的上下文中衰减到指向它们的第一个元素。
在:
ptr
arr
是一个指向3个int(* arr)[3] ={1,2,3};
元素数组的指针,你有太多的初始化器,因为指针是一个缩放器,应该被分配一个值。它必须产生错误或警告,因为它是违反约束的。
首先,如果你编译你用第二个语句写的代码是 -
警告:初始化使得指针来自整数而没有强制转换。
这不是正确的做法。转换会让编译器停止抱怨,但问题更大。
现在让我们看看如何使其正确
arr
区别在于int
是一个指向数组的指针。你之前写的是将数组的衰减指针赋给指针变量。
数组不是指针(指针不是数组) - 在第一种情况下,数组被转换为指向第一个元素的指针 - 因此它被转换为指向int a[]={1,2,3};
int (*arr)[3]= &a;
的指针。
进一步解释:
有两件事要知道 - 一个叫做数组衰减,另一个是指针的类型如何重要。
大多数时候(注意这个词最多 - 我并不是说总是存在它没有的情况。例如当用作arr
的操作数时,阵列衰减不会发生。现在请注意,你也使用过int
。那么什么是数组衰减?)数组被转换为指向它所包含内容的第一个元素的指针。假设它是&
然后假设您在&
操作中使用int arr[]={1,2}
它指向哪个或它是什么?它指向数组的第二个元素。这是arr
的地址。 arr+1
基本上是arr[1]
。
现在你可能想知道为什么*(arr+i)
指向第二个元素?为什么不是别的?
指针算术是在考虑它指向的东西的类型的情况下完成的。假设这里arr[i]
是一个arr+1
在腐烂工作的情况下 - 现在如果你写arr
然后这int*
将使int *p = arr+1
指向1
。
这里的p
类型??是的,当它说这里没有腐烂时,它自然而然地出现了。这是arr[1]
类型。它是一个指针,它的类型是&a
。你现在做了什么错误?您正在使用初始化程序,它导致int(*)[]
值并分配给指针。这个好吗?不。有一个类型不匹配,还有为什么要用整数初始化变量?这是一个地址吗?还是有效的?你不知道。当您尝试访问指针时,这将导致问题。