通过引用传递 2d 向量

MIL*_*ILO 2 c pointers multidimensional-array implicit-conversion

我读了很多关于这个主题的回复,但我仍然无法理解。请理解我正在学习过程中。

有人告诉我,向量只不过是它的第一个元素地址,因此是一个二维向量。

那么,为什么如果我通过指针传递 2D 向量,我就会失去使用索引的能力。

int vec[10][10] = { 1, 2, 3, 4 };
int *v = vec;
Run Code Online (Sandbox Code Playgroud)

为什么我不能说

int a = v[1][1]  
Run Code Online (Sandbox Code Playgroud)

就像我会做的那样

int a = vec[1][1] 
Run Code Online (Sandbox Code Playgroud)

if v,那是一个指向int, 的指针,而vec, 那是一个指向int, 的指针,那么它们不是完全相同的东西,同一个对象吗?

我读到

int (*v)[N] = vec;
Run Code Online (Sandbox Code Playgroud)

其中N是列数。但这对于初学者来说似乎是一件超级棘手的事情。

为什么是这样?

编辑

我的大脑想到了这个解释,int (*vec)[N]解释了指向向量 10 的指针的int含义。这里是。

鉴于我的理解,在二维数组中,指向第一个元素的指针是指向N元素数组的指针,这是我给自己的解释。

如果 lhs ofint *var = &int必须从右到左读取,变成“ varis a pointerto int”,那么我期望int [N] * var = &2darray从右到左,“var 是指向 N 个 int 元素的数组的指针”。

但这对于编译器来说在语法上是不正确的,所以我必须采取int (* vec) [N] = 2darray从右到左的技巧,记住括号优先级变成:

首先是括号,从右到左:veca pointer

然后剩下的,现在是,从右到左:int [N]

最终的结果veca pointeran array of Nint

这有任何意义吗?

Vla*_*cow 5

编译器应该在这个声明中发出一条消息

int* v = vec;
Run Code Online (Sandbox Code Playgroud)

使用不兼容指针类型的指针来初始化v该类型的指针int *

用作初始值设定项的数组vec会隐式转换为指向其第一个元素的指针。该二维数组的元素类型为int[10]。因此,指向数组元素的指针的类型为int ( * )[10]

您不能v[1][1]在代码片段中使用类似的表达式,因为子表达式的v[1]类型为int。也就是说,子表达式v[1]生成一个不是数组的标量对象。所以这样的表达方式v[1][1]是无效的。

如果你会写

int vec[10][10] = {1,2,3,4};
int ( *v )[10] = vec;
Run Code Online (Sandbox Code Playgroud)

那么子表达式产生一个数组类型v[1]的对象。int[10]因此,您可以对获得的数组再应用一个下标运算符,例如v[1][1]

如果您有一个一维数组,请注意这一点,例如

int a[n];
Run Code Online (Sandbox Code Playgroud)

那么该数组的元素的类型为int。并且在极少数例外的表达式中使用的数组(例如使用 insizeof运算符)将转换为指向其类型的第一个元素的指针int *

另一方面,如果你有一个像这样的二维数组

int a[m][n];
Run Code Online (Sandbox Code Playgroud)

那么数组的元素是类型的一维数组int[n],并且指向数组元素的指针的类型是int ( * )[n]