&y [0] ==&x.a的值是多少?

Yve*_*ann 2 c++ arrays struct

从家庭作业中获得了这段代码。我应该弄清楚的值是多少&y[0] == &x.a。顺便说一句,抱歉,格式化不正确,我已尽力了。

所以我的方法是 y[0] = 1&y[0]装置的地址1,这是0在阵列中?

x.a最让我困惑。它是否表示结构x的元素a?那x.a == 1呢 而且它的地址也将是0?因此,布尔值将作为出来true(1),因为0 == 0。但是解决方案说这是错误的,但是为什么呢?

struct my_struct {
    int a;
    double b;
    int c; 
};
my_struct x = { 1, 2, 3 }; 
int y[] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

我期望输出,1但显然是0,但是为什么呢?

Bar*_*icz 7

&y [0]表示地址1,在数组中为0

差不多,但是不完全是。地址运算符给您的地址是绝对值,而不是相对于“容器”的地址。所以&y[0]实际上是相同的y,并且&x.a有效的一样&x

y是一个可以转换为指向第一个元素的指针的值。这必须并且将与(在数字上)&x占据内存的不同部分不同。

| x.a | <- &x points here
| x.b |
| x.c |
| y[0]| <- y points here
| y[1]|
[ y[2]| 
Run Code Online (Sandbox Code Playgroud)

以上所有内容都忽略了这些指针可能具有不同类型的事实。这对编译器在检查代码正确性时很重要,但由于所有地址实际上都变成了数值,因此最终被丢弃。


Vla*_*cow 5

这个表达

&y[0] == &x.a
Run Code Online (Sandbox Code Playgroud)

比较两个不同对象的地址(指针)。第一个属于数组y(即数组y[0]的第一个元素),而第二个属于my_struct类型的对象(a是object的数据成员x)。

对象占用不同程度的内存。

因此,表达式得出false,即不同对象的地址彼此不相等。

当比较两个不同的指针(即不同类型的指针)产生的值时,我可以提供一个示例。

考虑以下示例

struct my_struct {
    int a;
    double b;
    int c; 
};
my_struct x = { 1, 2, 3 }; 
Run Code Online (Sandbox Code Playgroud)

然后( void * )&x == ( void * )&x.a计算为1

注意:强制转换是必需的,因为操作数具有不同的类型,并且没有从一种类型到另一种类型的隐式转换。

再举一个例子

#include <iostream>
#include <iomanip>

int main()
{
    int y[] = { 1, 2, 3 };

    std::cout << std::boolalpha 
              << ( ( ( void * )&y == ( void * )y ) && ( ( void * )&y == ( void * )&y[0] ) && ( y == &y[0] ) ) 
              <<'\n';
}
Run Code Online (Sandbox Code Playgroud)

程序输出为

true
Run Code Online (Sandbox Code Playgroud)

这三个表达式&yy&y[0]具有相同的值(地址)。(在表达式中使用的具有极少数例外的数组将转换为指向其第一个元素的指针。)