目录
函数的基本用法
函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。
l一般形式如下:<数据类型><函数名称>(<形式参数说明>){语句序列;return[(<表达式>)];}
#include <stdio.h>
void print_hello();
int main() {
print_hello();
return 0;
}
void print_hello() {
printf("hello world\n");
}
<数据类型>是整个函数的返回值类型。return[(<表达式>)]语句中表达式的值,要和函数的<数据类型>保持一致。如无返回值应该写为void型
练习
比较两数大小
int get_max(int x, int y);
int main() {
int i, j;
int ret;
printf(">");
scanf("%d%d", &i, &j);
ret = get_max(i, j);
printf("max:%d\n", ret);
return 0;
}
int get_max(int a, int b) {
if (a < b) {
return b;
}
else {
return a;
}
}
什么叫形参
形参全称为“形式参数”
形参是在定义函数的时候使用的参数
目的是用来接收调用该函数时传递的参数
什么叫实参
实参,全称为"实际参数"。
实参是在调用时传递给函数的参数,即传递给被调用函数的值。
在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”。
实参和形参是不同的地址参数,调用函数时实参值传递给形参,修改形参的值不会影响到实参。
函数原型声明
函数的说明就是指函数原型l其中,<形式参数说明>可以缺省说明的变量名称,但类型不能缺省
例如
double power(double,int);
#include <stdio.h>
int fun_prime(int n);//如果不申明,系统会报错找不到该函数
int main() {
int n = 26;
if (fun_prime(n)) {
printf("%d is prime\n", n);
} else {
printf("%d isnot prime\n", n);
}
return 0;
}
int fun_prime(int n) {
int i;
if (n == 1) {
return 0;
}
for (i = 2; i < n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
函数的调用
练习-求素数的个数
#include <stdio.h>
int fun_prime(int n);
int fun_prime_sta(int n);
int main() {
int n;
int count;
printf("input n:");
scanf("%d", &n);
count = fun_prime_sta(n);
printf("count=%d\n", count);
return 0;
}
int fun_prime(int n) {
int i;
if (n == 1) {
return 0;
}
for (i = 2; i < n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int fun_prime_sta(int n) {
int i;
int sum = 0;
for (i = 1; i < n; i++) {
if (fun_prime(i)) {
printf("%d\n", i);
sum++;
}
}
return sum;
}
参数传递
全局变量
全局变量就是在函数体外说明的变量
全局变量一经定义后就会在程序的任何地方可见。
函数调用的位置不同,程序的执行结果可能会受到影响。
不建议使用
#include <stdio.h>
int global_a = 200;
double fun_pow(double x, int n);
int main() {
double x = 2;
int n = 10;
printf("%lf\n", fun_pow(x, n));
printf("global_a=%d\n", global_a);
/*
double ret;
ret = fun_pow(x, n);
printf("%lf\n", ret);
*/
return 0;
}
double fun_pow(double x, int n) {
int i;
double ret = 1;
global_a++;
for (i = 0; i < n; i++) {
ret *= x;
}
return ret;
}
值传递方式
值传递
形参是新开辟的存储空间,在函数中改变形参的值,不会影响到实参
比如交换两个数的函数,用值传递无法实现
#include <stdio.h>
void fun_swap(int a, int b);
int main() {
int x = 200, y = 100;
printf("before:x=%d y=%d %p %p\n", x, y, &x, &y);
fun_swap(x, y);
printf("after:x=%d y=%d\n", x, y);
return 0;
}
void fun_swap(int a, int b) {//int a=x; int b=y;
int t = a;
a = b;
b = t;
printf("a=%d b=%d %p %p\n", a, b, &a, &b);
}
可以看到 实参x/y和形参a/b的地址不一致,修改ab的值不会影响到xy
指针传递方式
按地址传递,实参为变量的地址,而形参为同类型的指针
被调用函数中对形参的操作,将直接改变实参的值
被调用函数对指针的目标操作,相当于对实参本身的操作
#include <stdio.h>
void fun_swap(int * p, int * q);
int main() {
int m = 10, n = 20;
fun_swap(&m, &n);
printf("m=%d n=%d\n", m, n);
return 0;
}
void fun_swap(int * p, int * q) {//int * p = &m; int * q = &n;
int t = *p;
*p = *q;
*q = t;
}
可以看到指针传递,pq的地址和mn的地址一致,修改*q、*p的值等于修改m、n的值