C++学习笔记 1:函数

来源:互联网 发布:淘宝申请退款几天 编辑:程序博客网 时间:2024/06/06 05:43

一些碎碎念~

大一学的C++,大二用得多一点,然后就荒废了,现在想想,大学学的很多东西都学得很表面,学校教得不深入,自己也没有有意识地去深入自学。现在大四了,终于下定决心以后当个程序媛,还有三年的时间充实自己,慢慢来。

C++学习笔记这个系列是看《C++ Primer Plus》第六版这本书做的笔记,实验室一位大神师兄赐给我的书哈哈哈O(∩_∩)O~感恩呐

只是记了一些我自己不太熟的知识点,所以并不是很系统的C++知识点笔记

正题开始~

1. 函数的基本知识

1.1 有返回值的函数(返回类型记为typeName),其返回结果的类型必须为typeName或者可以转换为typeName(例如:如果声明的返回类型为double,而函数返回一个int值,则int值被强制转换成double类型)

1.2 函数的返回类型不能是数组,但是数组可以作为结构或者对象的组成部分返回。

1.3 函数通过将返回值复制到指定的CPU寄存器或者内存单元来将其返回,随后,调用程序将查看该内存单元。

1.4 函数原型提供了函数到编译器的接口,它将函数返回值的类型以及参数的类型和数量告诉编译器。

1.5 函数原型的参数列表中可以不包括变量名,变量名相当于占位符,因此不必与函数定义中的变量名相同。

1.6 编译器可以将函数参数进行主动类型转换(某些可以)。

2. 函数和数组

2.1 将数组作为函数参数

int sum_arr(int arr[],int n)int sum_arr(int* arr,int n)

将数组第一个元素的地址传递进去,没有创建数组的副本,操作的是原来的数组。

2.2 用const保护数组

void show_array(const double arr[],int len)
指针arr指向的是常量数据,不能用指针arr修改该数据,但并不意味者原始数据必须是常量。

2.3 使用数组区间的函数

int arr_sum(const int* begin,const int* end);
begin指向数组的开头,end指向数组最后一个元素的后一个位置。end=begin+length

2.4 指针和const

禁止将const值的地址赋给非const指针

如果涉及的是一级间接关系,则将非const指针赋给const指针是可以的。

int age = 19;int* pd = &age;const int* pt = pd;
进入两级间接关系时,将const和非const混合的指针赋值方法将不再安全。如果允许这样做,则可以编写下面的代码:

const int** pp2;int* p1;const int age = 19;pp2 = &age;*pp2 = p1;*p1 = 10;
下面的代码,const的位置不同,指针p1可以修改为指向其它地址,而指针p2不能修改为指向其它地址。

int sloth = 3;const int* p1 = &sloth;int* const p2 = &sloth;
2.5 函数与二维数组

下面的代码有两种sum函数声明,int (*ar2)[4]是一个指针,指向由四个int组成的一个数组

int sum(int (*ar2)[4],int size);int sum(int ar2[][4],int size);int data = {{1,2,3,4},{5,6,7,8},{9,0,1,2}};int total = sum(data,3);

3. 递归

3.1 每个递归调用都创建自己的一套变量

4. 函数指针

4.1 函数的地址:存储函数的机器语言代码的内存的开始地址。
4.2 获取函数的地址:只要使用函数名即可,如果think()是一个函数,则think就是它的地址。
4.3 声明函数指针:下面的代码中pf是一个指向返回类型为double,参数类型为int的函数的指针

double pam(int);  //prototypedouble (*pf) (int);pf = pm;
4.4 使用指针来调用函数:(*pf)扮演的角色与函数名相同,因此使用(*pf)时只要将它看做函数名就可以。C++也允许像使用函数名那样使用pf。
double pam(int);double (*pf) (int);pf = pm;double x = pam(4);double y = (*pf)(4);doubel z = pf(4);   //also allowed in C++
4.5 函数指针数组
const double * f1(const double *, int);const double * f2(const double [],int);const double * f3(const double ar[],int);condt double (*p1) (const double *, int) = f1; //p1为指向函数f1的指针auto p2 = f2;   //p2为指向函数f2的指针const double * (*pa[3])(const double *,int) = {f1,f2,f3}; //pa是一个包含三个指针的数组,其中每个指针都是函数指针([]的运算优先级高于*)auto pb = pa;  //auto声明只能用于单值初始换,不能用于初始化列表const double av[3];const double px = pa[0](av,3);const double py = (*pb[1])(av,3);auto pc = &pa;  //指向整个函数指针数组的指针const double * (*(*pd)[3])(const double *,int) = &pa; //pd为指向整个函数指针数组的指针
4.6 使用typedef进行简化
typedef const double * (*p_fun)(const double *, int);p_fun p1 = f1;p_fun pa[3] = {f1,f2,f3};p_fun (*pd)[3] = &pa;




0 0
原创粉丝点击