本文已参与「新人创作礼」活动,一起开启掘金创作之路。
函数
函数三要素:
--- 函数名 //可以看为 常量,存档函数起始地址
--- 返回类型 //不支持数组、函数,可使用指针间接返回
--- 形参列表 //也是表达式的一种。接受数组,但会将数组转为指针(出于效率的考虑);接受函数,默认传址,可以使用函数名传递,也可使用函数指针
ps:
1.c语言中,所有非数组形式的数据 实参均以传值的形式。但如果复制整个数组,时间和空间开销都可能非常大。而且绝大多数情况,你并不需要整个数组的副本。
2.类似的函数的返回值,决不能是一个函数、数组,而只能是一个指针。
3.函数名是函数实体的代表,不是地址的代表;同理,数组名是数组实体的代表,不是地址的代表;(函数名,数组名 隐式转换为指针是仅在表达式中的行为)
函数声明:
ANSI C
函数原型的目的是使c语言成为一种更加可靠的语言。建立原型就是为了消除一种普通(但很难发现)的错误,即形参和实参之间的类型不匹配。然而,ANSI C并没有也不可能排它性的使用函数原型,因为这样将使它无法兼容数以十亿的在ANSI C之前便已存在的c代码
K&R C
如果向函数传递一个短于int的整数,函数实际所接收到的是int。之所以要这样做,原意是为了简化编译器(所有的东西都是同一长度)。如果只固定使用几种类型,将大大简化参数的传递,尤其是在非常老式的K&R C编译器中(不能传递struct作为参数)。这种编译器只允许3中类型作为参数:int、double和指针。所有的参数都统一为标准长度,被调用的函数会根据需要对它们进行裁剪。相反,如果使用了函数原型,缺省参数提升就不会发生
ps:
声明 描述其他地方创建的对象
定义 相当于特殊的声明,它为对象分配内存
函数与函数地址
函数void test()
test //表示函数 类型:void()
&test //表示函数指针 类型:void(*)()
test与&test所代表的地址值相同,但是类型不同
数组int a[100]
a //表示数组 类型int[100]
&a //表示数组收元素地址
a与&a所代表的地址值相同,类型不同