int * ptr和int之间的区别(* arr)[3] =& a

时间:2018-02-15 10:22:00

标签: c arrays pointers

int arr[3]={1,2,3};
int* ptr;
ptr=arr;

相同
int a[3]={1,2,3};
int(* arr)[3] =&a;

如果没有,那么差异是什么?

3 个答案:

答案 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+1arr,在腐朽有效的情况下 - 现在如果你写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元素数组的指针,并且你有太多的初始值设定项,因为指针是一个缩放器,应该分配一个值。它必须产生错误或警告,因为它是违反约束。