- 防止地址传递时更改实参地址内容:当地址作为形参时,在定义形参时使用const关键字,可以防止错误的改变形参所传递的地址内存储的内容;且并不要求实参地址中的数据为常量 。
- 需要数组作为函数形参时,形参的两种定义方式:a)定义两个形参,一个用于数组名/地址的 传递,一个用于数组元素个数;b)定义两个指针类型的形参,一个用于传递数组首元素地址,一个用于传递数组尾元素地址(指向的是数组最后一个元素后面的指针,而不是指向数组的最后一个元素)。
- Const位置与指针
Const表示将该关键字后面所定义的设为常量,不允许修改该常量的值,当const的位置不同时,其表示也不相同。
例:a、const int *pt=&ages;表示*pt是一个常量,不能通过改变*pt的值来修改ages的值,但可以对pt进行赋值即可以将另一个地址重新赋给pt;
b、int * const pt=&ages;表示pt是一个常量,不能将其重新赋值,只能指向ages,但可以通过*pt来修改ages的值。
C、const int * const pt=&ages;表示*pt和pt都是常量,pt只能指向ages且不能通过*pt来修改ages的值。
4、递归
如果函数有涉及到变量,每次调用都会建立一个新的变量,即使变量名字相同,但是不是同一个变量,地址不同,但是同一次调用使用的是同一个变量(第二次调用前后第二次调用结束返回第一次调用时)
5、指针类型:
1)指向普通数据类型的指针:(或指向数值元素) int *p p=&a(a为普通变量);
2)指向一维普通数据类型数组的指针: int (*p)[m] ;
3)指向普通数据的指针数组:所指向的数据的类型 *p[ 数组长度],p是数组名,用于存放指针;
4)指向返回值为普通数据的函数的指针变量: int(*p)(int,int…) ,将函数原型中的函数名改为*指针名即可,此时p=函数名,调用:p(实参列表)等价于 函数名(实参列表);
5)返回指针值的函数:返回指针所指得数据类型 *函数名(形参列表),调用时返回的指针类型要与主调函数保持一致;
6)指向返回指针的函数的指针:返回指针所指得数据类型 *(*p)(形参列表),将函数原型中的函数名变为*指针名即可,p与函数名等价;
7)指向返回值为函数的指针数组:返回指针所指得数据类型 *(*ary[n]))(形参列表);注意:①、6)中的p为一级指针其与函数名等价,而7)中的ary实际为二级指针数组名为地址(代表其中的一级指针),而其又存放了指针值,总共就为二级指针。即有:
const double *(**pd)(double* ar, int n)=p;(错误的 ,定义的二级指针,p为一级)
const double *(**pd)(double* ar, int n)=ary;(正确,ary为二级指针,此时pd等价于ary,也即可用pd[0]代表ary中的第一个元素,即可用pd[0](形参列表)调用ary[0]代表的函数)
②、[ ]的优先级高于*,即有:
const double *(*pd[3])(double* ar, int n):表示pd是一个元素个数为3的指针数组,pd先与[]结合表示为一个数组,在与*结合表示为一个指针数组
const double *((*pd)[3])(double* ar, int n);表示pd是一个指向元素个数为3的数组的指针。