首页 > 解决方案 > C中二维数组的名称

问题描述

我正在学习 C 中的指针和数组,这是一个让我困惑了一段时间的问题:

因此,一维 int 数组的名称是一个指向int的常量指针,它指向该数组中的第一个元素。因此,当我们评估一维数组的名称时,我们应该得到数组中第一个元素的地址。

对于 2D int 数组,数组名称是指向int的第一个数组的指针。那么 2D int 数组名称的值是多少?我认为它应该是这个二维数组中第一个数组的地址。但是 C 中如何定义数组的地址呢?它只是该数组中第一个元素的地址吗?

标签: carrayspointers

解决方案


所以一维 int 数组的名称是一个指向 int 的常量指针

这是错误的,而且经常被教导得很糟糕。数组就是数组。这是一些类比的代码:

int x = 5;
double d = x + 1.2;

在第二行x转换为 double用于加法。这不会改变x,它仍然是int,转换的结果是“临时的”,并且只存在直到添加完成。转换是由+运算符的条件要求的,即两个算术操作数必须被带到一个公共类型(double在这种情况下)。

在数组的情况下,假设我们有char *p = arrayname + 1, thenarrayname仍然是一个数组。但是它被转换为一个临时指针,以便可以进行加法(+运算符需要这个,它可以添加一个指针和一个整数)。临时指针指向数组的第一个元素,但是说临时指针数组是不正确的。

大多数运算符都会调用数组到临时指针的这种转换,但有些则不会。所以说它是arrayname指针是不正确的,因为它可能与不将数组转换为指针的运算符一起使用,例如sizeof arrayname.

将数组转换为指针的结果是指向该数组第一个元素的指针。即使第一个元素本身就是一个数组,这始终是正确的。

但是 C 中如何定义数组的地址呢?它只是该数组中第一个元素的地址吗?

不,每个变量都有一个地址,这适用于数组和非数组。如果您了解 an 的地址,int那么您也了解 2x2 数组的地址char


推荐阅读