《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;  
    }  
}
相关推荐
程序员东岸8 小时前
学完顺序表后,用 C 语言写了一个通讯录
数据结构·笔记·学习
拱-卒9 小时前
VB.NET入门学习教程
学习
棉猴9 小时前
GESP C++等级认证三级15-原码反码补码2-2
开发语言·c++·gesp·c++三级·等级认证·原码反码补码
爱偷懒的。。9 小时前
基于 WebSocket 协议的实时弹幕通信机制分析-抖音
网络·python·websocket·网络协议·学习·js
知识分享小能手10 小时前
微信小程序入门学习教程,从入门到精通,自定义组件与第三方 UI 组件库(以 Vant Weapp 为例) (16)
前端·学习·ui·微信小程序·小程序·vue·编程
Rock_yzh10 小时前
AI学习日记——深度学习
人工智能·python·深度学习·神经网络·学习
@小张要努力10 小时前
STM32学习记录-0.1 STM32外设
stm32·嵌入式硬件·学习
康妮猫10 小时前
建模的终点,是WPS/Office
数据库·学习
老王熬夜敲代码11 小时前
Etcd使用
c++·微服务·etcd
2301_7890156211 小时前
算法与数据结构——排序算法大全
c语言·开发语言·数据结构·c++·算法·排序算法·visual studio