数组传参,指针作为参数

本文详细探讨了C语言中数组和指针作为参数传递的规则。一维数组作为参数时,可被解析为指向首元素的指针;二维数组传参时,需要指定第二维的大小;指针传参可以使用一级或二级指针,并讨论了指针数组和数组指针的使用场景。总结强调了一维数组参数解析的特殊性及其递归规则的局限性。

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

目录

 

一、数组传参

1.一维数组作为参数(形参)

2.二维数组

二、指针传参

1.一级指针传参(形参)

三、指针数组,数组指针传参

1.指针数组传参

2.数组指针传参

总结:


一、数组传参

1.一维数组作为参数(形参)

一维数组作为参数(形参)传参时——>可用一维数组来接收(实参)

void test(int[10])
{
	;
}
int main()
{
	int arr [10]= {0};
	test(arr);
	return 0;
}int[10])
{
	;
}
int main()
{
	int arr [10]= {0};
	test(arr);
	return 0;
}

一维数组作为参数(形参)传参时——>可用一级指针来接收(实参)

void test(int*p)
{
	;
}

int main()
{
	int arr [10]= {0};
	test(arr);
	return 0;
}int*p)
{
	;
}

int main()
{
	int arr [10]= {0};
	test(arr);
	return 0;
}

C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成一个指向其首元 素首地址的指针。

2.二维数组

二维数组作为参数(形参)传参时——>可用二维数组接收(实参)

 

void test(int arr[][10])
{
	;
}

int main()
{
	int arr [10][10]= {0};
	test(arr);
	return 0;
}arr[][10])
{
	;
}

int main()
{
	int arr [10][10]= {0};
	test(arr);
	return 0;
}

接受时arr[][]第一个[]中可以忽略,但是第二个[]不能省略,因为二维数组可以不知道有多少行,但是一定得知道一行有多少个元素。

 

二维数组作为参数(形参)传参时——>可用数组指针接收(实参)

 

void test(int (*p)[10])
{
	;
}

int main()
{
	int arr [10][10]= {0};
	test(arr);
	return 0;
}int (*p)[10])
{
	;
}

int main()
{
	int arr [10][10]= {0};
	test(arr);
	return 0;
}

因为C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元 素首地址的指针,所以arr[10][10]可以写作 int (*p)[10]

但这里需要注意的是:C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析 成一个指向其首元素首地址的指针。这条规则并不是递归的,也就是说只有一维数组才是 如此,当数组超过一维时,将第一维改写为指向数组首元素首地址的指针之后,后面的维 再也不可改写。比如:a[3][4][5]作为参数时可以被改写为(*p)[4][5]。

二、指针传参

1.一级指针传参(形参)

一级指针传参(形参)——>可以用一级指针接收(实参)

void test(int *p)
{
	;
}

int main()
{
	int *arr;
	test(arr);
	return 0;
}

指针p只是arr指针的临时拷贝(在栈上创建),所以test函数结束后就销毁了,如果要利用指针p则test函数必须要由返回值且类型为指针p的类型。然后在test函数最后加上return p;即可在利用函数返回值返回p的地址。

一级指针传参(形参)——>可以用二数组接收(实参)

void test(int arr[])
{
	;
}

int main()
{
	int *arr;
	test(arr);
	return 0;
}

同上C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成一个指向其首元 素首地址的指针。

一级指针传参(形参)——>可以用二维指针接收(实参)传的时一级指针的地址

void test(int**p)
{
	*p= 2;
	return p;
}

int main()
{
	int *arr;
	test(&arr);
	return 0;
}

2.二级指针可以传参,用三级指针接收。(以此类推)但大部分情况下用来做实参接收一维数组,指针数组。

三、指针数组,数组指针传参

1.指针数组传参

指针数组传参(形参)——>可以用指针数组接收(实参),也可以用二级指针接收

void test(int *arr[])
{
	;
}

int main()
{
	int *arr[] = { 0 };
	test(arr);
	return 0;
}

 

指针数组传参(形参)——>可以用二级指针接收(实参)

 

void test(int **p)
{
	;
}

int main()
{
	int *arr[] = { 0 };
	test(arr);
	return 0;
}

同样C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成一个指向其首元 素首地址的指针。

int*arr[]是指针数组做参数时编译器就解析为int*(*)arr。

 

 

2.数组指针传参

数组指针可做维二维数组传参时的实参。

 

总结:

C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析 成一个指向其首元素首地址的指针。这条规则并不是递归的,也就是说只有一维数组才是 如此,当数组超过一维时,将第一维改写为指向数组首元素首地址的指针之后,后面的维 再也不可改写。比如:a[3][4][5]作为参数时可以被改写为(*p)[4][5]。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值