转置n*n矩阵(3种方法)
拿n=4做实验
指针
因为指针是完全的一维的,所以交换元素只有一种方法(指针数组和数组指针有三种)
#include
#include
using namespace std;
void trans(int* p, int n);
int main()
{const int n = 4;int a[n][n];int i = 0, j = 0;cout << "请输入4*4矩阵:" << endl;for (i = 0; i < n; i++){for (j = 0; j < n; j++){cin >> a[i][j];}}int* p = a[0]; trans(p,n);cout << "转置后的结果为:" << endl;for (i = 0; i < n; i++){for (j = 0; j < n; j++){cout << setw(4) << a[i][j] << " ";}cout << endl;}return 0;
}
void trans(int* p, int n)
{int i = 0, j = 0;for (i = 0; i < n; i++){//注意这里必须写j
trans(p, n); //也可以写成 trans((int *)a, n)
将a的首地址强制转化为指针,并赋给形参*p
指针数组
这种在输入n的时候要同时输入n行每行的首地址,也就是a[0],a[1],a[2].....
#include
#include
using namespace std;
void trans(int* p[], int n);
int main()
{const int n=4;int a[n][n];int i = 0, j = 0;cout << "请输入4*4矩阵:" << endl;for (i = 0; i < n; i++){for (j = 0; j < n; j++){cin >> a[i][j];}}int* p[n] = { a[0],a[1],a[2],a[3] };trans(p, n);cout << "转置后的结果为:" << endl;for (i = 0; i < n; i++){for (j = 0; j < n; j++){cout << setw(4) << a[i][j] << " ";}cout << endl;}return 0;
}
void trans(int* p[], int n)
{int i = 0, j = 0;for (i = 0; i < n; i++)//因为是使用下标,所以是n-1{for (j = 0; j < i; j++){ //这三种交换方法都可以int temp = *(*p + n * i + j);//*q是a[0]的地址*(*p + n * i + j) = *(*p + n * j + i);*(*p + n * j + i) = temp;/*int temp = p[i][j];p[i][j] = p[j][i];p[j][i] = temp;*//*int temp = *(p[i] + j);*(p[i] + j) = *(p[j] + i);*(p[j] + i) = temp;*/}}}
注意外层i 这两个按线性排列分别是a[11]和a[14] 2*4+3=11 4*3+2=14 所以需要3这个数 内层j
--------------------------------------------------------------------------------------------------------------------------------- 形如 int (*p)[4]的是数组指针,指向一个数组 指向二维数组时,(*p)后面的括号对应二维数组的列数 这种方法是直接将a每行的首地址给数组指针p,根据[]中对应的列与二维数组一一对应 通过知道每行的首地址,在行的地址上加列的数,即可得到元素 p[i]代表的是数组第i行的首地址数组指针
#include
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
