(6)C++ 函数
一、基本知识
1.为什么需要原型?
原型描述了函数到编译器的接口,将函数返回值类型以及参数类型、参数数量告诉编译器。
首先原型告诉编译器方法存在某些参数,如果没有原型会让编译器捕获这种错误。
其次函数把函数返回值放到cpu寄存器或内存中的指定位置,调用函数会从这个位置获取返回值。
2.语法
函数原型不要求提供变量名
void cheers(int x);// x可以省略
3.原型功能
原型确保:
(1)编译器正确处理函数的返回值
(2)编译器检查使用的参数数目是否正确
(3)编译器检查使用的参数类型是否正确,如果不正确,则转换为正确的类型
二、参数与值传递
函数通常按值传递,把数据复制给函数的参数。
三、函数与数组
(1)
#include<iostream> using namespace std; int sum(int s[], int n); void main() { int ss[] = { 2,3,4 }; int nn = 3; int t = sum(ss, nn); cout << t << endl; cout << sizeof(ss)<<" main"<<endl; } int sum(int s[],int n) { int total = 0; for (int i = 0; i < n; i++) { total += s[i]; } cout << sizeof(s) << " sum" << endl; return total; }
mian里的数组ss占12个字节,函数的数组s占4个字节,这里的s实际上是一个指针,在函数传递数组时 int s[] 相当于 int * s
这里仍然是一个值传递,不过传递的不是数组的数值,而是一个地址。
(2)
int t = sum(ss+2, nn);//表示从数组第3个数开始
*注意传递的时候,用另一个参数指出函数数量而不是 int s[4] 写在[]里。
函数内改变数组的内容,实际等于改变了main中ss的值。
(3)指针与const
const两种方法:
1.是让指针指向常量,这种可以防止指针修改所指向的值
指针指向的地址不可以修改,指向的地址的值可以修改
2.指针本身就是常量
指针指向的地址可以修改,指向的地址的值不可以修改
*p+=1;会报错
p+=1;不会报错
age仍可以被修改
3.既修饰指针,又修饰常量
都不可变
(4)二维数组
四、函数与c风格字符串
五、函数与结构
1.值传递
结构较小时,按值传递结构
2.地址传递
const
六、函数与string
七、函数与array
八、递归
九、函数指针
函数指针用来函数当参数传递
#include<iostream> using namespace std; int fun1(int a);//定义一个函数原型 int fun2(int a);//定义一个函数原型 void print(int n, int (*p)(int w));//定义一个函数原型,第二个参数为函数指针 void main() { print(15, fun1); print(15, fun2); } int fun1(int a) { return a * 10; } int fun2(int a) { return a * 100; } void print(int n, int(*p)(int w)) { std::cout << p(n) << endl; }
这是一个函数指针参数,由于函数名是一个地址,所以(*p)是一个地址,所以p是一个函数指针
int (*p)(int w)