本博文为半摘记性质。
——
声明:知识点引自《全国计算机等级考试-上机考试新版题库 二级C》,部分例程修改自https://www.runoob.com/cprogramming/c-tutorial.html 菜鸟教程,另有部分零散资料转自互联网,内容有一定改动,并非全文转载。
本人尊重各位的知识成果,大幅引用的文章原文网址已在各小节末尾给出。
——
C语言在线运行工具:https://tool.lu/coderunner/
函数与数组
本文要点:
- 函数的定义以及调用
- 一维数组
- 二维数组
- 字符数组与字符串
1函数
函数设计包括函数头和函数体,函数体由说明部分和执行部分组成。
函数名为函数的首地址。
函数的定义与调用
函数的定义形式:
类型名 函数名(类型名 形式参数1,类型名 形式参数2,...)
{ 说明部分
语句部分}
- 形式参数名在同一函数中唯一,可与其它函数变量同名。
- 函数的返回值要和函数内部返回值一致。
- 函数类型名指函数返回值的类型名,可省,默认函数返回值的类型为int类型;若无函数值返回,必须把函数定义为void类型。
- 函数值通过return语句返回一个值:
return 表达式;
void类型的函数可省略return语句,这时程序的流程就一直执行到函数末尾,其后返回主调函数;当有return语句时,其作用只在使流程返回到主调函数,其格式为:
return;
return与exit的区别
exit函数用于退出应用程序,并将应用程序的一个状态返回给OS, 0 为正常退出 ,非0 为非正常退出。
void exit(int status);
函数声明
函数在调用前要声明,形式:
类型名 函数名(类型名 形式参数1,类型名 形式参数2,…);
函数调用
函数调用形式:
函数名(实参列表);
- 函数之间可相互调用,也可调用自身(递归调用)。
- 在函数中定义的变量为局部变量,在函数外定义的变量为外部变量(全局变量)。当局部变量与全局变量同名时,在局部变量的作用范围内,全局变量失效。
2数组
一维数组
语法形式:
类型说明符 数组名[整型常量表达式],…;
- C语言只能单个引用数组元素而不能一次引用整个数组。下标只能为整型常量或整型表达式,取值范围从0到(元素个数-1)。
数组引用形式:
数组名[下标];
初始化赋值形式:
类型说明符 数组名[整型常量表达式]={值,值,…,值};
- 一维数组只能在声明时进行多个元素的初始化,在程序中只能对单个元素进行赋值。
- 数组名表示首地址。
- 数组的大小可省,此时数组的大小则为初始化时元素的个数。
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
二维数组
定义形式:
数据类型 数组名 [常量表达式1][常量表达式2];
表达式1为数组元素行数,表达式2为数组元素列数。
声明数组时只有在对数组进行分行初始化或全部赋值时才可以省略行常量,列行量不可省。
数组引用形式:
数组名[行下标][列下标];
二维数组可按行分段赋值:
int a[3][4]={{1,2,3,4}{5,6,7,8}{9,10,11,12}};
或按行连续赋值:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
当某行一对花括号内的初值个数少于该行中元素的个数时,编译器将自动给改行后面的元素补初值0。
二维数组实际上就是元素为一维数组的数组。
数组作为函数参数
数组可以作为函数的参数使用,进行数据传送。
数组作为函数参数有两种形式:
- 把元素作为实参使用。
- 把数组名作为函数的形参和实参使用。
(1)数组元素作为函数实参
它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传递给形参,实现单向的值传递。
void test(int b);//函数声明
void main()
{
int a[10]={...};
int i;
for(i=0;i<=10;i++)
{
test(a[i]);//函数调用
}
printf("\n");
}
(2)数组名作为函数参数
数组名作为函数参数时所进行的传递只是数组地址的传递,即实参与形参有一段共用的内存空间。
字符数组和字符串
字符串常量是用一堆双引号括起来的字符序列,双引号的功能:
1.申请了空间(在常量区),存放了字符串
2. 在字符串尾加上了’/0’
3.返回地址
C语言中没有字符串类型,字符串通常用字符数组表示。
定义形式:
char 字符数组名[元素个数];//一维
char 字符数组名[元素个数][元素个数];//二维
- 一维字符数组可以存一个字符串,二维字符数组可以存多个字符串;二维字符数组可以用指针数组代替。
- 在表示字符串常量时不需在其末尾人工加入(\0),编译器会自动添加。
- 如果花括号中提供的字符个数小于数组长度,其余元素自动定位空字符(\0)。
- 如果花括号中提供的字符个数等于数组长度,在定义时可省略数组长度,初始化时一般都采用这种形式:
char 字符数组名[ ]={字符串常量};//一维
char 字符数组名[ ][不可省]={字符串常量1,字符串常量2,...};//二维
- 只能在字符数组定义时为字符串赋值,这是因为数组在程序中只能对单个元素进行赋值。
- 字符数组≠字符串。
- 字符数组的元素个数比字符串的长度多一,也就是\0计算在内。
——
常采用字符串处理函数处理字符串,使用前需包含头文件 #include <string.h>
1.字符串复制函数strcpy
strcpy(s1, s2);//复制字符串 s2 到字符串 s1
2.字符串连接函数strcat
strcat:STRing CATenate
strcat(s1, s2);//连接字符串 s2 到字符串 s1 的末尾。
3.求字符串长度函数strlen
strlen(s1);//返回字符串 s1 的长度
4.字符串比较函数strcmp
strcmp(s1, s2);//如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0
以下两个函数返回指针
5.字符串查找函数strstr
strstr(s1, s2);//返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置
6.字符串中字符位置查找函数strchr
strchr(s1, ch);//返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置
——
除了采用scanf&printf函数整体输入输出字符串,还可以使用gets()、puts()函数进行输入输出。
char str[100];
gets( str );//输入字符串
puts( str );//输出字符串
——
输入、输出单个字符可采用getchar() & putchar() 函数:
int c;
c = getchar( );//输入单个字符
putchar( c );//输出单个字符
附录 函数&数组的类型
函数的类型
指针与函数
- 指针函数
数组与函数
- 数组元素作为函数参数(见本文)
- 数组名作为函数参数(见本文)
- 数组元素指针作为函数参数
- 指针作为函数参数
- 指针数组作为函数参数
数组的类型
- 数值数组(见本文)
- 字符数组(见本文)
- 指针数组
- 结构数组