指针部分疑点解释

来源:互联网 发布:山东工商学院网络课 编辑:程序博客网 时间:2024/06/06 02:40

从概念上来讲,指针其实是一种数据类型。

我们从最简单的数据讲起;

int i = 5;

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

执行cout<<i<<&i;

就可以得到i的值和一串0xXXXXXXXX的数字,后面的数字就是地址。

接下来说指针。

int i = 5;

int *p = &i;

int *就是对指针的定义,“*“叫做指针运算符,也可以叫做间接取值运算符。

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

a = 20;

cout<<a;

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

*p = 20;

cout<<*p;

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

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

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

 

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

int *p;

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

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





0 0
原创粉丝点击