拿n=4做实验
指针
因为指针是完全的一维的,所以交换元素只有一种方法(指针数组和数组指针有三种)
#include<iostream>
#include<iomanip>
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<i
//只需要右上方一半与左下方一半交换
//写成j<isize会在转置后再转置
//变成没转置时的情况
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;
}
}
}
trans(p, n); //也可以写成 trans((int *)a, n)
将a的首地址强制转化为指针,并赋给形参*p
指针数组
这种在输入n的时候要同时输入n行每行的首地址,也就是a[0],a[1],a[2].....
#include<iostream>
#include<iomanip>
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<n,a[3][2]与a[2][3]需要完成交换
这两个按线性排列分别是a[11]和a[14]
2*4+3=11 4*3+2=14 所以需要3这个数
内层j<i,因为转置只需要一半,因为最后一个a[3][3]不需要与自己交换
---------------------------------------------------------------------------------------------------------------------------------
数组指针
形如 int (*p)[4]的是数组指针,指向一个数组
指向二维数组时,(*p)后面的括号对应二维数组的列数
这种方法是直接将a每行的首地址给数组指针p,根据[]中对应的列与二维数组一一对应
通过知道每行的首地址,在行的地址上加列的数,即可得到元素
#include<iostream>
#include<iomanip>
using namespace std;
void trans(int(*p)[4]);
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];
}
}
trans(a);//直接将a的首地址给指针p
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)[4])//@这里方框里必须是一个确定的数,也就是数组的列数
{
int i = 0, j = 0;
for (i = 0; i < 4; i++)
{
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;
}
}
}
p[i]代表的是数组第i行的首地址