一、基本知识

 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;
}

(6)C++ 函数_数组

 

在函数传递数组时 int s[] 相当于 int * s

 这里仍然是一个值传递,不过传递的不是数组的数值,而是一个地址。

(2)

int t = sum(ss+2, nn);//表示从数组第3个数开始

*注意传递的时候,用另一个参数指出函数数量而不是 int s[4] 写在[]里。

函数内改变数组的内容,实际等于改变了main中ss的值。

(3)指针与const

   const两种方法:

  1.是让指针指向常量,这种可以防止指针修改所指向的值

   

(6)C++ 函数_数组_02

  指针指向的地址不可以修改,指向的地址的值可以修改

  2.指针本身就是常量

  指针指向的地址可以修改,指向的地址的值不可以修改

(6)C++ 函数_编译器_03

  *p+=1;会报错

   p+=1;不会报错

  age仍可以被修改

  3.既修饰指针,又修饰常量

  

(6)C++ 函数_编译器_04

 

   都不可变

 (4)二维数组

 

 

四、函数与c风格字符串

 

 

五、函数与结构

1.值传递

 结构较小时,按值传递结构

 

2.地址传递

const

(6)C++ 函数_函数指针_05

 

 

 

六、函数与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)