【问题标题】:Is a matrix int mat[5][5] the same thing as an int **? [duplicate]矩阵 int mat[5][5] 和 int ** 一样吗? [复制]
【发布时间】:2014-09-29 03:11:54
【问题描述】:

简单的一维数组被认为是指针,但矩阵也是如此吗?

但是,立方体 int[5][5][5] 也将被视为 int *** 吗?

【问题讨论】:

  • 简单的一维数组从一开始就被视为指针。在某些表达式中使用时,数组的名称会衰减为指针,但这是完全不同的事情。
  • 你可以看看this。不是正确的答案,但无论如何都有帮助。

标签: c


【解决方案1】:

不,指向整数的指针与整数数组的数组不同。

想想他们在记忆中的样子。

数组数组(例如int a[2][2]):

+---------+---------+---------+---------+ |一个[0][0] |一个[0][1] |一个[1][0] |一个[1][1] | +---------+---------+---------+---------+

指向指针的指针(例如int **a):

+-----+------+------+ |一个[0] |一个[1] | .... | +-----+------+------+ | | | v | +---------+---------+---------+ | | A[1][0] |一个[1][1] | ....... | | +---------+---------+---------+ v +---------+---------+---------+ | A[0][0] |一个[0][1] | ....... | +---------+---------+---------+

【讨论】:

    【解决方案2】:

    不,他们不是。例如考虑下面给出的两个声明。

    int c[5][5][5];
    int ***d;
    

    对于第一个声明,内存要求是 125 X 4 = 500 字节。

    至于第二个声明,内存要求仅为 4 个字节。出于许多实际目的,我们可以在数组和指针之间互换,但它们并不相同。

    【讨论】:

    • 我认为这有点忽略了更重要的一点,那就是你不能这样做d = c
    【解决方案3】:

    显然不是。整数数组的数组不同于指向整数的指针。 数组是存储在连续内存位置的相似数据元素的集合。但是指向整数的指针不是。

    int a[5][5];
    

    在此声明中,它将为所有元素分配连续的内存位置。假设起始内存位置是 1000。

    array  starting   array elements
           address
    a[0]--> 1000 --> a[0][0] a[0][1] ... a[0][4]
    a[1]--> 1020 --> a[1][0] a[1][1] ... a[1][4]
    a[2]--> 1040 --> a[2][0] a[2][1] ... a[2][4]
    a[3]--> 1060 --> a[3][0] a[3][1] ... a[3][4]
    a[4]--> 1080 --> a[4][0] a[4][1] ... a[4][4]
    

    但是当你有指针指向这样的整数时-

    int **a;
    

    当你为此分配内存时-

    array --> a[0] a[1] a[2] a[3] a[4]  
    address > 1000 1004 1008 1012 1016 // address of array which points to some other location
    

    这将被分配连续的内存位置。但是每个数组都会指向/保存元素的其他内存位置。

    array's  array  element's   array elements
    address         address
    1000 --> a[0]--> 2000 --> a[0][0] a[0][1] ... a[0][4]
    1004 --> a[1]--> 3000 --> a[1][0] a[1][1] ... a[1][4]
    1008 --> a[2]--> 4000 --> a[2][0] a[2][1] ... a[2][4]
    1012 --> a[3]--> 5000 --> a[3][0] a[3][1] ... a[3][4]
    1016 --> a[4]--> 6000 --> a[4][0] a[4][1] ... a[4][4]
    

    这些数组保存了它们在不同位置的元素的起始地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 2014-11-05
      • 2012-10-10
      • 2019-08-14
      相关资源
      最近更新 更多