这两个声明之间有什么区别:“int **matrix”和“ int matrix [] []”?

3
我从C语言中学到的是,int **matrix是指向一个指向整数的指针。当我们想要创建一个矩阵时,我们将malloc一组连续的指针!因此,第一个指针指向一个指向整数的指针,或者它可以指向一组指向整数的指针(第一个指针当然会指向第一个指针的地址)。
简要指向1个指针(仅有1个),是否与从一组指针中指向第一个指针相同?
我认为答案在这个问题中:什么是某物的数组?

我不确定你所说的“Brievely”是什么意思。 - Bill Lynch
很有趣,因为int ** matrix是指向指针的指针,当我们执行malloc(sizeof(int*) * X)时,它变成了一个指向数组的指针。有点模糊 :/ !! - user12448
有一个微小的差别,就是sizeof()。指针的sizeof始终是常量。指针数组的sizeof将取决于数组大小。 - Anonymous
3
那只是冰山一角。 - Deduplicator
当我们分配一段连续的内存,然后创建一个指针指向该分配的第一个位置时,这是否会形成一个数组? - user12448
显示剩余3条评论
2个回答

6
指针和数组在其行为方面存在根本不同,特别是在使用 sizeof() 和它们分配的内容方面。但是,它们有时可以互换使用,因为它们都本质上表示一个地址。
如果您动态分配内存,将会收到一个指向一块内存开头的指针。如果您分配的内存大小表示某个类型大小的倍数,那么很容易理解,您可以将尽可能多的该类型元素存储在其中。由于 C 指针算术将 *(p + n)(与 p[n]n[p] 相同)解释为对 p 的地址加上 n 乘以 p 指向的类型元素的大小的访问,因此现在更容易理解,您可以将指针解释为数组的开头。
对于您的情况,这意味着您可以将 int **p 解释为指向 int 指针的指针。在这个指针的内存之后,可能会跟随 nint 指针,而每个指针都代表一个 int 的地址,在此之后,又可能会跟随 nint。因此,即使 int **p 实际上是指向类型为 int 的指针的指针,也可以将其解释为二维数组。从您的指针开始到数组中有多少元素是您无法从数组或指针中知道的,这就是为什么通常会有一个类似于 n_sizem_size 参数的原因。
一开始我说过,您可以“有时”将它们视为相同。要明确这一点,可以在以下情况下互换使用指针和数组:
  1. 当传递给函数时,type[] 会“衰减”为 type *,例如 f(type *a)
  2. 如果使用 [] 运算符访问元素,则 a[i] 总是解析为 *(a + i)
  3. 当它们出现在表达式中时,例如 ++a
cf: Van der Linden -深入 C 语言:当指针和数组相同时,它们有什么相同点?

1
如果您想要快速得到答案,可以尝试编写这个简单的程序。
#include <stdio.h>
#include <stdlib.h>

int main()
{
   int matrix[2][3];
   int **m;
   m=malloc(sizeof(int *)*2);
   m[0]=malloc(sizeof(int)*3);
   m[1]=malloc(sizeof(int)*3);
   m=matrix;

   return 0;
}

编译器将告诉您这两个声明是不同的。实际上:warining

你可以忽略分配,因为它们无论如何都会泄漏。如果你仍然包括它们,那么请说明维度不需要对于m[x]来说是相同的。 - StarShine
我在使用一维数组进行测试时没有收到警告!!这真的很令人困惑!! - user12448
可能是因为数组会衰变成指针! - user12448

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接