C++编程模块
1.p213
函数用指针来处理数组
当且仅当用于函数头或函数原型中, int*arr 和int arr[] 的含义是相同的
int sum = sum_arr(cookies,arsize);
cookies是其第一个元素,因此是函数传递的是地址。
int sum_arr(int *arr,int n) //or int arr[]
当指针指向一个独立的值时,使用指针表示法。
2.p215
cookies 和 arr 指向同一个地址,
sizeof cookies 32
sizeof arr 4
这是由于sizeof cookies 是整个数组的长度, 而sizeof arr 只是指针变量的长度。
这也是必须显式传递数组长度,而不能在sun_arr中使用sizeof arr 的原因
指针本身并没有指出数组的长度
3.p217
const保护数组
void show_array(const double ar[],int n)
4.p220
使用数组区间的函数
通过两个指针来完成
一个指针标识数组的开头,另一个指针标识数组的尾部
int sum_arr(int *begin, int *end)
for(pt=begin;pt!=end;pt++)
total = total+*pt;
5.p221
指针和const
一种是让指针指向一个常量对象,防止使用该指针来修改所指向的值 const int *ps =&sloth;
另一种将指针本身声明为常量,防止改变指针指向的位置 int * const finger =&sloth;
6.p224
函数和二维数组
//data为二维数组 int total = sum(data,3); int sum(int (*ar2)[4],int size);//由4个指向int的指针组成的数组 int sum(int ar2[][]4,int size);//ar2为指针,
7.p234
传递结构的地址
不能将成员运算符句点用于结构名,用箭头成员运算符 -> eg: ps->price
void show_poloar(const ploar *pda) { ... cout<<"distance = "+<<pad->distance; cout<<",angle = "<<pda->angle*Rad_to_deg; ... }
函数返回一个新的结构,而是修改调用函数中已有的结构,所以第一个参数const指针,第二个不是。
void rect_to_polar(const rect*pxy,ploar *pda); void show_polar(const polar *pda);
传递结构跟传递结构地址 差别在于,后者使用的是地址,让函数能够对原始结构进行操作。
8.
p.236
getline(cin,list[i]);
9.p239
递归
void recurs(argumentlist) { statements1 if(test) recurs(argements) statements2 }
只要if语句为true,每个recurs()调用都将执行statements1 然后再调用recurs().当if语句为false时,当前调用将执行statements2。当前调用结束后,程序控制权将返回给调用它的recurs(),而该recurs()将执行器statament2部分,然后结束,并将控制权返回给前一个调用,以此类推。 如果recurs()调用5次,则 statements1 顺序执行5次,然后statements2部分将以反顺序执行5次。
10.p241
函数指针
1)获取函数的地址,, 即函数名(不带参数不带括号)
区分传递的是地址还是函数的返回值 process(think); thought(think());
2)声明函数指针
函数原型: double pam(int)
则正确的指针类型声明: double (*pf)(int) 必须指定指针的指向
与pam()声明类似,这是将pam替换为了(*pf) ,由于pam是函数,因此(*pf)也是函数,则 pf就是函数指针。
*pt(int) pf()是一个返回指针的函数
(*pt)(int)一个指向函数的指针
赋值: (返回类型需一致,否则编译不通过)
double ned(double); double (*pt)(double); pt = ned;
调用:
estimate(50,pam);
3)使用指针来调用函数 (使用 (*pf)时,只需将它看作函数名即可)
double pam(int); double(*pf)(int); pf = pam; double x =pam(4); double y = (*pf)(5);//c++中也可以: double x = pf(5)