C++二维数组函数传参问题
Posted 各可
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++二维数组函数传参问题相关的知识,希望对你有一定的参考价值。
C++中二维数组传参的方法详解
首先需要明确,C++中其实没有多维数组,所谓的多维数组,其实就是数组的数组;
另外,数组中元素的个数也是数组类型的一部分。
当一个数组的元素仍然是数组时,通常使用2个维度来定义它,一个数组表示数组本身的大小,另一个维度表示其元素大小(它的元素也是数组):
int ia[3][4]; //大小为3的数组,每个元素是含有4个整数的数组
int (*p)[4] = ia;//p指向含有4个整数的数组(指向第一个内层数组)
1. 将给定第二维长度的二维数组作为形参传递
#include<iostream>
using namespace std;
void outputArray1(int ia[][4])
{
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 4; ++j)
{
cout << ia[i][j] << endl;
}
}
}
int main()
{
int ia[3][4] = {
{1, 2, 8, 9 },
{2, 4, 9, 12},
{4, 7, 10, 13}
};
//输出数组中所有元素
outputArray1(ia);
return 0;
}
2.使用给定第二维长度的指针作为形参传递
#include<iostream>
using namespace std;
void outputArray2(int (*pia)[4])
{
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 4; ++j)
{
cout << pia[i][j] << endl;
}
}
}
int main()
{
int ia[3][4] = {
{1, 2, 8, 9 },
{2, 4, 9, 12},
{4, 7, 10, 13}
};
//输出数组中所有元素
outputArray2(ia);
return 0;
}
3.将二维数组指针转换成一维数组指针作为形参传递
将int (*ia)[4]转换为 int* ia
using namespace std;
void outputArray3(int *pia2)
{
for (int i = 0; i != 12; ++i)
{
cout << pia2[i] << endl;
//等价于cout<< *(pia2 + i) << endl;
}
/* 另一种写法
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 4; ++j)
{
cout << *(pia2 + i * 4 + j) << endl;
//等价于cout << pia2[ i * 4 + j] << endl;
}
}*/
}
int main()
{
int ia[3][4] = {
{1, 2, 8, 9 },
{2, 4, 9, 12},
{4, 7, 10, 13}
};
//输出数组中所有元素
outputArray3((int*)ia);
return 0;
}
4.使用二级指针作为形参传递
#include<iostream>
using namespace std;
void outputArray4(int **pia3)
{
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 4; ++j)
{
cout << *((int*)pia3 + i * 4 + j) << endl;//解引用指针
}
}
}
int main()
{
int ia[3][4] = {
{1, 2, 8, 9 },
{2, 4, 9, 12},
{4, 7, 10, 13}
};
//输出数组中所有元素
outputArray4((int **)ia);//强制转换为int**
return 0;
}
Tips:对于2维数组ia来说,ia[1]
指向第二行的第一个位置,*ia[1]
等于2,一级指针指向每行(子数组)的第一个元素,用二级指针才能定位到任意单个元素。在实际使用中尽量避免使用强制转换和多级指针。
以下是对第三种的应用(矩阵转置—CCF201503-1 图像旋转)
//问题描述
// 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。
// 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,
// 只需要将对应的矩阵旋转即可。
//输入格式
// 输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。
// 接下来n行每行包含m个整数,表示输入的图像。
//输出格式
// 输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。
//样例输入
//2 3
//1 5 3
//3 2 4
//样例输出
//3 4
//5 2
//1 3
//评测用例规模与约定
// 1 ≤ n, m ≤ 1,000,矩阵中的数都是不超过1000的非负整数。
#include<bits/stdc++.h>
using namespace std;
void T(int n,int m,int *a)
{
for(int i=m-1;i>=0;i--)
{
int x=i;
for(int j=0;j<n;j++)
{
cout << a[j*m+i]<< " ";//这个就是行列颠倒输出
x++;
}
cout << endl;
}
}
int main()
{
int n=0,m=0;
cin >> n >> m;
int a[n][m]={{0}};
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin >> a[i][j];
}
}
T(n,m,(int*)a);
return 0;
}
方法总结转自这里
以上是关于C++二维数组函数传参问题的主要内容,如果未能解决你的问题,请参考以下文章