l 函数的基本知识
创建自己的函数时,必须自行处理3个方面
n 定义
n 提供原型(其它的书称为函数声明)
n 调用
l 函数参数和按值传递
eg:double cube(double x),函数被调用时,它将创建一个新的名为x的double变量,并将实参的拷贝传递给它。
l 函数和数组
在函数中传递数组方法:
eg:int sum_arr(int arr[],int n)
int sum_arr(int *arr,int n)
上述两个语句是等效的。传递常规变量时是,函数将使用该变量的拷贝;但传递数组时,函数将使用原来的数组。
在调用以数组作为参数的函数时应显示地传递数组长度,例如上例中的‘n’值。且数组首地址,与数组元素个数要分开传递。
在C++中还有另一种提供数组信息的方法:指定元素区间。假设有这样的声明
double elbuod[20];
则指针elbuod和elbuod+20定义了该区间。
eg:如在main函数中有如下
int cookies[]={1,2,4,8,16,32,64,128}
sum=sum_arr(cookies,cookies+3)
则会有以下原型定义
int sum_arr(const int* begin,const int* end)
{
const int *pt;
int total=0;
for(pt=begin;pt!=end;pt++)
total=total+*pt;
return total;
}
l 指针和const
有两种不同的方式将const关键字用于指针。第一种方法是让指针指向一个常量对象,这样可以防止使用该指针来修改指向的值;第二种方法是指针本身声明为常量,这样可以改变指针指向的位置
l 函数和二维数组
int sum(int ar2[][4],int n)
int sum(int (*ar2)[4],int n)
即如果是二维数组,则第二个参数是固定传递的。
l 函数和C-风格字符串
假设要将字符串作为参数传递给函数,则表示字符串的方式有3种
n char数组
n 用引号括起的字符串常量(字符串字面值)
n 被设置为字符串的地址char指针
对应的实例
n char ghost[15]=”galloping”;int n1=strlen(ghost);
n int n2=strlen(“gamboling”);
n char *str=”galumphing”;int n3=strlen(str);
C-风格字符串与常规char数组之间的一个重要区别是,字符串有内置的结束字符。即如果要判断字符是否为空,可用while(*str){…str++;…}
如果要返回一个字符串,则就返回的是字符串的指针。如下格式
eg:char *builestr(parameter)
{
char *pstr=new char [n+1];
…
return pstr;
}
l 函数和结构
可以将一个结构赋给另一个结构。如果函数要将结构体作为参数传递,有三种方法:
n 按值传递
n 传递地址结构
n 按引用传递
按值传递时,如果结构非常大,复制结构会增加内存要求,降低系统运行速度。其中前两种方法的传递方式与普通变量传递方式是一样的。
l 函数和string对象
可以将sring对象按照按值传递的形式在函数中传递参数。
l 函数指针
获取函数的地址很简单,只要使用函数名(后面不跟参数)即可。
声明与赋值:
eg:double pam(int);
double (*pf)(int);
pf=pam;
使用指针调用函数:接着上面的例程double x=pam(4);
double y=(*pf)(5);
double z=pf(6);
一个调用例程:
在main()中有如下调用:
estimate(code,betsy);
函数定义:
estimate(int lines,double (*pf)(int))
{
using namespace std;
cout<<(*pf)(lines)<<”hours\n”
}
double betsy(int lns)
{
return 0.05*lns;
}