Chapter7 函数基础
函数参数和按值传递
C++ 通常按值传递参数,函数将数值参数赋给一个新的变量,这样将不会影响原来的数据。
用于接受传递值的变量被称为形参,传递给函数的值被称为实参。
但在传递数组时,是将数组的首地址的值赋给一个新的变量,实际修改了原始数据。
为了保护数组内容,可以在声明函数原型时使用关键字const,该声明意味着函数将数组是为只读数据。
void show_array(const double ar[], int n);
指针和const
存在两种不同的方式将 $\color{red}{const}$ 关键字用于指针。
const int * p1;
int * const p2;
对于p1,其指向一个 const int。这种声明可以防止p1指向的值被修改,但无法防止p1的值被修改。
对于p2,其指向一个 int。这种声明可以修改p2指向的值,但p2的值无法被修改。
对于p1,虽然声明的是指向 const int,但实际可以将 int 的地址赋给p1。p1同样可以防止通过 *p1 来修改值,但无法避免直接通过变量来修改它的值。
此外,也可以将指针指向指针
//如果涉及的是一级间接关系,即指针指向基本数据类型时,可以将非const的指针赋给const指针。
int age = 30;
int * pd = &age; //*pd = 41 is valid
const int * pt = pd; //*pt = 41 is invalid
//如果涉及为二级间接关系则不成立
const int **p2;
int *p1;
const int n = 13;
p2 = &p1; //若能将p1的地址赋给p2,则可以通过p1来修改n的值了,但n为const int
*p2 = &n;
*p1 = 10;
$\color {red} {尽可能使用const}$
- 避免修改数据导致的程序错误
- 使用 $\color {red} {const}$ 使得函数可以同时处理 $\color {red} {const}$ 和 非 $\color {red} {const}$ 实参,否则只能接收 $\color {red} {const}$ 数据。
函数指针基础
$\color {red} {声明函数指针}$
double pam(int); //prototype
double (*pf)(int); //pf的特征标和返回类型必须与pam相同
$\color {red} {传递函数指针}$
void estimate (int lines, double (*pf)(int));
$\color {red} {使用函数指针调用函数}$
double pam(int);
double (*pf)(int);
pf = pam
double x = (*pf)(5); //valid
double y = pf(5); //valid
参考书目 : C++ Primer Plus 第6版
PREVIOUSC++ Primer Plus Chapter5