运行环境:cc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 64位机器
首先看一段代码
{
const char *p1 = "hello";
const char *p2 = "hello";
cout << &p2 - &p1 << endl;
return 0;
}
因为p1和p2是连续的两个栈上的变量,它们的地址是相邻的。
p2的地址减去p1的地址,其值等于两个地址偏移了多少个元素,或是间隔多少个同类型个数。
因此上面运行结果为1。
但是发现了一个问题:
我们再看一段代码证明:
{
const char *p1 = "h1";
const char *p2 = "h2";
const char *p3 = "h3";
const char *p4 = "h4";
/*
cout << &p1 << endl;
cout << &p2 << endl;
cout << &p3 << endl;
cout << &p4 << endl;
*/
cout << &p4 - &p1 << endl;
return 0;
}
我的本意是想得到3,但是,结果却仍然是1。只有打开注释部分,结果才是3。不确定是否跟编译器有关,还是C++本身是这样设计的。
为了方便起见(跳过这个问题)我们用数组继续做测试:
{
int ptr[3]{1, 2, 3};
cout << ptr << endl;
cout << &ptr[0] << endl;
cout << &ptr << endl << endl;
cout << ptr + 1 << endl;
cout << &ptr[1] << endl;
cout << &ptr[0] + 1 << endl << endl;
cout << &ptr + 1 << endl;
return 0;
}
我们应该知道:
- int类型长度为4字节
- 数组名为首元素地址,数组名+N等于第N+1个元素的地址(就是下标后移N位)
- 对数组名取地址取的才是整个数组的地址
运行结果:
0x7fffb278988c
0x7fffb278988c
0x7fffb278988c
0x7fffb2789890
0x7fffb2789890
0x7fffb2789890
0x7fffb2789898