前面鸡啄米讲的是数组,从这一讲开始讲指针的概念及相关知识。学过C语言的应该对指针不陌生了,但是指针在软件开发中确实是个很重要的元素,建议大家都再好好看看吧。
C++从C语言继承了指针的概念。指针继续为C++软件开发人员提供编程的方便。可能很多人认为C和C++有指针太麻烦了,而且很容易因为指针的使用出现非法地址访问的问题,但是鸡啄米想说的是,指针给我们带来的更多的是对数据的操作和组织灵活和方便,至于容易出问题这方面,只要大家细心点,积累些经验就会很好的利用指针了。编程入门的时候大家先学好打好基础吧。
1.内存空间如何访问
我们使用的内存的基本存储单位是字节,一个字节由8个二进制位组成。每个字节都会按照一定的规则编号,这个编号就是该字节存储单元的地址。计算机就是利用这种编号也就是字节存储单元的地址来定位内存进行数据读写的。
我们在访问内存中的数据时,有两种方式,一种是通过变量名,一种是通过地址。我们声明的每个变量都是占据内存空间的,前面也讲到了,char型占1个字节,float型占4个字节。而内存空间的分配是在什么时候呢?全局变量、static静态变量等静态生存期变量在程序开始运行之前就被分配了内存空间,动态生存期的变量是在变量声明时分配内存空间的,然后变量名也代表了分配的空间。但是有时候没有变量名可用或者很不方便,例如,在动态内存分配时就没有变量名可以用,这个鸡啄米会在后面讲;调用函数传递很多参数时,就不可能一个一个的通过变量名传递,而是需要用地址传递。
鸡啄米给大家形象的说下存储地址:每个学生住一个宿舍,学生相当于变量,宿舍相当于存储单元,我们可以用学生的名字来找到他,这就是变量名的方式,也可以通过宿舍号找到他,这就是通过地址访问的方式。
C++中的指针类型就是用来存放上面讲的内存单元地址的变量类型。
2.指针变量的声明
指针跟int等一样也是一种数据类型,指针类型的变量就是指针变量,指针变量存放的是内存单元的地址。
以前我们都是通过变量名访问变量,是一种直接的方式,而通过指针访问变量是间接的。例如,张三住在哪个宿舍不知道,可以在宿舍名单上第一行看到,那么宿舍名单的第一行就是指针变量,第一行上写的内容就是指针变量中存放的内容,而张三就是指针所指向的对象值。
指针同样是先声明再使用,声明的形式是:数据类型 *标识符;。
我们注意到中间有个“*”,它表示声明的是一个指针变量。“*”前面的“数据类型”表示的是指针所指向的变量或对象的类型,可以是任意类型,也就是说在声明的该指针所指向的内存单元中可以存放此数据类型的数据。而指针本身在32位系统上是unsigned long类型的,在64位系统上是unsigned _int64类型的,这里可能大家糊涂了,怎么又出来一个类型?结合上面张三的例子跟大家解释下,声明中的“数据类型”指定的是张三的类型,指针本身的类型指的是宿舍名单第一行的类型,清楚了吧。
例如,int *p;声明了一个指针变量p,它指向int类型的数据,用来存放int型数据的地址。
3.地址相关运算--“*”和“&”
“*”和“&”可能大家已经见过了,作为二元操作符时,“*”表示相乘,“&”表示位运算里的与运算。在上面的指针变量的声明中,“*”用来表示声明的是一个指针变量。“&”在变量声明语句中出现在变量名左边时表示声明的是引用。而现在鸡啄米要跟大家讲的是它们的另外一种用法--地址运算。
“*”在地址运算中叫做指针运算符,表示指针指向的变量的值,是一元操作符,例如,如果p是一个int型的指针,则*p表示p指向的int型数据的值。“&”在地址运算中叫做取地址运算符,也是一个一元操作符,用来获取一个对象的地址,例如,有一个变量i,&i就表示变量i的存储单元地址。
鸡啄米提醒大家注意一下“*”和“&”出现在声明语句中和在执行语句中意义是不一样的。
“*”出现在声明语句中被声明的变量名之前时,表示声明的是指针,例如,int *p;。“*”出现在声明语句的初值表达式中或者执行语句中时,表示指针指向的对象的内容,例如,int i=*p; cout<<*p;。“&”出现在声明语句中被声明的变量名之前时,表示声明的是引用,例如,int &rf;。“&”出现在声明语句的初值表达式中或者执行语句中时,表示取对象的地址,例如:
int x;
int y;
int *p1=&x;
int *p2;
p2=&y;
鸡啄米今天讲了指针的声明及“*”和“&”的用法,属于指针方面最基础的内容,希望大家掌握好。有什么问题在鸡啄米博客留言讨论。谢谢大家的关注。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。