首页 > 学院 > 开发设计 > 正文

指针的深入理解(1)

2019-11-10 17:24:09
字体:
来源:转载
供稿:网友
       关于指针的知识,我整理了笔记。同时参考了《你不再害怕指针》这篇优秀的文章。从最简单最基本的指针开始,慢慢深入到复杂。在讲解指针之前,我是先了解了c/c++中的内存管理知识。这样有助于加强对指针的知识的深入的理解。关于内存管理,访问博客:http://blog.csdn.net/chen1083376511/article/details/54930191----------------------------------------------------------------------------------------------------------------------------------------------概念:指针:一块内存的地址.指针变量:用来保存某变量的地址的变量两者关系:指针变量里面存的是某变量的地址一般变量和指针变量的区别:一般变量:存放的是数据本身,访问方式称为直接访问方式。指针变量:存放的是数据的地址,访问方式称为间接访问方式。-----------------------------------------------------------------------------------------------------------------------------------------------关于网友们对指针本身是否存在一个地址的问题,颇有争议。为了解决这个问题,我在vc6.0环境下编译运行以下段代码:
#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;是把普通的常量强制转换成返回整型数据的指针。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表