C 语⾔⼆维数组作为函数参数传递
存放⽅式
⼆维数组在内存中是按⾏存放的,先存储第⼀⾏,在接着存储第⼆⾏…..
⼆维数组作为函数参数
⼆维数组作为函数的参数,实参可以直接使⽤⼆维数组名,在被调⽤函数中可以定义形参所有维数的⼤⼩,也可以省略以为⼤⼩的说明。例如:
也可以使⽤数组指针来作为函数参数,例如:
但是不能像下⾯这样使⽤,例如:
因为从实参传递来的是数组的起始地址,如果在形参中不说明列数,编译器将⽆法定位元素的的位置。
各个维数不固定的⼆维数组如果不确定⼆维数组的维数的话,我们不能使⽤上⾯的⽅法,可以⽤下⾯的⽅法:
⼿⼯转变寻址⽅式
对于数组 int p[m][n];
如果要取p[i][j]的值(i>=0 && m<=0 && j>=0 && n<=0),编译器是这样寻址的,它的地址为:
p + i*n + j;
从以上可以看出,如果我们省略了第⼆维或者更⾼维的⼤⼩,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要⽤到各个维数都不固定的⼆维数组 作为参数,这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们完全可以不把它当作⼀个⼆维数组,⽽是把它当作⼀个普通的指 针,再另外加上两个参数指明各个维数,然后我们为⼆维数组⼿⼯寻址,这样就达到了将⼆维数组作为函数的参数传递的⽬的,根据这个思想,我们可以把维数固定 的参数变为维数随即的参数,例如
将
转换为
在转变后的函数中,array[i][j]这样的式⼦是不对的,因为编译器不能正确的为它寻址,所以我们需要模仿编译器的⾏为把array[i][j]这样的式⼦⼿⼯转变为: (( int )a+ n*i + j);
结构体数组不能作为参数传递给函数因为上次做了⼀道c语⾔的题,题⽬要求输⼊8个字符串,必须将字符串按字典序从⼩到⼤排列,排列的必须⽤函数实现,⼀下是我的代码:void find (char a[3][10]);void find (char a[ ][10]);
1
2void find (char (*p)[10]);1void find (char a[ ][ ]);void find (char a[3][ ]);
12void find (char a[3][10]);void find (char a[ ][10]);
1
2void find (int **a,int m,int n);1
#include <stdio.h>#include <string.h>void range(char str [ ][100]);//传进⼆维数组int main(void ){ char str [8][100]; int i; for (i=0;i<8;i++) gets(str [i]); range(str ); for (i=0;i<8;i++) printf("%s\n",str [i]);} void range(char str [ ][100]){ int i,j; char temp[100]; for (i=0;i<8-1;i++) { for (j=0;j<8-i-1;j++) { if (strcmp(str [j],str [j+1])>0) { strcpy(temp,str [j]); strcpy(str [j],str [j+1]); strcpy(str [j+1],temp); } } } }1234567891011121314151617181920212223242526272829303132
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论