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

时间:2014-12-18 19:48:13

标签: c pointers

我从C语言中学到的是 int ** matrix = matrix是指向int的指针 当我们想要创建一个矩阵时,我们将malloc一组c​​ontigus指针! 所以这里的第一个指针指向一个指向int的指针,或者它可以指向一组指向int的指针(第一个指针当然指向第一个指针的地址)

Brievely指向1指针(只有一个)是否与指向一组指针的第一个指针相同?

我认为答案在于这个问题究竟什么是一系列的东西?

2 个答案:

答案 0 :(得分:6)

指针和数组根本不同,尤其是wrt。他们对sizeof()和wrt的行为。他们分配了什么。但是,它们有时可以互换使用,因为它们基本上都代表一个地址。

如果动态分配内存,您将收到一个指针,指向一块内存的开头。如果您分配的内存大小代表类型大小的倍数,那么应该直观地明确您可以在那里存储一个类型的多个元素,因为您已经为其分配了空间。由于C指针算术解释*(p + n) - 与p[n]n[p]相同 - 因为访问p的地址加n倍的大小类型p指向的元素,现在应该更容易理解您可以将指针解释为数组的开头。

对于您的情况,这意味着您可以将int **p解释为指向int指针的指针。经过这个指针的记忆,n更多int指针可能会跟随,而这些指针中的每一个都代表int的地址,过去再次n可能会有更多ints。因此,即使int **p实际上是指向类型int的指针的指针,也可以将其解释为二维数组。指针上有多少个元素属于数组,这是你不能从数组而不是指针中知道的东西,这就是为什么你通常会有一个n_size和/或m_size参数或类似的东西。

一开始我说你可以"有时"把它们视为一样。为了明确这一点,您可以在这些情况下交替使用指针和数组:

  1. 当传递给函数时,type[]"衰变"到type *例如f(type *a)
  2. 如果使用[]运算符访问元素,a[i]始终会解析为*(a + i)
  3. 当它们出现在表达式中时,例如++a
  4. cf:van der Linden - Deep C

答案 1 :(得分: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