1.声明和初始化
1.1 一维数组声明
int page[5];
这样默认内部都是0.
声明同时初始化
int score [5] {1,2,3,4,5};
省略数组容量
double foodprice[] {13.2,14.0,18.5,20.0,50};
1.2 二维数组声明和初始化
只是声明,没有初始化
int list[4][3];
初始化
int package [3][2]{
{1,2},
{3,4},
{5,6}
};
1.3多维数组
int building[3][5][2] {
{
{1,3},{2,4},{3,5},{4,6},{5,7}
},
{
{10,11},{20,21},{30,31},{40,41},{50,51}
},
{
{9,10},{19,20},{29,30},{39,40},{49,50}
},
};
//常规遍历法 不用指针
for(size_t i{0};i<size(building);i++){
for(size_t j {0};j<size(building[i]);j++){
cout<<"[ ";
for(size_t k {0};k<size(building[i][j]);k++){
cout<<building[i][j][k]<<" ";
}
cout<<"],";
}
cout<<endl;
}
多维数组声明时可以只用一个[ ]忽略长度。
但这个空的中括号必须放左边。写成int arr[ ] [ ] 的话就会编译器报错
const size_t row_col {3};
int bag[][row_col]{
{1,2,3},
{11,12,13},
{21,22,23},
{31,32,33},
};
for(size_t i{0};i<size(bag);i++){
cout<<"item ";
for(size_t j{0};j<3;j++){
cout<<bag[i][j]<<" ";
}
cout<<endl;
}
2.指针与数组
2.1指向数组的指针的声明
int scores [5] {85,92,78,90,64};
int *pscore {scores};
pscore 和score都表示地址
都可以当作指针,解引用来访问成员又加下标来访问
以下结果都一样
cout<<*pscore<<endl;
cout<<pscore[0]<<endl;
cout<<*scores <<endl;
cout<<scores [0]<<endl;
但是注意,数组名是一个特殊类型的指针,只能在内存中指向一系列连续地址,如果想让它指向别的地方,就错了。
int num{100};
pscore=# //没问题
//scores=#//报错 左边是int [5] 右边是int*
注意此时原数组的5个成员都没有变化。而指针代表的5个数,第一个变成了100,后面4个顺延到14,15被丢弃了。可以自己遍历一下看结果。
for(int val:scores){
cout<<val<<endl;
}//11,12,13,14,15
for(int i=0;i<5;i++){
cout<<*(pscore+i)<<endl;
}// 100,11,12,13,14
2.2 利用指针交换数组
int arr1[5]{13,20,21,22,23};
int arr2 [5]{30,31,32,33,34};
int *parr1{arr1};
int *parr2{arr2};
int *ptemp;
ptemp=parr1;
parr1=parr2;
parr2=ptemp;
for(int i=0;i<5;i++){
cout<<*(parr1+i)<<endl;
}
for(int i=0;i<5;i++){
cout<<*(parr2+i)<<endl;
}
2.3 数组里ptrdiff_t概念
利用指针进行成员的定位和访问:
int distance[]{10,11,12,13,14,15};
int *pdis {distance};
pdis指针指向数组的第一个成员。也可以指向其他成员:
int *pdis2 {distance+3};
int *pdis3 {distance+5};
cout<<*pdis2<<endl;
cout<<*pdis3<<endl;
ptrdiff_t用来表示指针之间的差。
ptrdiff_t posdif=pdis3-pdis2;
ptrdiff_t negdif=pdis2-pdis3;
cout<<posdif<<endl;//2
cout<<negdif<<endl;//-2
cout<<sizeof(posdif)<<endl;//4
2.4 指针之间也可以比较大小
大于,小于,大于等于,小于等于, ==, != 返回值均为布尔值
2.5利用指针遍历数组
2.2里的例子里已经有了利用指针遍历一维数组的例子,再放两个遍历二维,三维数组的例子
int package [3][2]{
{1,2},
{3,4},
{5,6}
};
for(size_t i{0};i<size(package);i++){
for(size_t j{0};j<size(package[i]);j++){
cout<<*(*(package+i)+j)<<" ";
}
cout<<endl;
}
int building[3][5][2] {
{
{1,3},{2,4},{3,5},{4,6},{5,7}
},
{
{10,11},{20,21},{30,31},{40,41},{50,51}
},
{
{9,10},{19,20},{29,30},{39,40},{49,50}
},
};
for(size_t i{0};i<size(building);i++){
for(size_t j {0};j<size(building[i]);j++){
cout<<"[ ";
for(size_t k {0};k<size(building[i][j]);k++){
cout<<*(*(*(building+i)+j)+k)<<" ";
}
cout<<"],";
}
cout<<endl;
}
3.数组做函数参数
3.1不定长度的数组作为函数参数
例1:为1个数组求和。
int getsum(int arr[],size_t n){
int sum{0};
for(size_t i=0;i<n;i++){
sum+=*(arr+i);
}
return sum;
}
int main(){
int salary[]{200,300,400,500};
int salasum=getsum(salary,4);
system("pause");
return 0;
}
注意,一定要事先了解数组长度n,并将它作为第二个参数写在函数参数列表中。为什么不能在函数内部计算出数组长度?因为参数列表中的函数名称被编译器当作了指针,size(指针)是错误的语法,而sizeof(指针) 的结果都是1。
int getsum(int arr[]){
// int arrsize=size(arr); 报错
//int mysize=sizeof(arr)/sizeof(arr[0]); 得到1
3.2确定长度的数组作为函数参数
int getsum(int arr[100],size_t n){
int sum{0};
for(size_t i=0;i<n;i++){
sum+=*(arr+i);
}
return sum;
}
int main(){
int salary[]{100,200,300,400,500,600};
int salasum=getsum(salary,4);
system("pause");
return 0;
}
可以看到参数列表中可以传入一个长度100的数组,但是第二个参数仍然是4,也就只计算了前4个的和。编译器不会报错.100换成任意不是0的整数都行
3.3 确定长度的数组的引用 作为函数参数
注意,1,数组长度一定要等于参数列表中方括号里数组长度,短或者写多了都会编译器报错。
2.别忘了写const
size(数组名) 也可以使用了。因为前面加了引用符号 & ,数组名不会被当作指针了。
double getsum2(const double (&array)[5]){
size_t count=size(array);
double sum2{0.0};
for(size_t i{0};i<count;i++){
sum2+=array[i];
}
return sum2;
}
int main(){
double fish[] {10.0,20.0,30.0,40.0,50.0};
double weight {getsum2(fish)};
cout<<"all fish weight "<<weight<<endl;
system("pause");
return 0;
}