【问题标题】:assign int[][] to int** [duplicate]将 int[][] 分配给 int** [重复]
【发布时间】:2014-10-10 05:20:41
【问题描述】:

据我所知,在某些情况下,数组会被转换为指向其第一个元素的指针:

int a[5];
int * p;

p = a;

按照这种方法并考虑到我可以将数组分配给指针,为什么我不能将二维数组分配给指向指针的指针?

int a[5][5];
int ** q;

q = a;

但是,我可以将指针数组分配给指向指针的指针:

int * p[5];
int ** q;

q = p;

如果将数组转换为指向其第一个元素的指针,则在第二个示例中发生 q = a 时,a 应该是指向 a[0] 的指针,a[0] 应该是指向 a[0] 的指针[0],对吧?

此外,如果我这样做,我不会收到错误:

cout << **a;

提前致谢,希望您能帮助我理解。

【问题讨论】:

  • 数组不是指针(在某些情况下它会衰减到它 _ 即函数调用)。同样,二维数组不是指向指针的指针。二维数组不是指针数组,它们也不同
  • 您不能分配它,因为您不仅要对变量进行分配,而且还要分配大小为 [5][5] 的内存。您为指针或 int **q 的指针分配内存的方式不同。您首先像这样分配内存: int **q = new int *[5]; for(int i= 0; i

标签: c++ c arrays pointers


【解决方案1】:

问题在于数组int a[5][5]; 存储了25 个连续的int

指向int **q; 之类的数组/指针的指针期望找到指向int 的连续指针数组。

这就是为什么你想做的任务是不可能的。

【讨论】:

    【解决方案2】:

    一个多维数组可以分配给单个指针

    int a[5][5];
    int *p = a;
    

    因为内存被分配为按行组织的单个块。

    a = a11 a12 a13
        a21 a22 a23    
    
    a = a11 a12 a13 a21 a22 a23 
    

    【讨论】:

      【解决方案3】:

      为了更清楚,让我们考虑你的第一个例子

      int a[5];
      int * p;
      
      p = a;
      

      in 可以改写如下方式

      T a[5];
      T * p;
      
      p = a;
      

      其中 T 是某种类型。

      什么是 C/C++ 中的二维数组?它是一个数组元素,其中的元素又是一维数组。

      所以这个定义

      int a[5][5];
      

      可以改写为

      T a[5];
      

      其中 T 的类型为 int[5]

      我们有

      T a[5];
      T * p;
      
      p = a;
      

      我们已经知道的 T 是 int[5] 所以 p 的类型是指向 int[5] 类型数组的指针,并且必须定义为

      int ( *p )[5];
      
      p = a;
      

      int ( * )[5]int ** 是两种不同的类型。

      至于这段代码

      int * p[5];
      int ** q;
      
      q = p;
      

      当这里的 T 是 int * 所以 p 被定义为 T *p 又是 int **p

      【讨论】:

        【解决方案4】:

        对于多维数组,如果要指向单个(标量)值,则应使用以下声明:

        int a[5][5];
        int (*q)[5]; /* pointer to five-element array of basic type int */
        
        q = a;
        q[0][0]; /* equivalent to a[0][0] */
        

        其中5 是“列”大小(在最左边的“行”大小旁边)。一般来说,对于更多维度,请记住该规则是只有最左边的大小被声明符的(*q) 部分替换。

        其实你写函数的时候,有多维数组参数,那么编译器就按照上面的形式来考虑,比如:

        int foo(int a[5][5]) { ... }
        

        被有效地替换为:

        int foo(int (*a)[5]) { ... }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-15
          • 1970-01-01
          • 2011-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-10
          • 2019-05-18
          相关资源
          最近更新 更多