1、函数和数组
int sum_arr(int arr[],int n)
//函数声明时,arr实际并不是表示一个数组,而是一个指针,此时的arr[]表示数组第一个元素的地址,也就是数组的起始地址;
//在编写函数的其余部分时,可以将arr看成一个数组
仅当用于函数头或函数原型中,才等价于
int sum_arr(int *arr,int n)
1.1 c++将数组名解释为其第一个元素的地址,如
cookies=[1,2,3,4,5,6,7,8];
cookies==&cookies[0];
//数组声明使用数组名来标记存储位置,如 int sum_arr(int arr[],int n)
//对数组名使用sizeof 将得到整个数组的长度,如sizeof(cookies)=32(每个int 字节为4)
//而sizeof(arr)=4, 则只表示指针变量的长度
记住以下两个恒等式
arr[i]==*(arr+i);//数组arr中下标为i的值
&arr[i]==arr+i;//数组arr中下标为i的地址
1.2 将数组作为参数的优点
将数组地址作为参数可以节省复制整个数组所需的时间和内存
1.3 使用数组区间函数表达数组
以对数组求和为例,函数原型声明如下:
int sum_arr(const int *begin,const int *end);
//等价于
int sum_arr(const int *arr,const int n);
int sum_arr(const int arr[],const int n);
函数功能实现:
int sum_arr(const int *begin,const int*end)
{
const int *pt;//pt为指针,*pt为指针指向的值
int total=0;
for(pt=begin;pt!=end;pt++)//end 为指向最后一个元素之后的一个指针
{
total+=*pt;
}
return total;
}
1.4 指针和const
待补充,p183
2、函数和二维数组
函数声明
int data[2][4]={{1,2,3,4},{2,3,4,5}};
int total=sum(data,2);
//函数声明原型:
int sum(int (*arr)[4],int size);
//等价于
int sum(int arr[][4],int size);
函数实现
int sum(int arr[][4],int size)
{
int total=0;
for(int r=0;r<size;r++)
for(int c=0;c<4;c++)
total+=arr[r][c];
return total;
}
3、函数和结构体
3.1传递和返回结构
结构体定义
struct travel_time
{
int hours;
int mins;
};//别忘了分号
与结构体有关的函数声明
travel_time sum(travel_time t1,travel_time t2);//求和声明 返回值类型为travel_time
travel_time 可被用来声明变量、函数的返回值和函数的参数类型
由于total和t1,t2变量是travel_time结构,可以对成员(mins)使用句点成员运算符;
travel_time sum(travel_time t1,travel_time t2)
{
travel_time total;
total.mins=(t1.mins+t2.mins)%60;
}
3.2 传递结构的地址
p192