假设这样一个情景,在羊村每一座房子它们的间距相等都是定值,有羊村1号、羊村2号、羊村3号等等.....我们只需要找到每只羊的家的位置就能找到它们。
我们通过羊村中每个房子来模仿计算机中的存储单元。
现在引入变量地址的概念,我们在编译器中定义一个变量,计算机就会开辟一块内村用来存放定义的变量。
羊村中每只羊的身材不尽相同,体型大的需要更大的室内面积。计算机也是如此,每个数据类型需要的内存空间也不尽相同,我们在定义变量时也定义了它的数据类型,这就一定程度上归功了它开辟的内村大小。
废话结束,上代码:
int main() {
int a = 2;//1
int* p = &a;//2
cout<<"a占字节数:"<<sizeof(a)<<endl;//3
cout<<"P指向的地址为:"<<p<<endl;//4
cout<<"p的地址为"<<&p<<endl;//5
cout<<"a的地址为:"<<&a<<endl;//6
cout<<"做差:"<<(int*)(&a)-(int*)(&p)<<endl;//7
cout<<"p值为:"<<(*p)<<endl;//8
cout<<"p的字节数为:"<<sizeof(p)<<endl;//9
cout<<"*p的字节数为:"<<sizeof(*p)<<endl;//10
}
第一行,我们定义了一个数据类型为int(整形)的变量a。
在第二行中,我们定义了一个int类型的指针,并令它指向a,这是充满C语言风格的思想,这种思想的写法是int *p,但是也有int* p的写法,这种写法是充满着C++语言风格的写法,这两种写法都是正确的。(注意:一定要避免指针没有指向任何变量、数组、字符串等,这是十分危险的)
第三行,对于sizeof(),这是计算字节内存容量的度量函数,就不做展开了,对于结果而言,这是很容易得到的,int类型的变量,在我这台机器上所占的字节数为4。
对于第四行、第五行,大家看了我发的结果可能会疑惑,两个取地址为什么输出结果不一样,这是因为指针也是变量,它也有地址,指针指向的地址和指针本身的地址是不相同的,我们在第7行中将它们做了差,关于地址做差和强制类型转换会在指针探幽后续中详细阐明。有一定编程基础的同学通过16进制的计算可以得出2C与20之间做差为12,那么3是怎么来的呢? 12/4=3!我想我不必解释这个了。
最后值得注意的是,在64位计算机中,地址编号是8字节。这也是为什么sizeof(p)等于8的原因了!
大家可以先想想预期的输出,再结合最终输出结果,我认为能读懂,理解这段小代码,那么对于变量地址,和指针的理解就算迈出了第一步。
有关指针数组和指针与字符串的结合会在指针探幽后续中介绍!