C++学习笔记 1:函数

一些碎碎念~

大一学的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);  //prototype
double (*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;




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值