`
ribishuangba
  • 浏览: 291931 次
文章分类
社区版块
存档分类
最新评论

指针部分释疑之一:指针的实质

 
阅读更多

指针部分释疑

一、指针的实质

在学习C/C++过程中,可能大多数学习者对指针都会产生厌烦乃至抵触情绪。的确,对于初学者来讲,指针是不好理解,也不好用,好多学习者喜欢采用不用指针的方式来解决问题,即“能不用指针就不用指针”,甚至把指针当成了人人喊打的“goto”来看待……

而其实,指针也是冤枉的,大家看到的都是指针的缺点,却没有人意识到指针的好处。那么,指针到底是什么,怎么用,怎么样才能用好?

1.到底什么是指针

从概念上来讲,指针其实是一种数据类型,没错,就是一种数据类型而已,我们看看C中的数据类型的概念——Data Type,呵呵,这么简单?对,就这么简单,翻译过来不就是“数据的类型”吗!接上文,指针也是一种数据类型,那么这个故事告诉我们指针真的很简单!

让我们就从数据类型讲起,就说大家都熟悉的整型:

int a = 5;

上面这句很简单,大家都知道,定义了一个整型变量a,并初始化其值为5。究其根本,我们看看系统做了什么——编译的时候系统向内存申请了2个字节(C的讲法,C++4个字节)的空间,即16位,这两个字节是紧邻的,这只是第一步;第二步是在程序执行的时候,系统将整数常量5赋值给变量a,即将0000000000000101(二进制补码)赋值到刚才提及的两个字节中,那么系统是怎么通过a找到的这两个字节空间呢?很简单,系统是通过a(变量名称)找到了a所对应的空间,怎么找的呢?这就要提到一个运算符“&”,在C中叫做地址运算符,是一个单目运算符,将其加在变量之前,即“&a,就是a所对应的两个字节的空间编号,叫做什么呢?——“地址”(address),对,很形象!!!但地址又是什么?想想我们写信的时候在信封上写的东东,就很简单了不是吗!

这里有必要提一句,地址在系统中是采用十六进制数表示的,在C中可以写成例如0x54FE7AB5,但C又很小气的规定编程人员不能直接对地址进行操作(为什么就不再赘述了),那怎么办?就出来一个运算符“&”。所以,&a就是变量a在内存空间中申请的两个字节的低位字节的地址,如下例:

cout<<a<<&a;

执行后系统就会输出a的值5a的地址0x*********是十六进制数,自己写个程序试下)。

好,回来接着上面的话题,说指针——指针是什么?答:指针就是地址!!!

有点晕,刚刚才说过指针是一种数据类型,这么一会儿就又说指针是地址,什么意思啊……

重新来过:

int a = 5;

我们说我们定义了一个整型变量a,里面存放的数据必须是整型数据,ok

int *p = &a

是说我们定义了一个指针变量p,里面存放的是变量a的地址,这个还有问题吗?还有?哦,忘了说了,定义里面的“*”是干嘛的?定义变量的时候在标识符前面加上一个“*”就是说明定义的是一个指针变量!还有?“int”是干什么的?哦还是说说“*”吧——

*”在C中也是一个运算符,叫做“指针运算符”,也叫做“间接取值运算符”,前者比较伪善,后者相对实惠,对,就是间接取值的运算符,接下来我们说一下怎么使用ap吧:

若要想访问a的话,例如赋值和输出,直接写成:

a = 20;

cout<<a;

肯定没有问题,是吧?那么p呢?注意看:

*p = 20

cout<<*p;

这又是什么?*p?解释如下:

*为间接取值运算符,p为指针变量,放在一起就是“将p所指向的空间的内容取出来”,还不明白?再说一次“将p变量里面存放的地址拿出来,按照这个地址找到那个对应的空间,然后将空间中的内容取出来”,差不多了吧,但问题是,“那个空间”是多大的?系统怎么知道?或者说系统取值的时候,是按照字符型取值还是按照整型取值还是按照实型数取值呢?别急,再看p的定义“int *p = &a;”,看到没?在“*”前面有一个“int”,这就是说,我们定义了一个“指向整型变量的指针变量p”,如下例:

float a = 20.0;

int *p = &a;

这就不匹配了,可能有人问,系统遇到这种情况会怎么样呢?呵呵,我也不知道,打开你的TCVC试一下不就知道了嘛……

总结一下:指针是一种数据类型,其有两层含义,一是静态的,即地址的含义,另一是动态的,即指向的含义,使用的时候我们经常用到两个运算符“*”和“&”,明白两个运算符的含义即可。由此,既然指针是一种数据类型,就可以定义所谓的指针变量,变量的应用大家都不会陌生是吧!(未完待续)

Ps:在使用指针变量的时候,一定要注意指针变量的指向问题,如果指针变量没有指向的话,很重要的原则就是不能使用之,切记!例如:

int *p;

*p = 20; //error20赋到哪里去呢?

cout<<*p; //这个更离谱,你想输出什么?

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics