c语言矩阵转置 运用二维数组和指针

#include <stdio.h>
#define N 10

void Transpose(int a[][N],int n)
{
int i,j,b[N][N];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
b[i][j]=a[j][i];
}
}

printf("\n转置后的矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",a[i][j]=b[i][j]);
}
printf("\n");
}
}
int main()
{
int a[N][N],n;
printf("输入转置矩阵的n=");
scanf("%d",&n);
printf("请输入一个%dx%d的矩阵\n" ,n,n);
Transpose(a,n);
return 0;
}
这个是对的 请帮忙用指针的方式改一下
void Transpose(int (*a)[N],int n)一个这样
void Transpose(int *a,int n)一个是这样
多谢大神

形参int (*a)[N]和int a[][N]在编译时都被解释为“a是指向长度为N的一维数组的指针”,所以函数体内的操作可以二者完全一样。就是说如果你这个函数是正确的的话,把第一个形参改为int (*a)[N],其余不变就是完全正确的。所以这没有什么新的意义,这里就不费笔墨了。至于改为形参int *a,那得稍费周折,因为int *a是个一级指针,不能接受二维数组的全部信息,要在函数中作点预处理;调用的地方也要做点处理。举例如下:

#include "stdio.h"
#define N 10
void Transpose(int *a,int n){
    int i,j,b[N][N],*p[N];
    for(j=i=0;i<N;p[i++]=a+j,j+=n);//处理一下指针,以便操作方阵
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&p[i][j]);//输入矩阵a
            b[j][i]=p[i][j];//转置为b
        }
    }
    printf("\n转置后的矩阵为:\n");
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            printf("%d ",p[i][j]=b[i][j]);//改写a为转置后的矩阵
        printf("\n");
    }
}
int main(void){
int a[N][N],n;
    printf("输入转置矩阵的n=");
    scanf("%d",&n);
    printf("请输入一个%dx%d的矩阵\n" ,n,n);
    Transpose((int *)a,n);//这里对指针a要强制为与函数形参类型一致
    return 0;
}

追问

怎么让用指针的时候用到 *(*(a+i)+j) 这种形式呢 谢谢

追答

改一下就是了,因为类似p[i][j]和*(*(p+i)+j)是完全对等的:

#define N 10
void Transpose(int *a,int n){
    int i,j,b[N][N],*p[N];
    for(j=i=0;i<N;p[i++]=a+j,j+=n);//处理一下指针,以便操作方阵
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",*(p+i)+j);//输入矩阵a
            *(*(b+j)+i)=*(*(p+i)+j);//转置为b
        }
    }
    printf("\n转置后的矩阵为:\n");
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            printf("%d ",*(*(p+i)+j)=*(*(b+j)+i);//改写a为转置后的矩阵
        printf("\n");
    }
}
int main(void){
    int a[N][N],n;
    printf("输入转置矩阵的n=");
    scanf("%d",&n);
    printf("请输入一个%dx%d的矩阵\n" ,n,n);
    Transpose((int *)a,n);//这里对指针a要强制为与函数形参类型一致
    return 0;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2017-12-17
#include "stdafx.h"
#include<iostream>
using namespace std;
void input();
void output();
void sort();
int a[4][4];
int main()
{
cout << "请输入二维数组中的16个数" << endl;
input();
cout << "转置前的二维数组为" << endl;
output();
sort();
cout << "转置后的二维数组为二维数组为:" << endl;
output();
return 0;
}
void input()
{
for (int i = 0; i<4; i++)
for (int j = 0; j < 4; j++)
cin >> a[i][j];
}
void output()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
cout << a[i][j] << "\t";
}
cout << endl;
}
}
void sort()
{
int t;
int (*pa)[4];
pa = a;
for(int i=0;i<4;i++)
for (int j = i+1; j < 4; j++)
{
t = *(*(pa+i)+j);
*(*(pa + i) + j) = *(*(pa + j) + i);
*(*(pa + j) + i) = t;
}
}
相似回答