这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
函数对各种数据结构的处理
函数与数组
之前没有注意和强调的一点,C++将数组的名字视为该数组第一个元素的内存地址,即
arr = &arr[0],而这一点具体到函数上来,就是数组作为函数参数时,其实传的参是一个地址,所以函数声明和定义也要是相应的指针类型:
int sum_arr(int* arr, int n);
int sum_arr(int* arr, int n){
int total = 0;
for (int i = 0; i < n; i++)
total = total + arr[i];
return total;
}
但实际上,在且仅在函数定义时,以下的定义也是可行并同义的:
int sum_arr(int arr[], int n);
此时他们都代表arr是一个指向int类的指针。
由于数组名代表数组第一个元素地址的特性,可以玩出些花样来:
int cookies[8] = {1,2,4,8,16,32,64,128};
int sum = sum_arr(cookies+4,4)
std:cout<<sum \\ 输出数组后4项的和,为240
函数与字符串
在C++中表示字符串的方法:
- 由
char元素组成的数组:char ghost[15] = "galloping" - 字符串字面量:
"galumphing" - 指向字符串的指针:
char * str = "galumphing";它们本质上都是指向char类型的指针(即char *,这点跟数组很像),因此在函数中,其声明与定义也可用unsigned int c_in_str(const char * str, char ch);和unsigned int c_in_str(const char str[], char ch);这样的语法。
值得注意的是,在函数中想返回一个字符串的时候,是没办法直接返回这个字符串的(函数执行完毕内存被回收),相应地应该返回这个字符串的指针。
函数与结构体
结构体和数组不太一样,函数在调用结构体的时候可以按值传递,也可以返回一个结构体。相对而言,由于某些结构体很大,按值传递会导致较多内存空间的浪费,传指针会更好。
函数默认参数
函数默认参数是大多数语言都有的特性,C++关于函数默认参数的规定如下:
void defaultFunc(int i, int j, float m=1.0) \\ 可
void defaultFunc(int i, float m=1.0,int j) \\ 不可,默认参数只能出现在参数列表尾,不然调用时语义不明确
defaultFunc(2, 1) \\ 等同于defaultFunc(2, 1, 1.0)
defaultFunc(2, 1, ) \\ 这种语法是不允许的