一、函数与数组
1.1、数组作为形参
需要将数组名作为函数的参数,但不限于特定长度的数组,这样可以使得函数通用。
int sum_arr(int arr[], int n); //arr = array name, n = size.
1.2、使用指针处理数组
1、C++中,将数组名视为指针,并将数组名解释为其第一个元素的地址。
2、在函数中将数组地址作为参数可以节省复制整个数组所需的时间和内存。如果数组很大,使用拷贝的系统开销将会很大,程序不仅需要更多地计算机内存,还需要大量的时间复制数据。
3、使用数组名作为参数的函数访问的是原始数组,而不是副本数据,可以通过调用该函数将值赋给数组元素。
4、当不想函数修改原始数组值时(普通形参的按值传递形式),使用const关键保护数组原始数据。
void show_array(const double arr[], int n);
5、将地址运算符&用于数组名,将返回整个数组的地址。对数组名使用sizeof将得到整个数组的字节长度。
6、当且仅当:用于函数头或函数原型中,int *arr 和 int arr[]的含义才是相同的。都意味着arr是一个int指针,其中数组表示法(int arr[])表示了arr不仅仅指向int,还指向int数组的第一个int。
arr[i] == *(arr+i);
&arr[i] == arr+i;
二、const与指针
2.1、常量指针
让指针指向一个常量对象,可以防止使用该指针来修改所指向的值。
int age = 39;
const int * pt = &age;
此时*pt的值被const保护,不能通过pt来修改,但是可以通过age的赋值来修改,因为age没有被const修饰。
2.2、指针常量
将指针本身声明为常量,可以防止改变指针所向的位置。
int sloth = 3;
int * const finger = &sloth;
此时const的位置与6.1中不同,使得finger只能指向sloth,不能被修改指向其他变量。但是可以通过finger来修改sloth的值。即finger是const的,但是*finger不是const的。
特别的:指向const对象的const指针
double trouble = 2.3;
const double * const stick = &trouble;
此时stick只能指向trouble,且不能通过stick来修改trouble的值。stick和*stick都是const的。
三、函数与二维数组
int sum(int ar2[][4], int size);//data是数组名,该数组有n个元素,每个元素是由4个int组成的数组
int sum(int (*ar2)[4], int size);//data类型是指向由4个int组成的数组的指针。
int data[3][4] = {{1,2,3,4},{9,8,7,6},{4,5,6,7}};
int total = sum(data, 3);
参数ar2是指向数组的指针,指针指向由4个int组成的数组,因此,指针类型指定了列数,函数只能接受列数为4的二维数组。
ar2[r][c] = *(*(ar2 + r)+c);