《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;  
    }  
}
相关推荐
刘好念12 分钟前
[OpenGL]使用TransformFeedback实现粒子效果
c++·计算机图形学·opengl
蓝胖子教编程31 分钟前
【题解】【枚举】——[NOIP2018 普及组] 龙虎斗
c++·算法
是呆瓜呀38 分钟前
12.13-12.21 刷题汇总
学习
冷眼看人间恩怨1 小时前
【Qt笔记】QComboBox控件详解
c++·笔记·qt
Hacker_LaoYi1 小时前
网络协议栈学习(一)socket通信实例
网络·网络协议·学习
Rossy Yan1 小时前
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
开发语言·c++·多态·面向对象·虚函数·头歌实践教学平台
Sunsets_Red1 小时前
CF1548A Web of Lies 题解
c++·学习·算法·信息与通信
李雨非-19期-河北工职大1 小时前
复盘:“辩论赛”复盘
学习
人才程序员2 小时前
【无标题】
c语言·前端·c++·qt·软件工程·qml·界面
千天夜2 小时前
YOLO系列正传(三)神经网络的反向传播(back propagation)与公式推导
人工智能·python·深度学习·神经网络·学习·yolo·卷积神经网络