菜鸟教程中,对于C++指针,给出了一段简短的代码:
一、存储空间
int main ()
{
int var1;
char var2[10];
cout << "var1 变量的地址: ";
cout << &var1 << endl;
cout << "var2 变量的地址: ";
cout << &var2 << endl;
return 0;
}
var1是整数类型的变量,被分配了4个字节的空间存储;var2是字符类型数组,包含10个连续元素,每个元素占1字节。
现在只分配了对应大小的内存空间,由于未初始化,所以现在现在分配的存储内容是随机的。
输出的结果是
var1 变量的地址: 0xbfebd5c0
var2 变量的地址: 0xbfebd5b6
内存是十六进制,c0-b6 = 10
结合栈的知识:
假设var1存的四个字节的内存是1234,那么进栈时是4先入栈,地址从高到低,对应:
4 c3
3 c2
2 c1
1 c0 <---var1首地址
假设var2存的十个字节为1-10
那么接着压入就是
10 bf
9 be
.
.
1 b6 <---var2首地址
因此,地址之差就是var2内存10。在了解了存储空间后,进行到指针内容。
二、指针
同样菜鸟教程也给到了一个简短的代码
int main ()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl;
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl;
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0;
}
图示如下:
0x00
0x00
0x00
0x14 <--c0首地址
占了四个字节
代码里使用的是int ip,但是指针变量只存一个地址,也就是四个字节最后入栈的首地址。在输出ip时,只会读出c0
在输出ip时,告诉编译器请从 ip 存储的地址开始,连续读取 sizeof(int) = 4 个字节,并按整数规则解释,最后读出20
0x00
0x00
0x00
0x14 <--c0首地址
如果定义ip时,使用的是char ip,
注意此时,ip = &var; 应该把var强制字符化ip = (char)&var
此时,输出ip时会读出c0;输出ip会读出0x14,还是20
但注意,输出使用的命令是cout,cout 遇到 char 类型时,会把它当作字符输出,而不是数字。注意看,此时的ip对应的c0与*ip对应的20都是不可打印的字符,所以最终输出都是[方框]