指针部分释疑
一、指针的实质
在学习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的值5和a的地址0x********(*是十六进制数,自己写个程序试下)。
好,回来接着上面的话题,说指针——指针是什么?答:指针就是地址!!!
有点晕,刚刚才说过指针是一种数据类型,这么一会儿就又说指针是地址,什么意思啊……
重新来过:
int a = 5;
我们说我们定义了一个整型变量a,里面存放的数据必须是整型数据,ok?
int *p = &a;
是说我们定义了一个指针变量p,里面存放的是变量a的地址,这个还有问题吗?还有?哦,忘了说了,定义里面的“*”是干嘛的?定义变量的时候在标识符前面加上一个“*”就是说明定义的是一个指针变量!还有?“int”是干什么的?哦…还是说说“*”吧——
“*”在C中也是一个运算符,叫做“指针运算符”,也叫做“间接取值运算符”,前者比较伪善,后者相对实惠,对,就是间接取值的运算符,接下来我们说一下怎么使用a和p吧:
若要想访问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;
这就不匹配了,可能有人问,系统遇到这种情况会怎么样呢?呵呵,我也不知道,打开你的TC或VC试一下不就知道了嘛……
总结一下:指针是一种数据类型,其有两层含义,一是静态的,即地址的含义,另一是动态的,即指向的含义,使用的时候我们经常用到两个运算符“*”和“&”,明白两个运算符的含义即可。由此,既然指针是一种数据类型,就可以定义所谓的指针变量,变量的应用大家都不会陌生是吧!(未完待续)
Ps:在使用指针变量的时候,一定要注意指针变量的指向问题,如果指针变量没有指向的话,很重要的原则就是不能使用之,切记!例如:
int *p;
*p = 20; //error,20赋到哪里去呢?
cout<<*p; //这个更离谱,你想输出什么?
分享到:
相关推荐
指针释疑(c语言初学者) 指针 初学 释疑 c
最全面的C指针示例分析,看完这个文档,指针基本被你征服了(截取一小部分): 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针...
很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++ 项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。 想必这种误解的根源在于国内某著名的C程序设计教程。如果...
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区...
鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载Yangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong ...
彻底搞定C指针-指向另一指针的指针 <br>摘自博客文章
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int...
彻底理解指针,指针数组和数组指针,指针函数和函数指针.doc
因为优先级的关系,parr先与[]结合,说明parr是一个数组,然后再与*结合说明数组parr的元素是指向整型数据的指针。元素分别是parr[0],parr[1]...parr[4],相当于定义了5个整形指针变量。所以parr就是数组元素是指针的...
指针数组是一个数组,其中的每个元素都是一个指针。指针数组可以用来存储多个指向不同对象的指针。定义指针数组的方式是在类型标识符后面加上一个星号()和一个数组大小的方括号[]。例如,int ptr_array[5]表示一个...
c语言:我眼中的指针(教你彻底认识指针) 我眼中的指针 c语言:我眼中的指针(教你彻底认识指针)
2.在一个表达式里,*p[] 将被求值为一个int 整数,所以p[]必须指向一个int 整数,而p是一个int 指针数组。指针数组p里的5个元素(5个)指针被初始化为分别指向数组a里的5个元素。 3.**pp代表着一个int整数,所以*pp...
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: (1)int *ptr; //指针的类型是int* (2)char *ptr; //...
c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针...
this指针是一个隐含于每一个成员函数中的特殊指针。它是一个指向正在被该成员函数操作的对象,也就是要操作该成员函数的对象。 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员...
c语言指针c语言学习内容:指针.zipc语言学习内容:指针.zipc语言学习内容:指针.zipc语言学习内容:指针.zipc语言学习内容:指针.zipc语言学习内容:指针.zipc语言学习内容:指针.zipc语言学习内容:指针.zip
C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针
模拟mac系统的鼠标指针!样式较为精美,
真田由希鼠标指针是一款可爱风格的鼠标指针,真田由希是动漫《钓球》中的主角,不过本款指针同人款是蓝色头发的,看起来更加个性,快来下载体验吧! 鼠标指针几个安装方法: 1、压缩目标下有一个setup.inf,然后右击...