文章目录
- [7.1 函数的基本知识](#7.1 函数的基本知识)
-
- [7.1.1 定义函数](#7.1.1 定义函数)
- [7.1.2 函数原型和函数调用](#7.1.2 函数原型和函数调用)
- [7.2 函数参数和按值传递](#7.2 函数参数和按值传递)
- [7.3 函数与数组](#7.3 函数与数组)
-
- [7.3.5 指针与const](#7.3.5 指针与const)
- [7.4 函数和二维数组](#7.4 函数和二维数组)
- [7.10 函数指针](#7.10 函数指针)
-
-
- [1. 函数的地址](#1. 函数的地址)
- [2. 声明函数指针](#2. 声明函数指针)
- 3.使用指针来调用函数
-
- [7.12 复习题](#7.12 复习题)
-
-
- [1. 使用函数的3个步骤是什么?](#1. 使用函数的3个步骤是什么?)
- 2.请创建与下面的描述匹配的函数原型。
- 3.编写一个接受3个参数的函数:
- 4.编写一个接受3个参数的函数:
-
7.1 函数的基本知识
7.1.1 定义函数
库函数
是已经定义和编译好的函数,同时可以使用标准库头文件提供其原型,因此只需正确地调用这种函数
有返回值的函数,必须使用返回语句
函数返回值不能是数组
C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型------整数、浮点数、指针,甚至可以是结构和对象!
7.1.2 函数原型和函数调用
函数原型
是函数的声明,它告诉编译器函数的名称、函数返回值的类型以及函数参数的类型和个数,但不包含函数体。
需要函数原型的原因:
- 如果让编译器对所有代码进行全局搜索,效率不会高。搜索文件时势必会停止对main函数的编译。
- 函数可能不在文件中
7.2 函数参数和按值传递
用于接收传递值的变量被称为形参。
传递给函数的值被称为实参。
在函数被调用时,计算机将为这些变量分配内存;在函数结束时,计算机将释放这些变量使用的内存
7.3 函数与数组
arr[i] == *(arr + i)
&arr[i] == arr + i
7.3.5 指针与const
const float g_earth =9.80;
const float *pe = &g_earth; //Valid
const float g_moon=1.63;
float *pm = &g_moon; //Invalid
当被指向的变量为const
时,指向它的指针的值也必须为const
。
C++禁止将const的地址赋给非const指针。
7.4 函数和二维数组
int data[3][4]={{1,2,3,4},{9,8,7,6},{2,4,6,8}};
int total=sum(data,3);
sum()的函数原型:
int sum(int (*ar2)[4],int size); //将二维数组作为形参,ar2是指针而不是数组
二位数组用指针表示:
ar2 [r][c]== *(*(ar2 + r)+ C)
7.10 函数指针
函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。
1. 函数的地址
如果think( )
是一个函数,则think
就是该函数的地址。
2. 声明函数指针
若函数的申明为
double pam(int);
函数指针的声明为
double (*pf)(int);
函数指针的类型应和它指向的函数类型相一致
3.使用指针来调用函数
double pam(int);
double (*pf)(int); //pf now points to the pam() function
pf = pam;
double x = pam(4); //call pam()using the function name
double y = (*pf)(5); //call pam()using the pointer pf
实际上,C++也允许像使用函数名那样使用pf
double y = pf(5);
作用:省去了判断语句,使得代码可读性、可维护性更强,同时对函数进行了封装。
下面三种函数原型的写法完全相同:
const double *fl(const double ar,int n);
const double *f2(constdouble [],int);
const double *f3(constdouble *,int);
使用函数指针依次调用三个函数:
const double *(*pa[3])(const double *,int)={fl,f2,f3};
7.12 复习题
1. 使用函数的3个步骤是什么?
定义函数、提供函数、调用函数。
2.请创建与下面的描述匹配的函数原型。
a.igor( )没有参数,且没有返回值。
b.tofu( )接受一个int参数,并返回一个float。
c.mpg( )接受两个double参数,并返回一个double。
d.summation( )将long数组名和数组长度作为参数,并返回一个
long值。
e.doctor( )接受一个字符串参数(不能修改该字符串),并返回一
个double值。
f.ofcourse( )将boss结构作为参数,不返回值。
g.plot( )将map结构的指针作为参数,并返回一个字符串。
void igor();
float tofu(int);
double mpg(double,double);
long summation(long [],int);
double doctor(const char*);//要加const,因为不能修改该字符串
void ofcourse(boss);
char* plot(map);
3.编写一个接受3个参数的函数:
int数组名、数组长度和一个int值,并将数组的所有元素都设置为该int值。
void SetArrValue(int length,int arr[],int value){
for(int i=0;i<length;i++){
arr[i]=value;
}
}
4.编写一个接受3个参数的函数:
指向数组区间中第一个元素的指针、指向数组区间最后一个元素后面的指针以及一个int值,并将数组中的每个元素都设置为该int值。
void setArr(int* begin,int *end, int value) {
for(int* pt = begin; pt != end; pt++) {
*pt = value;
}
}