数组的定义
数组将多个类型相同的对象归纳在一起,连续存放。
数组实际上只是一个指针
数组的存储
数组是连续存储的,当声明数组时,就已经为数组分配了内存。会根据类型的大小分配内存
数据的创建与访问
一维数组
- type name [n];// 在栈分配内存,n要为常量,变量不行
超出作用域就会销毁
int main(){
static const int x=5;// x为常量
int example[x];// x必须为常量
example[0]=1;
*(example+1)=2;// example[1]=2 ,实际运算为 数组的地址+(偏移,类型的大小)*i
// 但由于example为整型指针,会自动乘以偏移
int* ptr=example;//OK,数组是个指针
*(ptr+2)=3;// example[2]=3,ptr为整型指针,会自动乘以int的偏移
*(int*)((char*)ptr+4*3)=4// example[3]=4
}
- type* name=new type [n]; // 利用new,堆分配内存。n可以为变量
程序结束,才会销毁。若函数想要返回一个数组,要使用new创建
二维数组
- 静态:
int value[10][10];// 未初始化
int value[10][10]={{1,2},{2}};//value[0][0,1]与value[1][0]被赋值,其他为0
- 动态
方式1:
int (*value)[n]=new int [m][n];// 相当于 n个*value
delete []value;
方式2:
int** value=new int* [m];
for(int i=0;i<m;i++)
value[i]=new int [n];
方式3:
int* value=new int [3][4];// 按行存储
动态
数组的大小
一般是利用 sizeof(a)吗,而要使用这种方法,必须在栈中分配内存
注意:若使用new与指针创建数组,则只会返回指针的大小,而不是数组的大小
int main(){
int ex1[5];
int* ex2=new int [5];
sizeof(ex1)/sizeof(int);// 5
sizeof(ex2)/sizeof(int);// 1
}
数组的初始化
内置数据类型
静态数组:
int num[100];// 只是声明,没有初始化,
int num[100]={};//已经初始化,全部为0
int num[100]={1};// num[0]=1,其他为0
动态数组:
int* num=new int [100];// 未被初始化
int* num=new int [100]();// 初始化,都为0
类数组
动态数组:
都会自动调用默认构造函数
string* str=new string [10];
string* str=new string [10]();
Array数组
#include <array>
int main(){
std::array<int,5> example;// int example[5]
}