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

问题描述 投票:-3回答:3
int arr[3]={1,2,3};
int* ptr;
ptr=arr;

是这样的

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

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

c arrays pointers
3个回答
1
投票

在第一种情况下,

 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。


0
投票

在:

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}; 元素数组的指针,你有太多的初始化器,因为指针是一个缩放器,应该被分配一个值。它必须产生错误或警告,因为它是违反约束的。


0
投票

首先,如果你编译你用第二个语句写的代码是 -

警告:初始化使得指针来自整数而没有强制转换。

这不是正确的做法。转换会让编译器停止抱怨,但问题更大。

现在让我们看看如何使其正确

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(*)[]值并分配给指针。这个好吗?不。有一个类型不匹配,还有为什么要用整数初始化变量?这是一个地址吗?还是有效的?你不知道。当您尝试访问指针时,这将导致问题。

© www.soinside.com 2019 - 2024. All rights reserved.