数组和指针的传参问题

本文探讨了数组和指针作为参数在函数调用中的传递问题。数组在传参时总是降维为指针,一维、二维及多维数组的传参规则各有特点。指针传参中,一级指针可以接受一维数组、指针和变量的地址,而二级指针则可以接收更多类型的数据。传值调用主要针对非数组类型,而数组通常采用传址调用,通过指针传递。理解这些规则能帮助开发者更好地编写和调试程序。

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

数组和指针的传参问题

数组传参

一维数组传参

#include<stdio.h>
void test(int arr[])//ok?
{
    
}
void test(int arr[10])//ok?
{
    
}
void test(int *arr)//ok?
{
    
}
void test2(int *arr[20])//ok?
{
    
}
void test2(int **arr)//ok?
{
    
}
int main()
{
    int arr[10]={0};
    int *arr2[20]={0};
    test(arr);
    test(arr2);
}

(1)可以,数组取下标操作符内的数字可省略、可为任何数。(2)可以(3)可以,数组传参时降维为指针,形参就算以数组形式表示,编译器也会认为其为一个指针。(4)可以,存放整形指针的数组,形参以同样形式接受是正确的。(5)可以,将arr2[20]先暂时认为一个数组,传参后形参为指针,这个指针的类型为int *型。

二维数组传参

int main()
void test(int arr[3][5])//ok?
{
    
}
void test(int arr[][])//ok?
{
    
}
void test(int arr[][5])//ok?
{
    
}
void test(int *arr)//ok?
{
    
}
void test(int (*arr)[5])//ok?
{
    
}
void test(int **arr)//ok?
{
    
}
{
    int arr[3][5]={0};
    test(arr);
}

(1)可以,实参以二维数组形式传参,形参以二维数组接受是可以的。(2)错误,二维数组传参时形参只能省略离数组名最近的下标操作符内的数字,其余均不可省略,均需要正确输入数字;因为数组可以不知道有多少行,但必须知道每一行有多少元素,这样更方便运算。(3)可以(4)错误,理论上将二维数组看为一个整体,形参为一个指针,但这样容易与一维数组的传参混淆,不建议使用,认为错误。(5)正确。形参为存放指针的数组,一行元素有5个,此种写法为最规范的写法,建议使用。(6)错误。实参为数组,形参为二级指针,二级指针可接受二级指针、一级指针的地址、指针数组、一维数组的地址。

多维数组传参

#include<stdio.h>
#include<stdlib.h>
void test(int (*arr)[2][2])
{

}
int main()
{
	int arr[3][2][2] = { 0 };
	test(arr);
	system("pause");
	return 0;
}

指针传参

一级指针传参

#include<stdio.h>
void print(int *p,int sz)
{
    int i=0;
    for(i=0;i<sz;i++)
    {
       printf("%d\n",*(p+i));
    }
}
int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9};
    int *p=arr;
    int sz=sizeof(arr)/sizeof(arr[0]);
    print(p,sz);
    //或
    //print(arr,sz);
    return 0;
}
一级指针可接受一维数组、指针、&a。

二级指针传参

#include<stdio.h>
void test(int **ptr)
{
    printf("num=%d\n",**ptr);
}
int main()
{
    int n=10;
    int *p=&n;
    int **pp=&p;
    test(pp);
    test(&p);
    return 0;
}
二级指针可接受一维数组地址、指针数组、二级指针、一级指针地址。
传值调用和传址调用

传值调用:除了数组,其他数据实参均以直接拷贝,以传值形式调用。

传址调用:数组传参时不可直接拷贝,需降维为指针;但数据也可以进行传址调用,只要在它前面加上取地址操作符即可。

为什么要创建临时变量?

(1)提高整个程序的安全性(若出现数据丢失,main函数中还有)

(2)提高可使用性(若某一函数有问题,其他正常)

总结:

(1)数组传参时均会发生降维现象。

(2)数组降维为指针,所有数组均为一维数组。

(3)认识上所有数组均为一维数组,数组传参时会降维为指向其内部元素类型的指针。

(4)在32位平台下,所有指针类型传参均消耗4个字节,形成指针临时变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值