将⼆维数组作为参数传递
1. func(int arr[10][10])固定两个维度,⽐较死板
#include<iostream>
using namespace std;
void func(int arr[10][10]){
for(int i=0;i<10;++i){
for(int j=0;j<10;++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
}
int main(){
int arr[10][10];
for(int i=0;i<10;++i)
for(int j=0;j<10;++j)
arr[i][j]=i;
func(arr);
return 0;
}
2. func(int arr[][10],int n)⾏数可以放宽⼀些,能够处理⾏数不同但列数相同的数组
#include<iostream>
using namespace std;
void func(int arr[][10],int n){
for(int i=0;i<10;++i){
for(int j=0;j<10;++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
}
int main(){
int arr[10][10];
for(int i=0;i<10;++i)
for(int j=0;j<10;++j)
arr[i][j]=i;
func(arr,10);
return 0;
}
3. func(int (*arr)[10],int n)效果同第⼆种⽅案,在这⾥我们也可以看出⼆维数组实际上是⼀个指针数组,也就是arr就是⼀个存储着指
针的数组
for(int j=0;j<10;++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
}
指针与二维数组int main(){
int arr[10][10];
for(int i=0;i<10;++i)
for(int j=0;j<10;++j)
arr[i][j]=i;
func(arr,10);
return 0;
}
4. void func(int **arr,int n,int m)使⽤⼆维指针,在这⾥传递过去的arr是知道这个指针是⼀个⼆维数组
#include<iostream>
using namespace std;
void func(int **arr,int n,int m){
for(int i=0;i<n;++i){
for(int j=0;j<m;++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
}
int main(){
int n[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int **arr=new int*[3];
arr[0]=n[0];
arr[1]=n[1];
arr[2]=n[2];
func(arr,3,3);
delete []arr;
return 0;
}
5. void func(int **arr,int n,int m)参数同⽅案4,但是这⾥的每⼀⾏都是⾃⼰⼿动new
for(int j=0;j<m;++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
}
int main(){
int **arr=new int*[3];//new了⼀个指针数组,p指向这个数组
for(int i=0;i<3;++i)
arr[i]=new int[3]; //在这⾥有个缺点:数组在内存中的分布不是连续的
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
arr[i][j]=i;
func(arr,3,3);
for(int i=0;i<3;++i)
delete []arr[i];//记住new了⼏个就⼀定要delete⼏个
delete []arr;
return 0;
}
6. void func(int **arr,int n,int m)同⽅案5,这⾥将分配内存连续化了,但是要记住delete
#include<iostream>
using namespace std;
void func(int **arr,int n,int m){
for(int i=0;i<n;++i){
for(int j=0;j<m;++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
}
int main(){
int n=3;
int m=3;
int **arr=new int*[n];
arr[0]=new int[n*m];//分配连续内存
for(int i=1;i<n;++i)
arr[i]=arr[i-1]+m;
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
arr[i][j]=i;
func(arr,n,m);
delete []arr[0];
delete []arr;
return 0;
}
7. void func(int **arr,int n,int m)实际上是⼆维数组的⼀个指针退化,从数组指针退化到指针的指针,好处⼤概就是不需要⾃⼰去new
和delete
void func(int **arr,int n,int m){
for(int i=0;i<n;++i){
for(int j=0;j<m;++j)
cout<<*((int *)arr+i*m+j)<<" ";
//在这⾥⼜进⾏了⼀次强制转换,实际上在这⾥arr和arr[0]的地址是⼀样的 //退化成了**arr之后就可以这么解释了
cout<<endl;
}
}
int main(){
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
arr[i][j]=i;
func((int **)arr,3,3);//指针退化
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论