一、一维数组
首先介绍一下一维数组
一维数组的声明:int a[10];
一维动态数组:
int *a;
int n = 10;
a = new int[n];
delete []a;
一维数组的初始化:
int a[10] = {0};
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int a[10] = {}; //C++11新增,默认初始化为0
int a[10] {0,1,2,3,4,5,6,7,8,9}//C++11中可以省略等号
int a[] = {0,1}//数组长度自动计算
一维数组作为函数参数:void fun(int a[]) 或者 void fun(int *a)
一维数组名通常情况下是一个常量指针,指向数组的第一个元素,除了以下两种情况:
1、sizeof(a) 返回的是整个数组a的长度,而不是指向数组的指针长度。
2、&a 产生的是一个指向数组的指针,而不是一个指向常量指针的指针。
下标引用:
除了优先级以外,下标引用与间接访问完全相同。
array[index] 与 *(array + index) 完全相同。
2[array] 与 *(2 + array) 与 array[2] 效果一样
二、多维数组
多维数组的声明:int a[6][10];
多维数组的初始化:
int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4] = {{1,2,3,4}, {1,2}, {1}}//多维数组中,只有第一维才能自动计算长度,其他的维的长度必须显式写出。
多维动态数组:
int **p;
int n = 2;//行数
int m = 3;//列数
p = new int*[n];
for(int i = 0; i < n; i++){
p[i] = new int[m];
}
<span style="font-family: Arial, Helvetica, sans-serif;">//多维动态数组的释放</span>
for(int i = 0; i < n; i++){
delete [] p[i];
}
delete []p;
int a[10];
int *pa = a;
int b[3][10];
int (*pb1)[10] = b;//pb1是一个指向包含10个元素的整型数组的指针
pb1++;//pb1指向了b的下一行
<span style="font-size:14px;">int *pb2 = &a[0][0];//pb2是一个指向a[0][0]的指针
int *pb3 = a[0];//同上
pb2++;//pb2指向a[0][1]
pb3++;//同上</span>
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *api[10] = {&a[0], &a[1], &a[2], &a[3]};//其余的初始化为空指针
cout<<api[0]<<endl;//输出了a[0]的地址
cout<<*api[0]<<endl;//输出0
api[0]+=6;//api[0]指向了a[6]的地址
cout<<api[0]<<endl;//输出a[6]的地址
cout<<*api[0]<<endl;//输出5