我读了很多关于这个主题的回复,但我仍然无法理解。 请理解我正在学习过程中。
我曾说过,向量只不过是它的第一个元素地址,因此是一个 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 是列数。 但这对于初学者来说似乎是一件非常棘手的事情。
这是为什么?
编译器应该在此声明中发出一条消息
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]。