第七章 函数(C++的编程模块)P203-249

函数的原型

原型描述了函数到编译器的接口,将函数返回值的类型,参数的类型和数量告诉给编译器。声明原型时,可以不包括变量名。

值传递

通常函数是将传入的数值赋给参数,相当于副本,我们成为值传递,不会改变原本变量的值。

函数与数组

函数允许将数组作为参数传入:

int sum(int ar[], int n);

如上,但事实是:ar是一个指针,只是我们在函数中操作时,将ar看作数组,但其本质是指针。
我们c++中,数组名解释为数组第一个元素的首地址,但存在例外:

  • 数组声明使用数组名来标记存储位置
  • 对数组名使用sizeof将得到整个数组的长度
  • 将地址运算符用于数组时,返回整个数组的地址

我们在函数调用时:

int sum = sum(cookies,Size);

其中,cookies也就是数组第一个元素的地址,所以函数传递的是地址,该数组的元素类型是int,所以cookies的类型必须是int指针,即int*,所以,函数的原型应该是:

int sum(int * ar, int n);

用int * ar替换了int ar[],证明这两个函数头都是正确的,当然,只有在函数头或者原型中,这两个含义相同,
所以我们要明白,将数组作为参数的含义是什么,我们并没有将数组的内容传递给函数,而是将数组的位置,元素类型,元素数目提交给函数,有了这些信息,函数就可以使用原来的数组了。通常传递常规变量时,只是使用该变量的拷贝,但传递数组时,函数使用原来的数组.

const与指针

区分一下指针常量与常量指针:

const int * pt;  //常量指针
int * const pf;  //指针常量

常量指针:pt = &a ,不能通过指针操作来改变a的值,例如:*pt = 5 ,这是非法的,但可以更改指针的指向: pt = &b; 或者通过a改变值 : a = 15;
指针常量:pf = &a,可以通过指针操作改变a的值: *pf = 5; ,但不能更改指针的指向:pf = &b;这是非法的。
同时,如果变量a本身为const类型,则指针必须为常量指针!
经过上面的区分,我们可以想到,

const int * const pt;

这样既不能改变指针指向,也不能通过指针改变内容。
所以我们将数组作为参数传给函数时,如果不想让函数改变其内容,可以将参数定义为常量指针:

int sum(const int ar[], int n);

函数为二维数组

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

将二维数组作为函数的参数,data的类型是指向4个int组成的数组的指针,要清楚sum函数的原型:

int sum(int *(ar2)[4], int size );

或者这么写:

int sum(int ar2[][4], int size);

要明白上述原型的含义:由四个int组成的数组的指针!

要与下面的声明区分开,这是:由四个指向int的指针组成的数组

int *ar2[4];

所以,函数的类型指出,由四个int组成的数组,因此,指针类型指定了列数,所以没有将二维数组作的列数作为函数参数,而是将行数作为参数。

字符串作为函数参数

表示字符串的方式有三种:

  • char数组
  • 用引号括起的字符串常量
  • 被设置为字符串的地址的char指针

但三种类型都是char指针,所以可以当作函数参数,但真实传递的是字符串第一个字符的地址。

函数与结构

可以按值传递结构,但消耗时间太多,所以可以传递结构的地址(&),也可以返回结构。

递归

函数自己调用自己,一定需要一个条件,不然会无限重复。

void index(argumentlist)
{
	statements1
	if(test)
		index(arguments)
	statements2
}

根据test测试,决定是否继续调用,如果调用五次,那么statements1按顺序执行五次,statements2以相反的顺序执行5次!

函数指针

将某些函数的地址作为参数传入函数中:

  1. 获取函数的地址
  2. 声明一个函数指针
  3. 使用函数指针来调用函数

获取函数的地址,只要使用函数名即可,不用带参数,带参数的函数名,表示函数的返回值。
声明指向某种数据类型的指针时,必须指定指针指向的类型:

double index(int); //函数原型
//正确的指针类型声明:
double (*pf) (int)

用*pf替换了index,要注意括号,优先级的先后,正确声明pf后,将相应的函数地址赋给他:

pf = index;

最后便可以使用指针来调用函数:

double y = (*pf) (5)
double x = index(5)
//意义相同

最后一些内容,函数指针,数组指针的各种嵌套混合使用,看晕了,也总结不出来什么了。。。。
为了简化这种逻辑严密的声明,可以使用auto和typedef进行简化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值