为什么在单个变量上我需要指定内存地址,而在数组上我不需要它?

Why on a single variable I need to specify the memory address while on array I don't need it?

本文关键字:数组 不需要 地址 变量 单个 为什么 内存      更新时间:2023-10-16

简单的例子:

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(取决于实现。

至于变量,它只是一个元素。