函数和数组
以前的,先贴出来,嘿嘿。
函数是处理复杂数据类型的关键,比如数组或者结构。编写特定函数处理特定的数组操作是有好处的,可靠性高,修改和调试方便,另外将存储属性与操作结合起来也是像oop思想迈进了一步。
首先函数需要知道对哪个数组进行操作,所以要把数组名作为参数传递给函数。为了使函数通用,不限定特定长度的数组,因此需要传递数组的长度。如:int sum(int arr[],int n);方括号为空表示可以把任意长度的数组传递给函数,但是arr实际上并不是数组,而是指针,但是在编写函数体的其余部分可将arr当做数组来处理。在c++中,当且仅当用于函数头或者函数原型时int *arr与int arr[]的含义才是相同的。都意味着arr是一个int型指针,因此不能在函数体中使用int p[]来声明指针。为将数组类型与元素数量告诉函数,需要两个不同的参数来传递,如:void fillArray(int arr[],int size);而不要试图通过方括号表示法来传递数组长度。如:
void fillArray(int arr[size]);编译器忽略为任何数组形参指定的长度。
#include <iostream> const int ArSize = 8; int sum_arr(int arr[], int n); // 原型 int main() { using namespace std; int cookies[ArSize] = {1,2,4,8,16,32,64,128}; int sum = sum_arr(cookies, ArSize);//调用 cout << "Total cookies eaten: " << sum << "\n"; return 0; } int sum_arr(int arr[], int n) { int total = 0; for (int i = 0; i < n; i++) total = total + arr[i]; return total; }
函数调用sum_arr(cookies,ArSize)将cookies数组第一个元素的地址和元素个数传递给sum_arr()函数,sum_arr()函数将cookies的地址赋给指针变量arr,将ArSize赋给int变量n。程序实际上并没有将数组内容传递给函数,而是将数组位置,元素类型及元素数目传递给函数。传递常规变量时,函数使用的是该变量的拷贝,但是传递数组时,函数将使用原来的数组。将数组地址作为参数可以节省复制整个数组所需的时间和内存。
c++将数组名解释为第一个元素的首地址,两种例外是:第一,数组声明使用数组名来标记存储位置;第二是对数组名使用sizeof将得到的是整个数组的长度。
函数和二维数组:
data[3][4]={{1,1,1,1},{2,2,2,2},{3,3,3,3}};
int total=sum(data,3);
data是一个数组名,该数组有3个元素,每一个元素本身又是一个数组,由4个int值组成。因此data的类型是指向由4个int组成的数组的指针。因此,原型如下:
int sum(int (*arr)[4],int size);其中的括号是不可缺的,因为int *arr[4]将声明一个由4个指向int的指针组成的数组,而不是由一个指向由4个int组成的数组的指针。另一种格式的原型:
int sum(int arr[][4],int size);//指向由4个int组成的数组。指针类型指定了列数
因此sum()函数只能接受由4列组成的数组,但长度变量size指定了行数。
- 无匹配