写在前面:学习的第一门语言是Java,之前对C也了解一点,也只是了解一点,在加上长时间没有接触了,基本就只会一个Hello World了。现在由于准备升本考试,不得不从头开始学C。这里从零开始,记录C语言学习点滴。欢迎正在学习C语言的小伙伴一起学习,未来可期,一起加油!
函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种。例如:scanf(),printf()等为库函数,由于C语言系统提供定义,使用时直接调用即可。自定义函数就需要自己定义后才可以使用。函数定义的一般形式为:
函数类型 函数名(形式参数表){ /* 函数首部 /
函数实现过程 / 函数体 */
}
函数首部
函数首部由函数类型、函数名和形式参数表组成,位于函数定义的第一行。函数首部中,函数名是函数整体的称谓,需要用一个合法的标识符表示。函数类型指函数结果返回的类型,一般与return语句中表达式的类型一致。形式参数表中给出函数计算所要用到的相关已知条件,以类似变量定义的形式输出,其格式为:
类型1 形参1, 类型2 形参2,…,类型n 形参n
各个形参之间用逗号分隔,每个形参前面的类型必须分别写明。函数的形参的数量可以是一个,也可以是多个,或者没有形参。
【注】函数首部后面不能加分号,它和函数体一起构成完整的函数定义。
函数体
函数体体现函数的实现过程,有一对大括号内的若干条语句组成,用以计算,或完成特定的工作,并用return语句返回运算的结果(返回的结果类型必须和函数首部定义的类型一致)。
函数的定义案例如下:
/* 定义函数首部 */
int sum(int a, int b){
/* 函数体部分 */
return 10; /* 返回结果 */
}
函数的调用
定义个函数后,就可以在程序中调用这个函数。在C语言中,调用标准库函数时,只需要在程序的最前面用#include命令包含相应的头文件;调用自定义函数时,程序中必须有与调用函数相对应的函数定义。
函数调用的形式
函数调用的一般形式为:
函数名(实际参数)
实际参数(简称实参)可以是常量、变量和表达式。对一函数调用通常出现两种情况:
① 赋值语句
volume = sum(10, b);
② 输出函数的实参
printf("%d", sum(10, b));
参数传递
函数定义时,位于其首部的参数被称为形参,如a和b。调用函数的参数被称为实参,如10和b。形参除了能接受实参的值外,使用方法与普通变量类似。形参和实参必须一一对应,两者数量相同,类型一致。程序运行遇到函数调用时,实参的值依次传递给形参。
函数的形参必须是变量,用于接受实参传递过来的值;而实参可以是常量、变量或表达式,其作用是把常量、变量或表达式的值传递给形参。如果实参是变量,它与所对应的形参是两个不同的变量。实参是主调函数的,形参是自定义函数,这两者可以同名,也可以不同名。
【注】在参数参数传递过程中,将实参的值复制给形参。这种参数传递是单向的,只允许实参把值复制给形参,形参的值即使在函数中改变了,也不会反过来影响实参。
函数结果返回
函数结果返回一般为:return 表达式;
先需要求解表达式的值,在返回其值。一般情况下表达式的类型与函数类型应一致,如果两者不一致,一函数类型为准。return语句的作用有两个:一是结束函数的运行;二是带着运行结果(表达式的值)返回主调函数。
函数原型声明
C语言要求函数先定义后调用,就像变量先定义后使用一样。如果自定义函数被放在主调函数的后面,就需要在函数调用前,**加上函数原型声明(或成为函数声明)。**函数声明的一般格式为:
函数类型 函数名(参数表);
即与函数定义中的第一行(函数首部)相同,并以分号结束。
上述了解了函数的定义,下面通过一个小案例来进一步了解函数的使用。
例:使用函数输出1~100以内的全部素数。代码如下:
#include
#include
/* 声明函数 */
int prime(int m);
int main(){
int i, count = 0;
printf("1~100以内的素数有:\n");
/* 循环1~100 */
for(i = 1; i <= 100; i++){
/* 调用prime判断i是否为素数 */
if(prime(i) != 0){
printf("%d\t", i); /* 输出素数 */
count++;
/* 每行显示10个数 */
if(count % 10 == 0){
printf("\n");
}
}
}
return 0;
}
/* 判断是否为素数的函数 */
int prime(int m){
if(m == 1){ /* 1不是素数,返回0 */
return 0;
}
int i, n = sqrt(m);
for(i = 2; i < n; i++){
if(m % i == 0){
return 0; /* 如果m不是素数,返回0 */
}
}
return 1; /* 是素数返回1 */
}
输出结果为:
不返回结果的函数
上述中说到了函数返回的问题,其实有时候程序设计时也不可以不需要返回运算结果。不返回结果的函数定义:
void 函数名(形参表){ /* 函数首部 /
函数实现过程 / 函数体 */
}
函数类型为void,表示不返回结果,函数体内不需要写return语句。void不能省略;否则函数类型被默认定义为int类型。
例:输出一个数字金字塔,代码如下:、
#include
/* 声明函数 */
void pyramid(int n);
int main(){
pyramid(5); /* 调用函数 */
return 0;
}
/* 定义函数,输出n行数字金字塔 */
void pyramid(int n){
int i, j;
for(i = 1; i <= n; i++){ /*循环需要输出的行数*/
for(j = 1; j <= n-i; j++){ /* 输出每行左边的空格 */
printf(" ");
}
for(j = 1; j <= i; j++){
printf("%d ", i);
}
printf("\n");
}
}
运行效果如下:
局部变量和全局变量
上述中定义变量都是在函数的内部定义的,它们只限于所在的函数内使用。因此主调函数只有通过参数传递,才能把实参数据传递给函数使用;同样形参的改变也不会影响到实参变量。这种称为局部变量。下面来看看全局变量的定义,与使用。
定义在函数外面而不属于任何函数的变量称为全局变量。全局变量的作用范围是从定义开始到程序所在文件的结束,它作用范围内所用的函数都起作用。
【注】一般情况下会把全局变量定义在程序的最前面,即第一个函数的前。由于全局变量和局部变量的作用范围不同,允许它们同名。但某函数的局部变量与全局变量同名时,在该函数调用变量,调用的为局部变量。
全局变量的定义:
#include
/* 定义全局变量x */
int x;
/* 声明函数 */
int f();
int main(){
int a = 1;
x = a; /* 对全局变量x赋值为1 */
a = f();
printf("x = %d, a = %d", x, a);
return 0;
}
int f(){
int x = 4; /* 定义一个与全局变量名相同的局部变量 */
return x; /* 返回的为局部变量x为4 */
}
运行结果如下:
可以看出输出的x为全局变量的值,a为返回的局部变量值。
由于初学C语言,上述内容如有错误地方,恳请各位大佬指出!