不接触变量 C++ 的 cout 值
cout value without touching variable C++
当我运行程序时,它打印变量a的值。但是当我评论行 'cout<<&b<<endl<<&a<<endl;
' 时,它会打印一个垃圾值。
背后的解释是什么?
#include<iostream>
using namespace std;
int main()
{
int a = 9;
int b = 10;
int *pb = &b;
cout<<&b<<endl<<&a<<endl;
cout<<*(pb+1);
}
你屏幕上的垃圾值是 a 和 b 的地址。你应该试试这个:
int *pb = &b;
有两个地方可以获得 "gibberish" 值,但实际上只有一个地方是打印垃圾的地方。
此cout << &b << endl << &a << endl;
将使用address-of-operator 打印a
和b
的地址。您看到的不是 a
和 b
的值,而是它们存储在内存中的位置。这些是十六进制值,每次您 运行 程序时它们可能会改变。这是预期的行为。
然后是这个构造:*(pb + 1)
,它实际上调用了未定义的行为。但这是为什么呢?首先 pb
是一个指针,所以它存储一个地址,更具体地说是存储 b
的内存地址。您可以直接打印出 pb
,这将导致与 cout << &b
相同的结果,或者使用取消引用运算符 *
取消引用它。所以这个 cout << *pb
会打印值而不是 pb
指向的地址(10
btw)。现在你的陈述有什么问题 - (pb + 1)
不是增加 pb
指向的值,而是增加存储在 pb
中的地址。所以它不再指向 b
的值,而是指向内存中某处的其他值。然后你取消引用这个地址并读取一些随机值 - 这是你的 "garbage" 值。
您可能想要增加 pb
指向的值。所以 cout << (*pb + 1)
将打印 11
(注意括号的位置)。但是 cout << b
仍然会导致 10
。如果你真的想改变 b 的值,你可以这样做:
int b = 10;
int *pb = &b;
*pb += 1;
cout << b;
现在 b
增加了 1 而没有触及 b
本身。
当您打印 a
和 b
的地址时,这会强制变量实际具有内存地址。否则,一个值可能会存储在寄存器中,或者如果从未使用过则根本不会存储。
编译器转换是一个很常见的优化
const int a = 9;
cout << a;
进入
cout << 9;
永远不要在任何地方存储 a
。
无论如何,没有规则说明变量存储在内存中的位置和顺序。这完全取决于编译器。所以你的假设&a == &b + 1
(或&b - 1
)是无效的。
当我运行程序时,它打印变量a的值。但是当我评论行 'cout<<&b<<endl<<&a<<endl;
' 时,它会打印一个垃圾值。
背后的解释是什么?
#include<iostream>
using namespace std;
int main()
{
int a = 9;
int b = 10;
int *pb = &b;
cout<<&b<<endl<<&a<<endl;
cout<<*(pb+1);
}
你屏幕上的垃圾值是 a 和 b 的地址。你应该试试这个:
int *pb = &b;
有两个地方可以获得 "gibberish" 值,但实际上只有一个地方是打印垃圾的地方。
此cout << &b << endl << &a << endl;
将使用address-of-operator 打印a
和b
的地址。您看到的不是 a
和 b
的值,而是它们存储在内存中的位置。这些是十六进制值,每次您 运行 程序时它们可能会改变。这是预期的行为。
然后是这个构造:*(pb + 1)
,它实际上调用了未定义的行为。但这是为什么呢?首先 pb
是一个指针,所以它存储一个地址,更具体地说是存储 b
的内存地址。您可以直接打印出 pb
,这将导致与 cout << &b
相同的结果,或者使用取消引用运算符 *
取消引用它。所以这个 cout << *pb
会打印值而不是 pb
指向的地址(10
btw)。现在你的陈述有什么问题 - (pb + 1)
不是增加 pb
指向的值,而是增加存储在 pb
中的地址。所以它不再指向 b
的值,而是指向内存中某处的其他值。然后你取消引用这个地址并读取一些随机值 - 这是你的 "garbage" 值。
您可能想要增加 pb
指向的值。所以 cout << (*pb + 1)
将打印 11
(注意括号的位置)。但是 cout << b
仍然会导致 10
。如果你真的想改变 b 的值,你可以这样做:
int b = 10;
int *pb = &b;
*pb += 1;
cout << b;
现在 b
增加了 1 而没有触及 b
本身。
当您打印 a
和 b
的地址时,这会强制变量实际具有内存地址。否则,一个值可能会存储在寄存器中,或者如果从未使用过则根本不会存储。
编译器转换是一个很常见的优化
const int a = 9;
cout << a;
进入
cout << 9;
永远不要在任何地方存储 a
。
无论如何,没有规则说明变量存储在内存中的位置和顺序。这完全取决于编译器。所以你的假设&a == &b + 1
(或&b - 1
)是无效的。