我正在学习 C 中的指针和数组,这是一个让我困惑了一段时间的问题:
因此,一维 int 数组的名称是指向int的常量指针,它指向该数组中的第一个元素。因此,当我们评估一维数组的名称时,我们应该获取数组中第一个元素的地址。
对于二维 int 数组,数组名称是指向int的第一个数组的指针。那么 2D int 数组名称的值是什么?我认为它应该是这个二维数组中第一个数组的地址。但是C中数组的地址是如何定义的呢?它只是该数组中第一个元素的地址吗?
所以一维 int 数组的名称是一个指向 int 的常量指针
这是错误的,而且经常被教导得不好。数组就是数组。下面是一些类比代码:
int x = 5;
double d = x + 1.2;
Run Code Online (Sandbox Code Playgroud)
在第二行中x被转换为 double用于加法。这不会改变x它仍然是一个int,转换的结果是“临时的”并且只存在直到添加完成。+运算符的条件要求转换,即两个算术操作数都必须转换为公共类型(double在本例中)。
在数组的情况下,假设我们有char *p = arrayname + 1,那么arrayname仍然是一个数组。但是它被转换为一个临时指针,以便可以进行加法(+运算符需要这样做,它可以添加一个指针和一个整数)。临时指针指向数组的第一个元素,但说临时指针是数组是不正确的。
大多数运算符调用数组到临时指针的这种转换,但有些不调用。因此,说它arrayname是指针是不正确的,因为它可能与不将数组转换为指针的运算符一起使用,例如sizeof arrayname.
将数组转换为指针的结果是指向该数组第一个元素的指针。即使第一个元素本身是一个数组,这也总是正确的。
但是C中数组的地址是如何定义的呢?它只是该数组中第一个元素的地址吗?
不。每个变量都有一个地址,这适用于数组和非数组。如果您了解 an 的地址,int那么您也了解了 2x2 数组的地址char。
让我们澄清一些事情:
int a = 24;
Run Code Online (Sandbox Code Playgroud)
上面说了很多事情:
a类型的变量int。int定义:创建类型的对象。24让我们回顾一下:类型的对象int是使用值创建的24,并且变量a 为其命名。
现在让我们将同样的方法应用到以下内容:
int a1[3] = {0, 1, 2};
Run Code Online (Sandbox Code Playgroud)
a1type 的变量int[3](又名 3 个整数的数组)。{0, 1, 2}变量a1命名该对象。
因此,一维 int 数组的名称是一个指向 int 的常量指针,它指向该数组中的第一个元素。
错误的。我知道您可能已被告知或读过此内容,但这是不正确的。数组不是指针!!数组和指针是不同的类型。话虽这么说,出于方便和历史原因,在大多数情况下(但不是全部!),数组会衰减为指向第一个元素的指针:
int a1[3] = {0, 1, 2};
int* p = a1; // here a1 decays to a pointer to its first element
Run Code Online (Sandbox Code Playgroud)
上面的代码片段p指向0数组的元素a1
您可以以相同的方式查看 2D 或 3D 或 nD 数组:
T a2[3] = {l0, l1, l2};
Run Code Online (Sandbox Code Playgroud)
可以说T是一种类型。上面是一个“3 Ts 的数组”。
如果T是int,那么我们就有了int a2[3] = {0, 1, 2}- 一个由 3 个整数组成的数组。我们称之为一维 int 数组。
但如果T是int[2],那么上面的内容就变成了int a2[3][2] = {{00, 01}, {10, 11}, {20, 21}}- 你可以将其视为“3 个数组T”或“3 个数组int[2]”或“3 个 2 个整数的数组”。
我们可以应用相同的衰减规则:
int a2[3][2] = {{00, 01}, {10, 11}, {20, 21}};
int (*p2)[2] = a2; // a2 decays to a pointer to its first element.
// Its first element is an array of 2 int.
// So a2 decays to `int (*)[2]` - a pointer to an array of two elements.
Run Code Online (Sandbox Code Playgroud)
上面指向的是数组的a2元素。{00, 01}
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |