文章目录
- C++数组
- 一维数组
- 声明
- 初始化
- 构建动态数组
- 注意细节
- 作为函数参数
- 作为返回值
- 二维数组
- 声明静态数组
- 初始化静态数组
- 构建动态数组
- 寻址问题
- 作为函数参数
- 作为返回值
- 三维数组
C++数组
一维数组
声明
typename arrayName[arraySize];
初始化
int a[5]={0};//全部初始化为0
int a[5]={1,2};//将前2个初始化为1,2,其余全为0
int a[5]={0,1,2,3,4};//分别初始化为0,1,2,3,4
int a[]={0,1,2};//意味着数组a的长度是3
int numSize;
int a[numSize];
for(int i=0;i
构建动态数组
//声明
typename* pointerName = new typename[arraySize];
//释放
delete [] pointerName;
//例子
int numSize=10;
int* num=new int[numSize];
for(int i=0;i
注意细节
- 数组名表示的是数组的基地址,作用相当于指针
- a[0]代表数组第一个元素
- (a+1)[0]代表数组第二个元素
- 下标从0开始编号,编译器不会检查下标是否有效,必须使用有效的下标,否则会发生数组下标溢出
- sizeof(arrayName) 得到的是数组的字节数
作为函数参数
- 通过指定不带索引的数组名来传递一个指向数组的指针。
- 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。
//1.形式参数是指针
int myFunction(int* num,int numSize){
int sum=0;
for(int i=0;i
作为返回值
- 动态分配内存、静态数组在函数返回之后都不会销毁,只有当程序结束时被系统回收,或者程序员自己回收
//程序内部为数组动态分配内存
int* myFunction(int num[],int numSize){
int resultSize=numSize;
int* result=new int[resultSize];
for(int i=0;i
二维数组
声明静态数组
- 二维数组是数组的数组
- 计算机存储方式是按行优先存储,所以地址计算方式如下:
- 地址计算:num+i*columnSize+j
//传统定义
typename arrayName[rowSize][columnSize];
//使用vector定义二维数组
vector >swp(rowSize,vector(columnSize));
初始化静态数组
int num[2][2]={0};//全都初始化为0
//两种初始化方式等价
int num[2][2]={1,2,3,4};
int num[2][2]={{1,2},{3,4}};
构建动态数组
int rowSize=2,columnSize=2;
//分配内存空间
int** num=new int*[rowSize];
for(int i=0;i
//动态分配连续内存
int rowSize=2,columnSize=2;
int** num=new int*[rowSize];
num[0]=new int[rowSize*columnSize];//申请分配内存空间的总大小
for(int i=1;i
寻址问题
- 可以直接使用num[i][j]寻址,也可以使用下面的方式寻址
- 对于int (*num)[columnSize],下面三种寻址方式等价
- *(*(num+i)+j)
- *(num+i*2+j)
- num[i*columnSize+j]
- 对于int **num
- 可以转换成一维数组寻址:*((int*)num+i*columnSize+j)
作为函数参数
- 在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系,可以指定也可以不指定。
- 因为函数调用时传递的是一个指针,它指向由行向量够成的一维数组。
//指定列不指定行,第二个参数传入行数
void myFunction(int num[][2],int rowSize){
int sum=0;
for(int i=0;i
//*(num+i*2+j)<==>
//num[i*columnSize+j]
}
}
}
//使用二级指针,不指定行和列,第2\3个参数分别代表行数\列数
void myFunction(int **num,int rowSize,int columnSzie){
int sum=0;
for(int i=0;i
作为返回值
int** Matrix(int row,int column){
int** num=new int*[row];
for(int i=0;i>num[i][j];
}
}
return num;
}
三维数组