c - C中二维数组的名称

标签 c arrays pointers

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

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

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

最佳答案

So the name of a 1D int array is a constant pointer to int

这是错误的,而且经常被教坏。数组就是数组。下面是一些类比的代码:

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

在第二行中,x转换为 double 用于加法。这不会改变x,它仍然是一个int,转换的结果是“暂时的”,只存在于加法完成之前。 + 运算符的条件要求进行转换,即两个算术操作数必须转换为通用类型(在本例中为 double)。

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

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

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

But how is the address of an array defined in C? Is it just the address of the first element in that array?

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

关于c - C中二维数组的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54859119/

相关文章:

c - 对结构进行排序时 Swenson 的 Timsort 实现存在问题

arrays - Excel VBA : adding a row to a variant array in one line

c - 在 C 中使用带有取消引用的增量运算符

c - 如何仅在使用 CMake 构建的 Linux 上使用特定于 Linux 的 API 和库?

c - 下面的 C 代码是否有效?

c++ - 为什么很少有人输入 const 正确的代码? const 正确的代码会编译得更好/更快吗?

c++ - 将数据从 vector<unsigned char> 传输到 unsigned char[]

c - "Pulling down"将二维数组的元素移动到数组内的空白处

c++ - 这跨线程安全吗?

c - 从 pop 函数返回错误的地址