无论是多少维的数组,机内都是一维的,以行优先存放。所以直接降为一维数组排序最方便省事。下面以二维数组为例写出代码——
#include "stdio.h"int main(int argc,char *argv[]){
int x[3][3]={{9,4,3},{6,2,7},{5,8,1}},i,j,k,*p
printf("Before ordering is as follows:\n")
for(i=0i<3i++){
for(j=0j<3printf("%2d",x[i][j++]))
printf("\n")
}
for(p=(int *)x,i=0i<9i++){//用p=(int *)x将x降为一维数组p,选择法排序
for(k=i,j=k+1j<9j++)
if(p[k]>p[j])
k=j
if(k!=i)
j=p[k],p[k]=p[i],p[i]=j
}
printf("Sorted as follows:\n")
for(i=0i<3i++){//输出排序后的二维数组
for(j=0j<3printf("%2d",x[i][j++]))
printf("\n")
}
return 0
}
运行结果:
#include <stdio.h>#include "stdlib.h"
#include "time.h"
int main(int argc,char *argv[]){
int a[5][8],i,j,k,t,*p
printf("排序前:\n")
srand((unsigned)time(NULL))
for(i=0i<5i++){//为二维数组赋值
for(j=0j<8printf("%3d",a[i][j++]=rand()%100))
printf("\n")
}
printf("排序后:\n")
p=(int *)a//降为一维,这样排序简单
for(t=i=0i<40i++){//选择法排序
for(k=i,j=k+1j<40j++)
if(p[k]>p[j])
k=j
if(k!=i)
j=p[k],p[k]=p[i],p[i]=j
printf(++t%8 ? "%3d" : "%3d\n",p[i])
}
return 0
}
不是这么说吧,数组名本身就是指针,指向数组的第一个元素
至于你所说的调用调用二级(二维吧)数组,难道不是如普通变量般直接调用吗?
根据问题补充说,这是不允许的,main()函数的形参是固定的不能传递指针。而一般的自定义函数只能用传递首地址的形式来传递二维数组,例子如下:
定义:int
a[x][y]
int
func(int
*p,int
x,int
y){
//x,y即为调用x行y列的元素
printf("%d\
",p+x*x+y);
//这里是通过计算指针位置实现
return
0}
调用:
func(a,3,3)
这种通过计算地址方法调用相当麻烦。。可以考虑将数组定义在结构中,再将结构进行形参传递,当这样会降低效率...例子如下
#include<stdio.h>
typedef
struct{
int
a[5][5]}te
te
test
int
func(te
a,int
x,int
y){
printf("%d\
",a.a[x][y])
return
0}
int
main()
{
test.a[3][3]=5
func(test,3,3)
getch()
return
0}