通过引用传递 2d 向量

问题描述 投票:0回答:1

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

我曾说过,向量只不过是它的第一个元素地址,因此是一个 2d 向量。

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

int vec[10][10] = {1,2,3,4};
int* v = vec;

为什么我不能说

int a = v[1][1]  

就像我会做的那样

int a = vec[1][1] 

if

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

我读到了

int (*v)[N] = vec

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

这是为什么?

c pointers 2d-vector
1个回答
0
投票

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

int* v = vec;

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

用作初始化的数组 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;

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

© www.soinside.com 2019 - 2024. All rights reserved.