7.函数
7.1 C++默认按值传递函数.
7.2 C++对函数返回值类型有限制,不能是数组,可以是结构和类对象,还有内置基本类型. 不过可以将数组作为结构或类对象组成部分返回.
7.3 通常函数通过将返回值复制到指定的寄存器或内存单元中来将其返回.随后,调用程序将查看内存单元.
7.4 函数原型描述了函数到编译器的接口. 这样做,编译器的效率高. 虽然可以通过扫描函数头来得到相同的信息.
7.5 原型的参数列表中,可以包括变量名,也可以不包括. 其作用相当于占位苻, 因此不必与函数定义中的变量名相同.
7.6 ANSI C 中原型可选函数名后括号为空,意味着: 不指出参数--将在后面定义参数列表.
C++ 原型比选, 仅当与接受可变参数的C函数 (如: printf()) 交互时才需要不指定参数列表, 使用'...',
如: void say_hi (...);
C++ 函数名后括号内为空与 使用关键字 void 等效. 意味着函数没有参数.
7.7 通常原型自动将被传递的参数强制转换为期望的类型.
7.8 函数和数组
int sum_arr ( int arr[], int size ); int sum_arr ( int * arr, int size );
上面2个原型作用都一样.
**注意: 在函数体内, sizeof(srr) 计算的是指针的大小.所以需要传入数组的个数.
传入的是数组地址的拷贝,arr指向的是原始数组地址,所以能在函数体内修改数组元素.
7.9 用const保护数组. 如: void show_arr ( const int num[], int size );
该声明表明指针num指向的是常量数据,不能用sum 修改该数据.
7.10 指针和const.
^ int a = 3;
^ const int * ps = $a; //*ps是const, ps不是
^ int * const pt = &a; //pt是const, *pt不是
* 常规变量的地址可以赋值给常规指针.
* 常规变量的地址可以赋值给指向 const 的指针. 如: 对于ps 而言,a 的值是常量,即ps不能用来修改 a 的值.而a的值可以使用别的方法被修改.
* 不能将const变量地址 赋值给常规指针.
* 可以将const 变量地址赋值给 const 指针.
in all: 使用const 使得函数能够处理 const 和非 const 实参, 否则将只能接受非 const 数据.
7.11 const 只能用于指向基本类型(内置类型,数组,结构,类对象)的指针.不能用于指向指针的指针.
7.12 二维数组做参数的 函数原型.
int data[3][4];
int sum ( int (*ar2)[4], int size ); //原型, (*ar2)[4] 表示一个指向由4个int 组成的数组的指针.
*ar2[4]表示一个由4个指向int的指针 组成的数组.
int sum (int ar2[][4], int size ); //原型的另一种表示.
7.13 函数与结构
* 结构名仅是结构的名称,要获得其地址需用 '&'
* 与基本类型一样,可以按值传递结构,也可以传递地址, 还可以传递引用(详细见下篇).
7.14 函数指针.
* 获取函数地址: 函数名就是 函数地址.
* 声明函数指针: 用 *pf 替换原函数原型.
如: int add ( int, int ); //原函数原型.
int (*pf)( int, int ); //函数指针 原型.
* 调用: 如: int sum = (*pf)(3,4);
也可以用 : int sum = pf(3,4);
** 函数指针数组: int (*pf[3])( int, int ); //原型.
7.15 传递参数为字符串
int ch_in_str ( const char * str, char ch );
int ch_in_str (const char str[], char ch ); //2个原型等效
字符串常量的行为与数组名相同.