《C++ Primer Plus》学习笔记|第7章-函数——C++编程模块 (未完结)

文章目录

7.1 函数的基本知识

7.1.1 定义函数

库函数

是已经定义和编译好的函数,同时可以使用标准库头文件提供其原型,因此只需正确地调用这种函数

有返回值的函数,必须使用返回语句

函数返回值不能是数组

C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型------整数、浮点数、指针,甚至可以是结构和对象!

7.1.2 函数原型和函数调用

函数原型

是函数的声明,它告诉编译器函数的名称、函数返回值的类型以及函数参数的类型和个数,但不包含函数体。

需要函数原型的原因:

  1. 如果让编译器对所有代码进行全局搜索,效率不会高。搜索文件时势必会停止对main函数的编译。
  2. 函数可能不在文件中

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;  
    }  
}
相关推荐
醉暮天42 分钟前
4.25学习——文件上传之00截断
学习
喵先生!3 小时前
C++中的vector和list的区别与适用场景
开发语言·c++
xMathematics4 小时前
计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形
开发语言·c++·qt·计算机图形学·cmake·opengl
blackA_4 小时前
数据库MySQL学习——day4(更多查询操作与更新数据)
数据库·学习·mysql
yuanManGan6 小时前
C++入门小馆: 深入了解STLlist
开发语言·c++
梁下轻语的秋缘6 小时前
每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)
c语言·c++·学习·蓝桥杯
逐光沧海6 小时前
STL常用算法——C++
开发语言·c++
wuqingshun3141596 小时前
蓝桥杯 5. 交换瓶子
数据结构·c++·算法·职场和发展·蓝桥杯
球求了7 小时前
C++:继承机制详解
开发语言·c++·学习
超爱笑嘻嘻7 小时前
shared_ptr八股收集 C++
c++