函数的基本知识
定义函数
void functionName ( parameterlist )
{
dosomething;
return;
}
typeName functionName ( parameterlist )
{
dosomething;
return value;
}
函数原型的作用
- 编译器正确处理函数返回值
- 编译器检查使用的参数数目是否正确
- 编译器检查使用的参数类型是否正确,如果不正确,通过类型转换为正确的类型(如果允许的话)
c++ 函数原型中 括号为空与括号中使用void是等效的,c++不指定参数列表的做法是使用省略号: void say (…); 较少用到,仅当与接收可变参数的c函数( printf() )交互时才会用到
函数参数和按值传递
- 用于接收传递 值的变量被称为形参
- 传递给函数的值被称为实参
c++标准使用参数来表示实参,使用参量来表示形参。
函数和数组
int sum_arr(int *arr,int num);
int sum_arr(int arr[],int num);
使用const 保护数组
void show_arr (const double arr[],int n);
const typeName arr [] c++ 将其解释为 const typeName *arr ,说明arr指向的是一个常量值.这意味不能使用arr修改数据,也即是可以使用arr[0]这样的值,但是不能修改。注意这并不是意味着原始数组必须是常量,而是意味着不能在show_arr中修改这些数据,从而达到保护数组数据的目的。
指针和const
两种将const用于指针的方式:
- 让指针指向一个常量,这样不能使用指针修改指向的值
- 将指针本身声明为常量,这样可以防止改变指针的位置
int age = 39;
const int *pt = &age;
*pt += 1;
*pt = 20 ;
age = 20 ;
之前我们只遇到将常规变量的地址赋给常规指针,将常规变量赋值给const 指针。还有两外两种情况。
- 将const 变量赋值给const 指针;允许;
- 将const 变量赋值给常规指针;不允许;
const int age = 10; int *pt = &age; age的值可以通过pt修改,违背age设为const 的初衷,c++禁止这种操作,可以通过强制类型转化突破这种限制;
问题升级到指针层面将更加复杂;
int age = 39;
int *pd = &age;
const int *pt = pd;
const int **pp2;
int *p1;
const int n = 3;
pp2 = &p1;
*pp2 = &n;
*p1 = 10;
const的位置
int age =56;
const int *pt = &age;
int* const pd = &age;
const int * const pc = &age;
使用const 的好处
- 避免无意间修改数据而改变程序
- 条件允许,应将指针形参声明为指向const 的指针
函数和二维数组
难在声明
int sun(int (*arr)[4]);
int sun(int *arr[4]);
int sun(int arr[][4],int rowNum);
函数和c风格字符串
将c风格字符串传递给参数的三种方式
- char 数组
- 用引号括起来的字符串常量
- 被设置为字符串地址的char 指针
实际上都是char指针,将字符串作为参数传递实际上传递的都是字符串的第一字符的地址;(与数组的操作类似)
在处理的时候注意字符串末尾的空字符即可。(给它留个空间,利用它判断结尾)
函数和结构体
按值传递结构的时候,结构被当作普通变量,函数是使用的原始结构的副本。
函数和string对象
与在函数中使用结构更类似, 可以将一个string对象赋给另一个string对象; 可以将string作为完成的实体传递; 需要多个字符串可以使用string对象数组,而不是二维char数组。
函数指针
函数也有地址,是存储函数机器语言代码的内存的开始地址。 使用函数地址,使用函数名(不跟参数)即可,函数名即地址位置,要将函数作为参数传递,必须传递函数名。
声明函数指针: 通常要声明直向特定类型的函数的指针,可以先编写这种函数的原型,然后用(*函数指针名称)替换函数名,这样就能得到一个函数指针。
|