Day4-函数与数组

函数:function

函数头由返回类型、函数名、参数表组成

(1)调用函数用法:函数名(参数值);  

其中,()起到了表示函数调用的重要作用,即使没有参数也需要()。如果有参数,则需要给出正确的数量和顺序。这些值会被按照顺序依次用来初始化函数中的参数

(2)函数的返回值:return停止函数的执行,并送回一个值。

用法:return; 或者return表达式;

返回值可以赋值给变量;可以再传递给函数;甚至可以丢弃

没有返回值的函数:void函数名(参数表)

不能使用带值的return,可以没有return,调用的时候不能做返回值的赋值

(3)函数的先后关系:由于C的编译器是自上而下的顺序编译代码的,所以要在函数被调用前声明函数。(旧标准习惯把函数原型写在调用它的函数里面,现在一般写在调用它的函数前面)

(4)函数原型(即函数声明、函数头)

函数头,以分号";"结尾,就构成了函数的原型函数原型的目的是告诉编译器这个函数长什么样

函数原型包括:名称、参数(数量及类型)、返回类型。

原型里可以不写参数的名字,但是一般仍然是写上

调用函数:

(1)如果函数有参数,调用函数时必须传递给它数量、类型正确的值。调用函数时给的值与参数的类型不匹配(比如需要int,给了double),编译器会悄悄帮程序员转换好类型,但是这可能并不是程序员期望的,同时过程可能会出现警告或者报错。

(2)可以传递给函数的值是表达式的结果,包括字面量、变量、函数的返回值、计算的结果。

(3)C语言在调用函数时,永远只能传值给函数。

(4)每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系。

(5)本地变量:函数的每次运行,就产生了一个独立的变量空间,在这个空间的变量,是函数的这次运行所独有的,称作本地变量。

定义在函数内部的变量就是本地变量,参数也是本地变量

本地变量的规则:定义在块内的,可以是函数的块内,也可以在语句的块内,甚至可以随便拉一对大括号来定义变量。程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。

如果在块内定义了和外面同名的变量,则掩盖了外面的。而且不能再一个块内定义同名的变量。

本地变量不会被默认初始化,参数在进入函数的时候就被初始化了。

注意:C语言不允许函数嵌套函数,即不允许在函数内定义函数,但是可以在函数内声明函数。

(6)调用函数时逗号和逗号运算符如何区分?

调用函数时,一个圆括号f(a,b),里面逗号时标点,不是运算符;两个圆括号f((a,b)),表明先做括号里面的运算,此时逗号时逗号运算符。f(a,b)和f((a,b))区别在于时传入一个还是两个值进入函数。

(7)要不要在参数表里放void:void f(void)还是void f()

void f(void)明确表示f函数没有任何参数

void f()在传统C中,它表示f函数的参数表位置,并不表示没有参数

确定函数里面没有参数就把void放上去,否则就写明函数参数。

数组

<类型>变量名[元素数量],比如int grade[20]或者double weigh[20]

(1)元素数量必须是整数,而且在C99之前,元素数量必须时编译时刻确定的字面量

注意:数组一旦创建,不能改变大小;数组中所有的元素具有相同的数据类型;元素可以出现在赋值的左边或者右边数组中的元素在内存中时连续依次排列的

(2)数组的每个单元就是数组类型的一个变量,使用数组时放在[]中的数字叫做下标或者索引,下标从0开始计数。

(3)数组有效的下标范围:[0,数组的大小-1].编译器和运行环境都不会检查数组下标是否越界,无论是对数组单元做读还是做写,但是一旦程序运行,越界的数组访问可能会出现问题,导致程序崩溃:segmentation fault,也可能运气好,没有造成严重的后果。

(4)数组的长度也可以是0。这样的数组存在,但是没有什么用处。

(5)数组在程序中的一般步骤:

数组的大小——定义数组——初始化数组——数组参与运算——遍历数组输出

(6)数组的集成初始化:

 

(7)在C99下,可以再数组集成初始化时做定位。int a[10] = {[0]=2,[2]=3,6,}表示,a[0]=2,a[2]=3,a[3]=6.

(8)数组的大小:sizeof给出整个数组所占据的内容的大小,单位是字节sizeof(a),用sizeof(a)/sizeof(a[0])可以得到数组a的元素个数。

(9)数组的赋值:数组变量本身不能被赋值,可以通过遍历的方式把一个数组的所有元素交给另一个数组。

(10)数组作为函数参数时,不能在[]中给出数组的大小,不能利用sizeof计算数组的元素个数,因此,往往必须再用另一个参数来传入数组的大小。

int search(int key, int a[], int length);

(11)二维数组:

int a[3][5],通常理解为a是一个3行5列的矩阵

二维数组的初始化:列数必须要给出,行数可以由编译器来数;每行一个{},逗号分隔(古老的传统:最后的逗号可以存在);如果数据不完整(省略),就表示补零;在C99下可以使用定位

int a[][5]={

    {0,1,2,3,4},

    {2,3,4,5,6},};

 

posted @ 2020-12-19 17:37  Akihiii  阅读(80)  评论(0)    收藏  举报