我从C语言中学到的是 int ** matrix = matrix是指向int的指针 当我们想要创建一个矩阵时,我们将malloc一组contigus指针! 所以这里的第一个指针指向一个指向int的指针,或者它可以指向一组指向int的指针(第一个指针当然指向第一个指针的地址)
Brievely指向1指针(只有一个)是否与指向一组指针的第一个指针相同?
我认为答案在于这个问题究竟什么是一系列的东西?
答案 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
参数或类似的东西。
一开始我说你可以"有时"把它们视为一样。为了明确这一点,您可以在这些情况下交替使用指针和数组:
type[]
"衰变"到type *
例如f(type *a)
[]
运算符访问元素,a[i]
始终会解析为*(a + i)
++a
答案 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;
}
编译器会回答你这两个声明是不同的。事实上: