指向指针数组和指针数组的指针之间的区别[重复]

Posted

技术标签:

【中文标题】指向指针数组和指针数组的指针之间的区别[重复]【英文标题】:Difference between pointer to pointer array and pointer array [duplicate] 【发布时间】:2014-01-22 13:44:42 【问题描述】:

int **pint *p2[5] 在第一种情况下有什么不同,p 是指向我稍后将定义的数组的指针!, 但 p2 也指向指针数组!!!!。 int *p2[5]int p2[5]; 相同。 因为在这两种情况下 p2 都是指针!。 有什么区别?

【问题讨论】:

【参考方案1】:
int **p

这是一个指向int 的指针。所以p 可以指向单个指针或指针数组。而*p 可以指向单个int,或int 的数组。 p 背后的确切内容并没有以它的类型表示。

int *p2[5]

这是一个长度为 5 的数组,由指向 int 的指针组成。这里,p2 是一个长度为 5 的数组。毫无疑问。但是p2[i] 呢?它们可以是指向单个int 的指针,也可以是指向数组的指针。同样,信息不存在于类型中。

在您提出的问题中:

p2 是一个指针。

这种说法是不正确的。 p2 是一个数组,而不是一个指针。在某些情况下,p2 可能衰减为指针,但它本身并不是指针。

请注意,如果您以变量 p2 开头,则可以将其分配给 p,如下所示:

p = p2;

这是一个数组p2,衰减为一个指针。此时您知道p 指向一个指向int 的指针数组。

但是,如果您只有一些p 类型的int**,那么您不知道p 指向一个数组。可能不会。换句话说,指针的类型并不能完全描述它所指向的内容。


您似乎对数组和指针之间的区别感到很困惑。它们是不相同的。数组不是指针。数组可以衰减为指针。指针可以指向数组。

也许关键的区别在于数组总是引用相同的变量。另一方面,可以使指针指向不同的变量。另一个明显的区别是数组变量定义了存储。另一方面,定义指针变量则不然。您必须始终将指针分配给其他对象的地址。

【讨论】:

但是 p2 是数组的名称,它也是指向这个整数指针数组的指针!所以 int *p2[5] 也是一个指向整数的指针!!! 听起来你已经决定知道答案了。你为什么还要问这个问题? 我告诉过你p2 是一个数组。但是您坚持认为它是一个指针。它不是。你问pp2 是什么,我告诉了你。所以,p2 是一个数组而不是一个指针。诚然,p2 可以在某些上下文中衰减指向一个指针。但p2 不是指针。 首先你需要放慢速度。你有很多学习要做,这需要时间。不要指望即时的专业知识。回到你的教科书,再次阅读有关数组和指针的内容。并阅读我在 cmets 中给你的链接。 数组不是指针,正如我给你的各种链接中所解释的那样。既然你已经明确表示你不会阅读我们提供给你的任何东西,为什么这里有人会花时间写另一个似乎肯定会被忽略的解释?而且你不需要投射。如果你有 int a[5],你可以写 int pa = a 因为一个数组*衰减到一个指针【参考方案2】:

好的 - 我明白你在问什么。

当您拥有int arr[5] 时,您可以将其转换为int*,它将指向数组中的第一个元素。例如;

int arr[5];
printf("%p == %p\n", &(arr[0]), (int*)arr);

将打印两个相等的值。

同样,

int *p2[5];
int **p=(int**)p2;
printf("%p == %p\n", &(p2[0]), p);

还将打印 2 个相等的值。所以,p2p 指向的内容并没有什么不同。

但是,当您声明 int* p2[5] 时,您正在为 5 个指向 int 的指针分配空间,当您将其强制转换为指针时,p2 将指向该数组的开头。

另一方面,int**p 的声明不保留这样的空间。它只是一个指向int 的指针。它可能指向ints 的数组,也可能是指向int 的指针数组。它甚至可能是ints 的二维数组。

【讨论】:

查看我对 david hofferman 帖子的评论 @user3223696 那么这里没有回答的问题是什么?你想知道区别,这突出了区别。它还表明您有时可以将它们用于相同的事情,但它们本质上并不相同。你还有什么问题? ut 和常规数组一样 int arr[5] arr 是一个指向 &arr[0] 的常量指针,为什么在这种情况下 int *p2[5] p2 不是指向第一个指针的指针由 5 个指向 int 的指针组成的数组?????? @user3223696 抱歉 - 我说完了。浏览答案,看看您是否可以自己弄清楚。仅仅因为您提出问题并抛出大量大写字母和重复问号并不意味着您可以要求每个人都回答。这里的每个人都有很多比受到虐待更好的事情要做。也许如果您完整而完整地提出问题,或者阅读有关如何更好地提出问题的常见问题解答。展示你正在尝试的代码和你遇到的问题,你会有更好的运气。 你不需要投射【参考方案3】:

int **pint *p2[5] 有什么区别?

这样想:int **p 表示表达式**pint 类型的变量。也就是说,你可以说**p = 123。同样,int *p2[5]; 表示表达式*p2[i]int 类型的变量;你可以说*p2[i] = 123;

现在你知道了,你可以推断p的含义。如果**pint 类型的变量,那么*p 必须是pointer to int 类型的变量,因此p 必须是pointer to pointer to int 类型的变量。

*p2[i] 呢?现在我们必须知道优先级。下标的优先级高于间接,所以这是*(p2[i]),它是int 类型的变量。因此p2[i] 必须是pointer to int 类型的变量,因此p2 必须是array of pointer to int 类型的变量。

有意义吗?

【讨论】:

我想我明白了,但为什么你在最后一行说 p 是指向 int 的指针数组类型的变量? p 是指针数组?所以数组名是指向第一个元素的常量内存块的指针?那么为什么你不能说 p 本身就是指针!到第一个元素??为什么你说它指向 int 的指针数组? 嗯...那我为什么会收到test.c:8:7: warning: incompatible integer to pointer conversion initializing 'int **' with an expression of type 'int' [-Wint-conversion] int **p = 123; @PedroA: int **p = x; 是写int** p; p = x; 的简写方式它不是int **p; **p = x; 的简写方式,因为那没有意义。声明中的赋值赋值给声明的变量,而不是**p!【参考方案4】:

在第一种情况下 p 是一个指向数组的指针

没有int **p是指向指针的指针,它可以成为指向内存块的指针,包含指向包含整数的内存块的指针。

int *p2[5] ,是的,这是五个指针的数组。

【讨论】:

查看我编辑的帖子,这个指向的指针稍后将指向整数数组, 第二种情况第一个维度是固定的=> 5,第一种情况,它只是可以指向二维数组的东西,但不一定会指向二维数组 在大卫的帖子上检查我的 cmets 请在那里回答我

以上是关于指向指针数组和指针数组的指针之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

增加指针与增加指针指向的数组元素有啥区别?

C:char指针和数组之间的区别[重复]

取消引用指针和访问数组元素之间的区别

指针数组和数组指针的区别

数组指针是二级指针吗?请解释一下!谢谢!

指针数组和数组指针的区别