C语言函数传递数组

文章详细介绍了C语言中一维和二维数组如何作为参数传递给函数。无论是通过数组名还是数组的地址,函数接收的都是数组的首地址,并且在函数内部对数组的修改是直接影响原数组的。对于二维数组,需要指定列数来定位所有元素。示例代码展示了这种传递方式及其效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值