为什么在单个变量上我需要指定内存地址,而在数组上我不需要它?
Why on a single variable I need to specify the memory address while on array I don't need it?
简单的例子:
double array[] = {1000.0, 2.0, 3.4, 17.0, 50.0};
double *p1 = array;
printf("p1: %fn", *(p1));
int x = 2;
int* p2 = &x;
printf("p2: %dn", *p2);
为什么在 p1 上我需要使用 & 而在数组上我不需要在 c/c++ 中使用它?有逻辑原因吗?
你可以认为数组的计算结果是"地址"类型的变量,而x是int类型的变量。 x存储在内存位置,&x为您提供该内存位置的地址。
数组的地址,即 &array 将计算为第一个元素的地址,从而计算数组本身的地址。
表达式中的数组指示符被转换为指向其第一个元素的指针(极少数例外(。
来自 C 标准(6.3.2.1 左值、数组和函数指示符(
3 除非是 sizeof 运算符或一元运算符的操作数和 运算符,或者 是用于初始化数组的字符串文本,一个 类型为"类型数组"的表达式将转换为 类型为"指向类型的指针"的表达式,该表达式指向初始 元素,并且不是左值。如果数组对象 具有寄存器存储类,行为未定义。
并且从C++标准(4.2 数组到指针的转换(
1 类型为"N T 数组"或"未知数组"的左值或右值 T"的绑定"可以转换为"指向T的指针"类型的prvalue。这 结果是指向数组第一个元素的指针。
因此,该声明
double *p1 = array;
相当于
double *p1 = &array[0];
^^^
考虑这个示范性程序
$include <iostream>
int main()
{
double array[] = { 1000.0, 2.0, 3.4, 17.0, 50.0 };
std::cout << "sizeof( array ) = " << sizeof( array ) << std::endl;
std::cout << "sizeof( array + 0 ) = " << sizeof( array + 0 ) << std::endl;
}
程序输出为
sizeof( array ) = 40
sizeof( array + 0 ) = 8
在第一个输出语句中,数组指示符用作sizeof
运算符的操作数。所以没有从类型 double[5]
到 double *
的转换.
在第二个输出语句中,数组指示符用于表达式array + 0
而表达式又用作sizeof
运算符的操作数。在这种情况下,可以从double[5]
类型转换为double *
类型。
因为数组衰减到它声明的类型的指针,该指针指向数组包含的第一个元素。
根据Bjarne Stroustrup的书 - 编程:原理与实践 使用数组C++名称是指数组的所有枚举,例如:
char ar[10];
sizeof(ar) // 10
但是,数组的名称变成了("衰减到"(一个指针 丝毫借口。
所以这就是为什么我们可以拥有: char* c = ar
.现在c
初始化为 &c[0]
(即数组的第一个元素(,使sizeof(c)
4(取决于实现。
至于变量,它只是一个元素。
- OpenMP:并行更新数组总是需要减少数组吗
- 具有随机数的二维数组不会更改
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 指针的 C++ 动态数组 - 何时需要使用它?
- C++ - 块不移动,我的数组不起作用
- 0 的 2D 数组 不相关循环的破坏逻辑 - C++
- 为什么数组不打印第一个元素?
- C++字符数组不接受超过 4 个字符的输入
- 如何从字符数组(不是字符串数组)中删除符号
- C++指针数组不会接受更多值
- 字符数组不起作用:C++
- 为什么从函数返回数组时需要将数组声明为静态数组.(C++)
- 数组不保存初始化值
- Arduino 数组不命名类型
- 在 Qt 中解析嵌套的 JSON 时出现意外结果(数组不存在)
- 数组不会存储超出第一个空间的范围
- 具有构造函数的新对象数组,需要在C++中设置参数
- 为什么数组中需要常量大小
- 为什么结构数组不需要成员资格运算符
- 需要帮助来弄清楚为什么我的数组不保存输入