C/C++中一维与多维数组

来源:互联网 发布:sql语句替换字段内容 编辑:程序博客网 时间:2024/06/03 21:53

一、一维数组

首先介绍一下一维数组

一维数组的声明: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;

多维数组作为函数参数:
void fun( int (*a)[10] );
void fun( int mat[][10] );
void fun( int **mat );//不可以
n维数组数组名:指向第1个元素的指针,第1个元素是一个(n-1)维的数组(理解为n维数组的第一行)。
int a[3][4];
a + 1;//代表a数组的第2行,代表一个指向包含3个元素的数组的指针
*(a + 1);//代表指向a的第2行的第1个元素的指针
*(a + 1) + 2;//代表a的第2行的第3个元素
下标引用:
a[n][m] 与 (*(a + n) + m)  与 *(a[n] + m) 效果一样
三、数组指针与指针数组
数组指针:指向数组的指针
数组指针声明:
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;//输出0api[0]+=6;//api[0]指向了a[6]的地址cout<<api[0]<<endl;//输出a[6]的地址cout<<*api[0]<<endl;//输出5






0 0
原创粉丝点击