#include<stdio.h>int main(){ int a; int *p; PRintf("指针p本身的地址:%d/n",&p); printf("变量a的地址:%d/n",&a); a=1; p=&a; printf("指针变量p指向变量a的地址:%d/n",p); printf("指针变量p指向变量a的地址,其地址的值:%d/n",*p); return 0;}为了便于理解,我假设指针p本身的地址为pppp,变量a的地址为aaaa。用pppp,aaaa表示各自地址,虽然地址书写不合法,但是便于理解,只能这么干了)输出结果:指针p本身的地址:pppp变量a的地址:aaaa指针变量p指向变量a的地址:aaaa指针变量p指向变量a的地址,其地址的值:1分析结果:int a;//系统为变量a分配的首地址为aaaa指针变量p定义时,本身占有内存,系统为其分配内存地址pppp.当p=&a(变量a的地址赋值给指针变量p,也就是说指针变量p指向了变量a的地址)时,指针变量里面存放的就是aaaa地址.但是指针p本身的地址仍然是pppp.--------------------------------------------------------------------------------------------------------------------------------------------
变量a的值,变量a的地址,指针变量p,指针的关系:
指针变量相当于学校这个整体,指针相当于学校的地址。
变量a相当于小王这个人,变量a的值是小王的书本。
变量a的地址是小王的家庭地址。
这样可以说:
学校记录了小王的家庭地址。
如果有人想找小王借书,可以通过访问学校的地址,来寻找学校已经存进去的小王的家庭地址,然后可以
间接访问小王的家庭地址,可以借到小王家地址里面的书本。
-----------------------------------------------------------------------------------------------------------------------------------------------p,*p,&p的概念:p:p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用cout<<p来输出的话,它将是一个16进制数。*p:表示此指针指向的内存地址中存放的内容,一般是一个和指针类型一致的变量或者常量。&p:&p取指针p的地址,&是取地址运算符.定义指针变量p,系统就为其开辟内存,分配指针本身的地址。如果定义一般变量a,那么&a就是系统为其开辟一个内存,分配变量a的地址。------------------------------------------------------------------------------------------------------------------------------------------------指针和常量的问题:#include<stdio.h>int main(){int a;int *p=(int *)5;//指针变量存储的是常量5a=1;printf("指针变量p指向某个地址:%d/n",p);return 0;}输出结果:指针变量p指向某个地址:5
分析结果:输出结果中的指针变量p指向了常量5,因为指针变量把5这个当做了某个地址来存进去。
至于为什么要用(int *)5,下面会讲到。
-------------------------------------------------------------------------------------------------------------------------------------------------
对于常量是否占有内存,网友们对此也有些不同的观点。我认为有些常量(但有些常量不占有内存)是占有内存的。占有内存的常量:字符串常量(字符串常量会放在一个专用的字符串池内存块中,或者放在静态数据区中。),const常量(不是真正意义上的常量,要占用内存空间)。不占有内存的常量:字符型常量,整型常量(浮点型常量占有内存)。
------------------------------------------------------------------------------------------------------------------------------------------------
不占有内存的常量,它存在于常量存储区这个特殊的存储区里面。常量存储区是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)。
还有一种关于一些常量不占有内存的说法:这类不占有内存的常量类似于汇编语言的立即数。读到一条指令,带有立即数,把立即数放到寄存器。对于字符型常量(例如'a')和整型常量(例如1,2,3),他们属于立即数,写在代码里面的。他们存放在寄存器上的没有所谓的内存和地址。因为寄存器和内存地址是两码事,没必要在内存上存放这类不占有内存的数值。字符串常量和字符型常量取地址的区别:C/C++只可以用指针取字符串常量的地址,该类被认为是左值,而其他的字面值常量(literal constant),则被认为是右值,不允许取地址。至于const常量,只能说是一个const修饰的只读变量,和字面值常量不同。------------------------------------------------------------------------------------------------------------------------------------------------如果把int *p=(int *)5;改成int *p=5或者int *p=&5就会报错.在这里int *p=&5,有些网友就误以为常量是没有地址的,也就是没有内存的。我认为这种说法是错误的。上面我已经讲过,有些常量存在于特殊的常量存储区,或者存在于寄存器中,。常量是不能取到地址的,就算取得到也是没有意义的。int *p=5报错,因为指针变量和常量两者的数据类型不一样。一个是int*,一个是const int.
所以int *p=(int *)5;是把普通的常量强制转换成返回整型数据的指针。
新闻热点
疑难解答