#include<stdio.h>
int main()
{
int m,n,a[100][100],temp;
int (*pa)[100]=a;
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&*(*(pa+i)+j));//输入数据
}
}
for(int i=0;i<m;i++)//最外层循环是每一行一此循环
{
for(int j=0;j<n-1;j++)//排序数组
{
for(int k=j+1;k<n;k++)
{
if(*(*(pa+i)+k)<*(*(pa+i)+j))
{
temp=*(*(pa+i)+k);
*(*(pa+i)+k)=*(*(pa+i)+j);
*(*(pa+i)+j)=temp;
}
}
}
for(int l=0;l<n;l++)//每一行排序结束输出该行
{
printf("%d ",*(*(pa+i)+l));
}
printf("\n");//最后换行
}
return 0;
}
帮我把涉及指针这块解释一下,int (pa)[100]=a;和if(((pa+i)+k)<(*(pa+i)+j))
int (*pa)[100]=a; 定义一个指向 含有100个int元素的数组 的指针。它是一个指针,只能指向一个 含有100个int的数组。
它不是指针数组,那种含有100个指向int的指针数组 那种要这样写:int *pa[100];
if(*(*(pa+i)+k)<*(*(pa+i)+j))
*(pa+i) 取出了第i行数组 那行有100个元素
*(*(pa+i)+k) 第i行 第脚标为k的元素 这个很奇怪 k竟然是从1起的 脚标可是从0算的 原来是冒泡法排序用的
*(*(pa+i)+j) 是取第i行 脚标为j的元素
也就是说 *(*(pa+i)+j) 是跟它后边的所有元素比较了大小,这一行100个元素从小到大冒泡排序了
// int (*pa)[100]=a; 是一个数组指针,指向一个数组,这个数组 原型是 int [100] ;
有什么用呢? 当我执行 ++pa,就会跳过 100个int 型数据
pa = a[0];
pa+1 = a[1];
*(*(pa+i)+k) = a[i][k];
明白了吗?
有帮助麻烦您采纳一下