int arr[3]={1,2,3};
int* ptr;
ptr=arr;
与
相同int a[3]={1,2,3};
int(* arr)[3] =&a;
如果没有,那么差异是什么?
答案 0 :(得分:1)
在第一种情况下,
int arr[3]={1,2,3};
arr
是3个整数的aray,您可以通过括号括起的列表{1,2,3}
初始化值。一切都好。
在第二种情况下,
int(* arr)[3] ={1,2,3};
arr
是一个指向3 int
s数组的指针,因此initalizer 错误,(由于多种原因,如类型不匹配,多余的初始化程序)。
但是,您可以像
一样使用它 int(* arr)[3] = & (int []){1,2,3};
其中,这使用了复合文字。这"转换"大括号括号列表,然后,您使用该数组的地址初始化LHS。
答案 1 :(得分:0)
首先,如果编译用第二个语句编写的代码是 -
警告:初始化使得整数指针没有强制转换。
这不是正确的做法。转换会让编译器停止抱怨,但问题更大。
现在让我们看看如何使其正确
int a[]={1,2,3};
int (*arr)[3]= &a;
不同之处在于arr
是指向数组的指针。你之前写的是将数组的衰减指针赋给指针变量。
数组不是指针(指针不是数组) - 在第一种情况下,数组被转换为指向第一个元素的指针 - 因此它被转换为指向int
的指针,并且正在被指定。
进一步解释:
有两件事要知道 - 一个叫做数组衰减,另一个是指针类型的重要性。
大多数时候(注意大多数这个词 - 我不是说总是有些情况下它没有。例如当用作{的操作数时{1}}数组衰减不会发生。现在请注意,你也使用过&
。那么数组衰减是什么?)数组被转换为指向它所包含内容的第一个元素的指针。假设它是&
,那么假设您在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(*)[]
。你现在做了什么错误?您正在使用初始值设定项,该值导致int(*)[]
值,并将其分配给指针。这个好吗?不。有一个类型不匹配,还有为什么要用整数初始化变量?这是一个地址吗?还是有效的?你不知道。当您尝试访问指针时,这会导致问题。
答案 2 :(得分:0)
在:
int arr[3]={1,2,3};
int* ptr;
ptr=arr;
ptr
指向有效的数组arr
,因为数组在这样的上下文中衰减为指向其第一个元素的指针。
在:
int(* arr)[3] ={1,2,3};
arr
是一个指向3个int
元素数组的指针,并且你有太多的初始值设定项,因为指针是一个缩放器,应该分配一个值。它必须产生错误或警告,因为它是违反约束。