【问题标题】:What is the difference between this two declarations " int **matrix " and " int matrix [] [] "? [duplicate]这两个声明“int **matrix”和“int matrix [] []”有什么区别? [复制]
【发布时间】:2015-02-17 17:01:15
【问题描述】:

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

简单地指向1个指针(只有一个)是否与指向一组指针中的第一个指针相同?

我认为答案就在这个问题到底是什么东西的数组中?

【问题讨论】:

  • 我不知道你所说的“简短”是什么意思
  • 是的,很有趣,因为 int ** 矩阵是一个指向指针的指针,当我们执行 malloc(sizeof(int*) * X) 时,它变成了一个指向不明确数组的指针:/ !!
  • @user12448:嗯。什么意思?
  • @Deduplicator 我的意思是:说 pointer to a pointer to 与说 pointer to an array 是一样的吗?因为如果我是对的,array 本身就是一个 指向 的指针!
  • @Anonymous:这只是冰山一角。

标签: c pointers


【解决方案1】:

指针和数组根本不同,尤其是 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

cf:van der Linden - Deep C

【讨论】:

    【解决方案2】:

    如果您想快速获得答案,请尝试制作这个小程序

    #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;
    }
    

    编译器会回答你这两个声明是不同的。实际上:

    【讨论】:

    • 您可以忽略分配,因为它们无论如何都会泄漏。如果仍然包含它们,请说明两个 m[x] 的尺寸不必相同。
    • 我在用一个维度数组测试它时没有收到警告!这真是令人困惑!
    • 可能是因为数组衰减为指针!
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 2012-04-12
    • 2011-03-28
    • 2020-07-22
    • 2015-12-22
    • 2010-11-12
    • 2012-02-15
    • 2015-06-07
    相关资源
    最近更新 更多