一.函数与数组
(1)函数中传递的参数若为数组,则函数头可以
int sum(int* a,b);
或int sum(int a[],b);
不要试图在参数方括号内带着常量。
(2)数组名其实是地址,用int指针表示也可,传递的是数组的地址和元素,所以相当于使用原来的数组,但传递变量的时候,相当于使用副本。
所以在函数内不修改数组则使用int sum(const int a[],b)
否则int sum(int a[],b)
注意 指针与数组以下关系需要熟记
arr[i]=*(ar+i)
&arr[i]=ar+i;
(3)可传递两个指针来控制数组区间。
int sum(int * start,int* b)
二.const 与指针
(1)指针与const的两种用法
int age=10;
const int *a=&age;
int age=10;
int* const a=&age;
(仅当只有一层间接关系时:如指针指向基本数据类型,函数调用中也要满足这个条件)
(2)可将const量赋给const指针,但不可将const常量赋给一般指针(易思考知道)
二.函数与二维数组
int data[3][4];
有3个指向数组的指针, 每个指针指向一个数组, 每个数组包含 4 个int 元素。
假如此时有一个sum 函数, 作用是计算这个二维数组的和
那么调用sum函数时, 代码应为 sum( data , int size);
那么 sum函数的原型是什么呢:
原型如下: (原型即函数的定义)
int sum(int (*ar2)[4] , int size );
不能用int *ar2[4]; 因为此时意为建立一个数组存放4个指向int类型的指针。而函数想要的是n个含有四个元素的数组,n=size;
为了更加便于理解, 可以将int sum(int (*ar2)[4] , int size );
改写为
int sum(int ar2[][4] , int size );
这样写的可读性更强. 可以轻松的理解为, 这是一个二维数组, 只是行数没有指定, 值为空, 数组名为ar2, 而数组的实际长度, 需要由size 指定.
注意:ar2是指针
三.字符串与函数
(1)返回c-风格的字符串,函数无法返回字符串,但可以返回c-风格字符串的地址(指针)。
将指针指向下一个内存块的时候,记住要delete释放。
四.函数与结构
(1)传递与返回结构:
1.按值传递(结构较小)函数定义时
travel_time(travel_time t1,travel_time t2);
传递结构,从而函数内部可用句点运算符调用结构中的变量。(传递的是副本)
double atan2(double y, double x) //返回方位角的一个函数atan2。
2.传递结构的地址
*注意:结构内的成员应用->来或者(a).来访问。
传递值给函数传递的是副本,传递指针修改的是原始数据
五.函数与string
(1)创建一个string数组,传递给函数时void display(const string sa[],int n)
六.函数指针(在函数的参数中若要调用另一个函数时用)
void men(int x,double (*ps)int );
调用了一个返回值为double,参数类型为int 的指针
(1)函数名本身就是地址名
(2)声明函数指针
double num(int);
double (*ps)int;
ps=num;
只需要改写原型即可,将函数名改为ps,ps即为指向该函数的指针**
(3)调用函数指针时只需要把ps看成函数名即可。