写在前面:之前的内容,都是自己按照书上的内容和笔记敲上去的,发现费力不讨好。我还是太懒了,不愿意动脑子,学完一章后,脑子里是空白的,现在要加入自己的逻辑。作为入门级别的菜鸟,肯定有不少错误,希望大佬看到了能指出来。
函数基础知识
本帖内容包含了书本上第五、六、七三个章节的总结。
三种循环结构
- for循环
for (init; test; update )
statement;
或者
{
statements;
}
入口条件循环:进入循环语句前要先判断是否满足test的语句。
- while循环
while循环是没有初始化和更新部分的for循环,只有测试条件和循环体,so也是入口条件循环。
while(test}
body
建议:在知道了循环次数时,使用for循环;而不知道循环次数,根据具体情况来确定是否停止,则使用while循环。
3. do…while…循环
出口条件循环:先执行循环体,再判定测试表达式。
两种分支语句
- if…else…
知识点:?运算符——5 > 3 ? 10 : 12; 结果为10。若5改为2,结果为12. - switch语句
switch( 整型表达式 )
{
case labell : statement(s)
case label2 : statement(s)
...
default : statement(s)
}
每个labelx必须是整数常量表达式。
程序跳到switch中特定代码行之后,将依次执行所有语句,除非有明确的其它指示。所以,要让程序执行完一组特定语句后,需要使用break语句。
break:跳出循环语句;continue:跳出此次循环剩下的语句,开始下一次循环。
正文
基本概念
创建函数的三个工作:定义、提高原型和调用函数。
定义函数:
typename func_name(para_List)
{
statements;
return 0; //typename = viod时,此句可省。
}
也可以定义为:typename * 型函数,返回一个指针。
函数原型:在调用函数之前,需要提供函数原型。一般放在头文件之后,main()函数之前。
typename func_name(para_List);
注:C++对于返回值的类型限制:不能直接返回数组。(但可以通过其它方式,比如结构的组成部分)
函数参数和按值传递
函数的实参和形参。形参(parameter):用于接收传递值得变量(如x);实参(argument):传递给函数的值(如side)。
double cube(double x);
double volume = cube(side);
cube()被调用时,该函数将创建一个side的副本来使用,名为x。
函数和数组
在C++中,数组名为数组的地址,即数组第一个元素的地址。
将数组作为函数参数时的函数原型(举例):
int sum_arr(int arr[], int n);
————————————————————————————————————————————————————————————————
调用时:
value = sum_arr(cookies, 4);
数组名作为数组的首地址,因此正确的函数头是:
int sum_arr(int * arr, int n);
_________________________________________________________________
调用时:
value = sum_arr(cookies, 4);
于是(当且仅当用于函数头或者函数原型中)
int sum_arr(int arr[], int n); = int sum_arr(int * arr, int n);
const和指针
const和引用符号(“ * ”)的相互位置指明了固定的内容。
const只在引用符号的左侧——则固定的是 * pointer_name,即不能通过指针修改其指向的内容,但可以改变指针所指向的地方。如
int age = 30;
const int * pt = &age;
const只在引用符号的右侧——则固定的是 pointer_name,即不能修改指针指向的位置,但可以改变指针所指向的内容。如
int age = 30;
int *const pt = &age;
const同时在引用符号的左侧和右侧——则同时固定了 pointer_name和 * pointer_name。如:
int age = 30;
const int *const pt = &age;
指针和二维数组
*(arr + r) 等价于 arr[r]
*(arr + r) + c 等价于 arr[r] + c
*(*(arr + r) + c) 等价于 arr[r][c]
函数和结构
使用结构编程时,最直接的方式是像处理基本类型那样处理结构。但是按值传递结构时,如果结构本身非常大,会浪费较多内存,因此实际编程过程倾向于传递结构的地址。
传递结构的地址时,需要修改三个地方:
- 调用函数时,要将结构的地址(&structName)传递给函数;
- 将形参声明为指向结构的指针(即structName *类型);
- 应用间接运算符:-> 。
其余应用还有:函数和C-风格字符串、函数和string对象、函数和array对象。
递归函数
格式:
void recurs(argumentlist)
{
statements1
if(test)
recurs(arguments)
statements2
}
test最终将为false,调用链将断开。
函数指针
函数的地址是存储其机器语言代码的内存的开始地址。
声明指针:将(* pointer_name)代替function_name。
double pam(int);
double (*pf)(int);
pf = pam; // () 的优先级高于 * 优先级,因此必须在前面也加括号
double x = pam(4);
double y = (*pf)(5); or double y = pf(5); //使用指针调用函数,C++中允许这两种调用方式
——————————————————————————————————————————————————————————
double *pf(int); // pf() 是一个返回指针的函数
注意返回值类型为指针的函数。
声明包含多个函数指针的数组:const double *(*pa[3])(const double *, int ) = {f1, f2, f3};
说明:
- const double * 说明该函数是一个返回值为指针的函数
- [] 的优先级高于 *,因此(*pa[3])是一个包含三个指针的数组
- 参数列表的完整表达式为(const double * ar, int n)
- 因此,f_x的表达式为const double *f1(const double *ar, int n)
- pa是一个指向包含三个指针的数组的指针
调用:
按照上面程序,有:
const double *px = (*pa[0])(ar, n); or const double *px = pa[0](ar, n);
获取返回指针指向的内容:
const double px = *(*pa[0])(ar, n); or const double px = *pa[0](ar, n);
pa、&pa[0]、&pa三者的辨析
- pa是数组名,C++中将其定义为数组的地址,因此实际上是一个指向数组首地址的指针,与&pa[0]等价;
- &pa是整个数组的地址
得到数组第一个元素的值:
**&pa = *pa = pa[0]
使用typedef简化
关键字typedef提供程序员创建类型别名的工具。
typedef double real;
_____________________________________
typedef const double *(*p_func)(const double *, int); //p_func现在为一个类型名
p_func pa[3] = {f1, f2, f3};
p_func (*pd)[3] = &pa;
第七章编程题 第10题
————————————————————————————————————————————————————————————————————————————————————
#include<iostream>
using namespace std;
double add(double x, double y);
double calculate(double m, double n, double fun(double x, double y));
int main()
{
double v1, v2;
double sum = 0.0;
double (*pf)(double x, double y);
pf = add;
cout << "请输入两个参数: ";
while (cin >> v1 >> v2 )
{
sum = calculate(v1, v2, pf);
cout << "两数之和为: " << sum << endl;
cout << "请输入两个参数: ";
}
cout << "结束";
return 0;
}
double add(double x, double y)
{
return x + y;
}
double calculate(double m, double n, double fun(double x, double y))
{
double result;
result = add(m, n);
return result;
}