数组
为了处理相同类型的大量数据,C中采用数组的方式,数组有一维数组,二维数组以及多维数组,最常用的为一维数组和二维数组。数组的内容难点主要有两个方面,一是初始化,二是引用;先说数值型的数组,再说字符数组。
数组的初始化
数组的初始化一般和定义放在一起,数组的定义比较简单,即
类型 数组名 [整形常量表达式];
如果是二维数组
类型 数组名 [整形常量表达式] [整形常量表达式];
类型和数组名和普通的变量定义相同,只是后边加了一个[常量表达式]来说明数组的长度,没有很复杂的东西,但是其初始化的内容需要注意。
一维数组
1.直接初始化
name[n]={1,2,3,4,5,6,7,.....};
将初值写在大括号中,并用逗号隔开,如果大括号中的初值数量小于数组定义的数量n,则多余的数组变量成员自动赋初值为0.
2.初始化简化版
int name[]={1,2,3,4,5,6,7};
与第一种相比,这种不需要指定数组的长度,系统会根据初始化值的个数自动分配数组的长度,但是这种用法只能在定义数组的时候用,已经定义过的数组不能用这种方法初始化。
二维数组
1.类似一位数组的初始化方式
name[n][n]={1,2,3,4,5,6,7,.....};
这种方法类似一维数组的初始化方式,系统逐个将初值赋给数组成员,多余的数组成员自动赋初值为0。这种方法也成为按存储方式赋值的方法,因为二维数组的存储方式和一维数组相同,即先存第一行name[1][1]---name[1][n],然后接着存第二行name[2][1]---name[2][n],依次类推,直至存储到name[n][n]。
2.分段初始化
name[n][n]={{1,2,3,4},{5,6,7},.....};
这种方法是按照行赋初值,大括号中嵌套的每一个大括号代表数组的一个行,这样每行就可以看作是一个一维数组,行中赋初值的规则和一维数组相同。注意每个大括号之间也需要用“,”来隔开。
数组的部分长度声明可以省略
int name[][n]={{1,2,3,4},{5,6,7},.....};
和一位数组的简化版定义相同,只能在定义数组的时候用,多维数组时,最后一个长度声明不能省略,其余的长度声明都可以省略。
新版的编译系统增加了一个特性,即“指定初始化器”,该功能可以在初始化时给指定数组成员赋初值,例如;
int name [7]={1,2,3,4,[3]=2,5,6};
name[4]会被赋值为2(其实name[4]先被赋值为4,之后遇到指定初始化后又被赋值为2),后面的初值会按照顺序被赋给未被赋值的数组成员。
数组的引用
数组的使用和普通变量相同,主要需要注意的是:数组名代表了数组的首地址。这个在指针和函数中经常会用到,二维数组中多了一个列地址,比如对于一个name[n][n]的数组,name[1]代表第一行的首地址,name[2]代表第二行的首地址,依次类推,,,,。
字符型数组
字符型数组的定义及初始化和数值型的数组类似,需要注意的是字符型的初值都需要加上单引号(‘’)。
char name[n]={'a','b','c',........};
字符型数组主要用在字符串的处理上,这也是字符数组的重点和难点,一般在一个字符数组中存储一个字符串有以下三种方法:
1. char name[]={'g','o','o','d','\0'}; //加\0作为字符串结束标志。
2. char name[]={"good“};
3. char name[]="good“;
首先需要注意的是\0是字符串结束标志,第一种为普通的赋初值的方法,第二种使用双引号,系统会自动识别双引号为字符串,按照字符串的方式存储,并自动在数组后加上\0,作为字符串结束标志,因此会多占一位,4个字母需要5个数组的长度才可以。第三种省略了大括号。
二维字符数组存储字符串
char name[][20]={{"how are you,"},{"i am fine,"},{"thank you."}};
注意,其中的空格和标点符号也算一个字符。
字符串函数
为了处理字符串,C中设置了大量的字符串函数,存放在string.h头文件中,这里不再赘述。
函数
函数是模块化程序的基础,利用不同的函数实现不同的小功能,然后把这些函数累积起来,就能够完成复杂的工作,函数极大的简化了main函数,提高程序的可读性,同时也简化了编程过程。函数分为有参函数和无参函数。
类型名 函数名 () //无参函数定义,或者在括号中写入void,如(void)。
函数定义语句不加分号(;),函数体用{}括起来,类型和函数名的定义和变量定义方法相同,类型指的是函数返回值的类型,若无返回值,可使用空类型(void),函数名的命名要能够反应函数的具体功能,做到见名知意。
类型名 函数名(参数1,参数2.......) //有参函数的定义。参数定义方法:(类型 变量名,类型 变量名) 。
其中,括号中的参数被称为“形参”,变量属于局部变量,只在函数内部有效。形参的每个变量都要注明类型,类型不能省略,不能这样定义:(int a,b,c) 。
函数的声明
函数和变量一样,也是有作用域的,其作用域一般为定义开始,到程序结束,如果要在定义前使用,就需要声明,一般的声明方式和定义方式类似,
类型名 函数名 (类型名 变量名,类型名 变量名); //函数的声明需要在后面加分号(:) 。
int name (int a, int b);
参数中的变量名可以省略
类型名 函数名 (类型名,类型名);
int name (int , int );
另一种声明方式是将声明放在头文件中,然后在函数开头用include包含该头文件,当使用大量函数时这样做可以简化声明方式,工程中一般应用这种方式。
函数的调用
函数的调用比较简单,注意有参函数调用时主调函数和被调函数的参数在数量和类型要保持一致,还有就是需要注意函数的嵌套调用,也叫函数的递归,即函数自己调用自己,递归可以简化问题,让编程变得简单,但是递归会占用大量的内存资源,降低程序的执行效率,很少应用,一般使用循环来代替函数的递归。
函数的返回值
函数的调用时主调函数向被调函数传递信息,而函数的返回值则是被调函数向主调函数传递信息,具体方法是采用return语句,return语句是函数结束的标志,当执行return语句时,函数结束,return语句后面的语句将不会被执行,在调用函数时要注意这一点。
持续更新中.........