C语言函数传递数组
一维数组
传递方式
/*函数名param后跟一个空的[],说明param可以接受一个数组*/
void myFunction(int param[]) {
/*函数体 代码*/
}
/*函数名param后跟一个非空的[size],说明param可以接受一个大小为size的数组*/
void myFunction(int param[size]) {
/*函数体 代码*/
}
/*函数名param前有一个*,说明param可以接受一个数组*/
void myFunction(int *param) {
/*函数体 代码*/
}
示例代码
#include <stdio.h>
int main()
{
int a[5] = {1,4,5,3,2};
fn(&a);
int i;
for(i=0;i<5;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
//无论这里参数是 *a/a[5]/a[] 结果都一样
void fn(int *a)
{
int i,j;
for(i=0;i<5;i++)
{
for(j=i;j<5;j++)
{
if(a[i]>a[j])
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
输出结果
1 2 3 4 5 -------------------------------- Process exited after 0.01566 seconds with return value 0 请按任意键继续. . .
如上的代码,无论形参是*a或者a[5]或者a[]输出结果都是一样的
总结:传递的实质上是首地址,而函数里面操作的都是*a,即直接改变了指针指向地址的内容,故输出会改变
下面输出是一样的,无论是a还是&a都是输出a的地址,故传递参数的时候使用a或者&a都是是一样的。
printf("%x\n",a); printf("%x\n",&a);
二维数组
传递方式
/*需要定义列数*/
void myFunction(int (*pm)[COLUMN]);
void myFunction(int m[][COLUMN]);
示例代码
#include <stdio.h>
int main()
{
int a[2][3] = {{1,2,3},{4,5,6}};
fn(&a);
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
//测试ab交换
// int a =2;
// int b = 3;
// swap(&a,&b);
// printf("%d %d",a,b);
return 0;
}
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void fn(int (*a)[3])
{
a[0][0] = 0; //修改是有效的
swap(&a[0][0],&a[0][2]);
}
输出结果:
3 2 0 4 5 6 -------------------------------- Process exited after 0.01294 seconds with return value 0 请按任意键继续. . .
思考:由于二维数组的结构,它传递的实质上是n行的一维数组。故可以看做当只传递第一行的首地址是无法定位全部元素,因为系统不知道你有多少列,故还需要指定有多少列,指定了列数,就可以根据首地址(这里指第一行第一列元素的地址)+列数算出来每个元素的地址了。
上述由于运算优先级,故需要加小括号 ---- (*a)[3]