繁体   English   中英

数组的地址是否等于C ++中第一个元素的地址?

[英]Does the address of the array equal to that of its first element in C++?

由于WG14 / N1570中的以下句子,这可以在C中得到保证:

6.2.5 / 20 ...数组类型描述了具有特定成员对象类型的连续分配的非空对象集,称为元素类型。

但是在WG21 / N4527中,即在C ++中,相应的句子变为

8.3.4 / 1 ...数组类型的对象包含一个类型为T的连续分配的非空N个子对象集。

而“describe”这个词改为“contains”,这不能保证数组的地址等于第一个元素的地址。 这种改变是故意的还是无意的? 如果是故意的,那么数组的地址是否等于C ++中第一个元素的地址? 如果确实如此,C ++标准中的哪一段可以保证这一点?

在C ++中,它由4.2 / 1数组到指针转换[conv.array]保证,(由我粗体)

可以将“数组的NT”或“未知的T的数组”类型的左值或右值转换为“指向T的指针”的prvalue。 结果是指向数组的第一个元素的指针。

这意味着如果你想在C ++中获取数组的地址,你会得到一个指向数组第一个元素的指针。

int a[10];
int* p1 = a;     // take the address of array
int* p2 = &a[0]; // take the address of the first element of the array

该标准保证p1p2指向相同的地址。

我认为它没有在任何地方明确说明,但我认为它遵循5.3.3 Sizeof

n个元素数组的大小是元素大小的n倍

唯一可以存储在数组起始地址的是数组的第一个元素。

这取决于你所说的“阵列的地址”。

如果你问一个数组,当转换为指针时,给出的结果等于其第一个元素的地址,那么答案是肯定的。 例如;

#include <iostream>

void func(int *x, int *y)
{
     std::cout << "x and y are ";
     if (p != q) std::cout << "NOT ";
     std::cout << " equal\n";
}

int main()
{
    int x[2];

    func(x, &x[0]);
}

这将始终报告两个指针是相等的。 songyuanyao解释了原因。

但是, x实际上并不是指向数组的指针(在此代码中也不会转换为1)。 如果你将main()func()调用更改为

  func(&x, &x[0]);

然后该声明甚至不会编译。 原因是&x (数组x的地址)不是指向int的指针 - 它是指向两个int数组的指针,并且不能隐式转换为指向int的指针。

但是,该值将是相同的,可以通过运行此代码来证明。

#include <iostream>

void func2(void *x, void *y)
{
     std::cout << "x and y are ";
     if (p != q) std::cout << "NOT ";
     std::cout << " equal\n";
}

int main()
{
    int x[2];

    func2(&x, &x[0]);     // both pointers implicitly converted to void * when calling func2()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM