用指针传递函数参数 声明和定义什么时候用*a 什么时候用a[]?

用指针传递函数参数声明和定义什么时候用*a什么时候用a[]?划线部分:只有在函数原型或函数定义头中,才可以用intar[]代替int*ar又说intar[]只能用于声明形... 用指针传递函数参数 声明和定义什么时候用*a 什么时候用a[]?划线部分 :只有在函数原型或函数定义头中,才可以用int ar[]代替int *ar
又说int ar[]只能用于声明形式参数
这两个说法不是相抵触的吗
第二张图片 emmmm 我好乱
展开
 我来答
金色潜鸟
2018-06-04 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5744万
展开全部
这里谈论的是函数的形式参数问题。
函数原型或函数定义头 里的 参数,就是形式参数。
int *a 作为形式参数,它可以传递一个int 形变量的地址,可以用来传递一个整型量,或一个数组的首地址。int a[] 可以传递一个数组的首地址,不能用来传递一个整型量。
当用来传递一维数组时,你可以用int *a ,也可以用 int a[] 做函数的形参。至于数组的大小,需要用别的参数 例如 int n 来传递,或用全局量来传递。
这里没有讨论别的情况。例如 int *a 也可以用来传递2维和多维数组。
这里没有讨论程序中的变量声明和初始化。例如 int a[]={1,2,3,4}; 数组大小初始化成4。
幻形术
2018-06-04 · TA获得超过1262个赞
知道小有建树答主
回答量:994
采纳率:81%
帮助的人:266万
展开全部

这书的讲法有问题吧。

void fun1(int *,int); //函数声明,可以省略形参p、len,或者随便写个变量名也行

void fun2(int [],int); //函数声明,可以省略形参p、len,或者随便写个变量名也行,和void fun2(int *,int)等价


int main()

{
    //声明定义数组,显示指定长度为3,显示指定了2个元素,其它的默认0.
    int a[3] = {1,2};  //数组长度为3,3个元素分别为1,2,0.


    //声明数组并立即初始化时,可以不用指定数组大小,由初始化表达式决定数组大小

    int b[] = {1,2,3};  //数组长度为3,即int b[3] = {1,2,3};  

    
    int c[];   //编译错误,没有大括号初始化表达式时必须指定数组元素个数。
    

    return 0;

}
 
//函数定义,因为代码体会用到形参,所以一般不能省略形参p、len
//如果函数实现体中确实没有用到某参数,则也可以省略该参。
void fun1(int *p,int len)

{
    //略
}


//数组

void fun2(int p[],int len) // 和void fun2(int *p,int len)等价

{
    //略
}

总结:

  1. 函数声明中,形参是什么名都无所谓,可以省略,即使有也会被编译顺忽略,函数声明只关注“函数名、返回类型、形参个数以及各形参依次类型”。

  2. 函数定义中不是不能省略形参,关键是看函数体有没有用到它。

  3. 不管是函数声明还是定义中,数组类型参数都会退化为指针,比如int [ ]会退化为 int *.

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式