C++ 20标准 (整型)数组 指针 所有知识点

本文介绍了C++中数组的声明、初始化,包括一维、二维和多维数组。详细阐述了指针与数组的关系,如何通过指针遍历和交换数组,以及在函数中处理数组的方法,如不定长和定长数组参数。同时讨论了数组长度的计算和使用指针定位数组成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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=&num;  //没问题

  //scores=&num;//报错  左边是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值