为什么以下内容具有相同的值:指向数组的指针,指向数组的取消引用指针
Why do the following have the same value: the pointer to an array, the dereferenced pointer to the array?
例如,
int array[5] = {1}: // array of 5 integers
int (*ptr)[5] = &array; // pointer to an array of 5 integers
以下内容具有相同的值:
*ptr;
ptr;
如果我调用printf("%p, %p", *ptr, ptr);
两个输出将完全相同。 这是为什么呢?
在此语句中
int (*ptr)[5] = &array;
指针 PTR 由数组的地址初始化。数组的地址是其第一行的第一个元素的地址。
表达
*ptr;
为您提供对一维数组的第一个元素的引用 - 第一行或更准确地说是原始数组。
反过来,在表达式中,数组被转换为指向其第一个元素的指针,*ptr
等效于表达式array
被转换为指向数组的第一个元素的指针类型的右值*ptr
.:)即表达式*ptr
将具有类型 int *
第一行的地址和第一行的第一个元素的地址相同。现在您有两个指针,ptr
和 *ptr
第一个具有类型 int ( * )[5]
,而第二个具有类型 int *
但两者都具有相同的值。
如果您查看一维数组的内存布局,例如
int array[5];
这是有道理的。
array
|
V
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
array[0]
|
V
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
Address of array
|
V
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
Address of array[0]
|
V
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
即 &array == &array[0] == array decayed to a pointer
指针声明为:
int (*ptr)[5] = &array;
ptr == &array
*ptr == array decayed to a pointer == &array[0] == &array
这就是为什么您在使用时会看到打印的相同值的原因:
printf("%p, %p", *ptr, ptr);
由于 printf
是一个可变参数函数,因此省略号转换序列应用于参数。特别是,数组被衰减为底层类型的指针:IOW,它被隐式转换为指向数组第一个元素的指针。因此,当您调用 printf("%p, %p", *ptr, ptr);
时,*ptr
的类型为 int[5]
将转换为值为 &array[0]
的int*
。
相关文章:
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”