第六章 善于使用指针与引用
1.变量与指针
变量的指针就是变量的地址。用来存储变量地址的变量就是指针变量。(概念不同)
2.定义指针变量
基类型 * 指针变量名;(指针变量的的基类型就是该指针变量指向变量的类型)
用“*”表示该变量是指针变量
*定义指针变量时必须指定基类型;
*一个变量的指针包括两个方面的含义:1以存储单元编号的表示的地址,2其指向存储单元的数据类型
*不能用一个整数给一个指针赋值!
*指针只能指向同一类型的变量
3.&(取址符)*(间接访问运算符)
4.用指针作函数参数
函数声明部分:
函数类型 函数名(基类型 * 形参指针变量名...);
这里的“*”表示在声明该形参变量是指针
函数调用部分:
函数名(实参指针变量名...);
*由于虚实结合是采取单向的“值传递”的方式,只能从实参向形参传递,形参值的改变无法传回给实参;使用指针变量,实现了通过调用函数是使变量值发生变化,在主调函数中使用这些改变了的值的目的。
*不能试图通过改变形参指针变量的值而使实参指针变量的值改变。因为,调用函数是不会改变实参指针变量的值,但是可以改变实参指针变量所指向的值。
5.数组与指针
(1)指向数组元素的指针:即指向数组里的一个元素的指针变量
如果p指向数组里的一个元素,p+1表示指向下一个元素(实际为p+1*(数组元素所占的字节数))
由此多出访问数组元素的方法指针法:*(p+i)//下标法:a[i](指针的使用使程序高效)
*对于指向整型的指针,指向数组以后的内存单元,编译器不报错,使用时请小心
(2)用指针变量作函数形参接收数组地址
数组名表示数组首元素的地址。用数组名做函数的参数,传递的是数组首元素的地址。
C++编译系统对形参数组名一律作为指针变量来处理。实际上,在函数调用时并不存在一个占有存储空间的形参数组,只有指针变量
函数声明部分:
函数类型 函数名 (数组类型 形参数组名[]...);
这里形参数组名后的“[]”表示传递一个数组名
函数调用部分:
函数名(数组名...);//这里已经不需要[]
6.字符串与指针
字符数组的数组名和字符串变量的变量名都表示首字母的地址。
7.函数与指针(函数入口地址)
定义函数指针的一般形式:
函数类型 (*指针变量名) (函数参数列表);
//第一个括号声明该变量是一个指针变,第二个括号表示该指针变量指向函数
使用:指针变量名 = 函数名;指针变量名(函数参数列表);
8.返回指针的函数(指针函数)
定义形式:
类型名 * 函数名(参数列表);
//()的优先级高于 *
//函数名先与参数列表结合成函数,再与*结合表示返回值为指针类型
9.指针数组(以指针为元素的数组)
一维定义格式:
类型名 *数组名[数组长度];
// [ ] 的优先级高于 *,因此先结合成数组形式,再表示指针数组
***类型名 (*指针变量名)[ ]表示:指向一维数组的指针变量
10.指向指针的指针(指向指针)
类型名 *(*指针变量名); 或者 类型名 **指针变量名;
11.const与 指针
(1)指向常量的指针变量:const 类型名 *指针变量名;
//相当于(const 类型名*)指针变量名;
*用指向常量的指针变量只是限制了通过指针变量改变它指向的对象的值
*可以通过直接访问改变所指向的对象的值;
(2)常指针:类型名 *const 指针变量名 = 所指向对象名;
*常指针的指针值不能变;
*必须在定义时初始化,指定起指向;
*指针变量的所知对象的值可以改变
(3)指向常量的常指针:const 基本类型名 *const 指针变量名 = 所指向对象名;
“const在前指常量,const在后常指针”(const相对*的前后)
12.void 指针(指向空型的指针)空指针
这是一种过度型指针,必须转换为明确的类型数据,才能访问实际存在的数据。
13.指针的小结
*P=NULL表示指针不指向任何对象
*两个指针变量相减的意义:相差元素的个数
*对于不同基类类型的指针赋值的情况,要进行强制转换
14.引用(给变量起一个别名 &)
&表示引用声明符,仅在类型名后面生效,其他情况为取址符;
*引用不是独立的数据类型。只有声明,没有定义
*声明的同时进行初始化,之后不可在用于引用另外一个对象
*不存在引用数组,引用的引用,引用的指针
*可以取引用的地址
*引用作为参数:
函数声明部分:
函数类型 函数名(基类型 & 形参变量名...);
函数调用部分:
函数名(实参变量名...);
*引用的使用简化了指针的使用
个人笔记,仅供参考,欢迎指教!
未经允许,请勿转载!