Tom*_*m H 0 c++ pointers multidimensional-array memory-address dereference
假设我这样初始化数组和变量:
int arr1d[3] = { 1, 2, 3 };
int* arrptr = arr1d;
int (*ptr1d)[3] = &arr1d;
int arr2d[2][3] = { {1, 2, 3}, {4, 5, 6} };
int (*ptr2d)[3] = arr2d;
Run Code Online (Sandbox Code Playgroud)
所以,arr1d是一个由 3 个整数组成的数组。在底层,arr1d是一个指向数组第一个元素的指针,即&arr1d[0]. 因此,我们可以赋值arr1d给int* arrptr。
ptr1d指向一个由 3 个整数组成的数组。arr1d是int*指向&arr1d[0],但为什么是&arr1d类型int (*)[3]?天真地,我认为写作&arr1d只是给了我们一个地址来分配给指针。这是特定于指向数组的指针吗?
显然,arr2d是类型int (*)[3](我从这篇文章中学到的)。双方ptr2d并*ptr2d具有相同的值,所以这是为什么第二解引用甚至是必要的?我的想法是,这可能是因为ptr2d类型是int (*)[3](指向 3 个整数数组的指针),*ptr2d是类型int*(指向整数的指针),所以**ptr2d最终得到我们第一个数组的第一个值,1。所以我们不是正如我们在许多图中看到的那样,在此处取消引用以遍历地址,我们正在取消引用以访问基础类型。这样对吗?这是否解释了为什么类型&arr1d也是int (*)[3](我们要“上一层楼”?)
谢谢你。
Run Code Online (Sandbox Code Playgroud)int arr1d[3] = { 1, 2, 3 };因此,arr1d 是一个包含 3 个整数的数组。
正确的。
在幕后,arr1d 是指向数组第一个元素的指针,即 &arr1d[0]
不清楚您所说的“幕后”是什么意思,但在 C++ 语言中,数组就是数组。它不是指针类型。说arr1d是&arr1d[0]是错误的。如果您的意思是在机器代码中,那么它是错误的,因为机器代码既没有类型也没有变量。
因此,我们可以赋值
arr1d给int* arrptr。
我们可以赋值arr1d,int* arrptr因为数组类型可以隐式转换为指向其元素类型的指针。并且这种转换的结果确实与&arr1d[0]. 这种转换称为衰减。
天真地,我认为写作
&arr1d只是给了我们一个地址来分配给指针。
&arr1d只是给了我们一个可以分配给指针的地址。所以,你的想法是正确的。
但为什么是
&arr1d类型int (*)[3]?
的类型arr1d是 3 个整数的数组,即int[3]。获取它的地址会给你一个指向 3 个整数数组的指针,即int (*)[3])。
这是特定于指向数组的指针吗?
一元&总是给出一个指向操作数的指针(除非类类型的操作符已经被重载,在这种情况下它给出重载返回的任何东西;重载一元&是罕见的)。它被称为 addressof 运算符。
当然,&只有当操作数是数组时,才会给你一个指向数组的指针。其他时候它会给出一些其他的指针类型。
Run Code Online (Sandbox Code Playgroud)int (*ptr2d)[3] = arr2d;显然,
arr2d是类型int (*)[3](我从这篇文章中学到的)。
你学错了。的类型arr2d是int[2][3]。int[3]是元素的类型,arr2d因此int (*)[3]是数组类型衰减到的指针类型;指向该数组元素的指针。
*ptr2d是类型int*(指向 int 的指针)
错误的。*ptr2d是类型int[3](3 个整数的数组)。此数组确实隐式转换为指向其第一个元素的指针,该元素的类型为int*。
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |