6.函数的注意事项
- 函数的形参列表可以是多个
- C语言传递参数可以是值传递,也可以传递指针
- 函数的命名遵循标识符命名规范,首字母不能是数字,可以采用驼峰法或者下划线法
- 函数中的变量是局部的,函数外不生效
5.基本数据类型默认是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值
#include<stdio.h> void test(int num) { num++;//num进行的是值传递,仅在test函数体内进行num++ printf("test内的num = %d\n", num); } void main() { int num = 7; test(num); printf("main内的num = %d", num); }
6.如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用(即传递指针)
#include<stdio.h> void test(int *num) {//test里的num指针指向main函数体的num (*num)++;//对test的num指针指向的地址的内容进行++ printf("test内的num = %d\n", *num); } void main() { int num = 7; test(&num);//将main函数体的num的地址赋值给test函数的num指针 printf("main内的num = %d", num); }
7.C语言不支持函数重载(不能重复定义)
8.C语言支持可变参数函数
7.练习
请编写一个函数 swap(int *n1, int *n2) 可以交换 n1 和 n2 的值
//请编写一个函数 swap(int *n1, int *n2) 可以交换 n1 和 n2 的值 #include<stdio.h> void swap(int* num1, int* num2) { int temp;//申明一个变量temp,用于暂时存放*num1的内容 temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int num1, num2; printf("请输入num1和num2分别为:\n"); scanf_s("%d%d", &num1, &num2); swap(&num1, &num2); printf("交换过后的结果为:num1 = %d\t num2 = %d", num1, num2); }
8.函数参数的传递方式
8.1.函数参数的传递方式基本介绍
C 语言传递参数可以是值传递,也可以传递指针。其实,不管是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是地址的拷贝,一般来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。
8.2.值传递和引用传递使用特点
- 值传递:变量直接存储值,内存通常在栈中分配
- 默认是值传递的数据类型有 1. 基本数据类型 2. 结构体 3. 共用体 4. 枚举类型
- 引用传递:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值)
- 默认是引用传递的数据类型有:指针和数组
- 如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量(*指针)。从效果上看类似引用
9.变量作用域
9.1变量作用域的基本说明
所谓变量作用域(Scope),就是指变量的有效范围
- 函数内部声明/定义的局部变量,作用域仅限于函数内部
- 函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用局部变量(编译器 使用就近原则)
#include<stdio.h> int num = 9; //如果与全局变量同名它们会优先使用局部变量 void test(int num){ printf("test的num = %d\n", num);//函数内部声明/定义的局部变量,作用域仅限于函数内部 } void main() { test(7); printf("main的num = %d", num); }
3.在一个代码块,比如 for / if中 的局部变量,那么这个变量的的作用域就在该代码块
4.在所有函数外部定义的变量叫全局变量,作用域在整个程序有效
9.2.初始化局部变量和全局变量
- 局部变量,系统不会对其默认初始化,必须对局部变量初始化后才能使用,否则,程序运行后可能会异常退出
2.全局变量,系统会自动对其初始化
#include<stdio.h> int a; char b; float c; double d; void main() { printf("a =%d\tb = %c\tc = %f\t d =%f", a, b, c, d); }
9.3.作用域的注意事项和细节
- 全局变量(Global Variable)保存在内存的全局存储区中,占用静态的存储单元,它的作用域默认是整个程序,也就是所有的代码文件,包括源文件(.c 文件)和头文件(.h 文件)
2.局部变量(Local Variable)保存在栈中,函数被调用时才动态地为变量分配存储单元,它的作用域仅限于函数内部
3.C语言规定,只能从小的作用域向大的作用域中去寻找变量,而不能反过来,使用更小的作用域中的变量
4.在同一个作用域,变量名不能重复,在不同的作用域,变量名可以重复,使用时编译器采用就近原则
5.由{ }包围的代码块也拥有独立的作用域
#include<stdio.h> void main(){ int a = 97; if (1) { int a = 97; } }
9.4.练习
#include<stdio.h> double price = 200.0; void test01() { printf("%.2f\n", price); } void test02() { price = 250.0;//把全局变量price改成250.0 printf("%.2f\n", price); }void test03() { double price = 200.0;//在test03内申明一个double类型的price变量 printf("%.2f\n", price); } void main() { printf("main price = %.2f\n", price);//main price = 200.00 test01();//200.00 test02();//250.00 test01();//250.00 test03();//200.00 }
#include<stdio.h> int n = 20; void func1() { int n = 20; printf("func1 n: %d\n", n);//输出20 } void func2(int n) { printf("func2 n: %d\n", n);//输出30 } void func3() { printf("func3 n: %d\n", n);//输出20 } int main() { int n = 30; func1(); func2(n); func3(); { int n = 40; printf("block n: %d\n", n);//输出40 } printf("main n: %d\n", n);//输出30 return 0; }
10.static关键字
10.1.static基本介绍
static关键字在c语言中比较常用,使用恰当能够大 大提高程序的模块化特性,有利于扩展和维护
10.2.局部变量使用static修饰
- 局部变量被 static 修饰后,我们称为静态局部变量。对应静态局部变量在声明时未赋初值,编译器 也会把它初始化为0
#include<stdio.h> void main() { static int a; printf("a = %d", a); }
2.静态局部变量存储于进程的静态存储区(全局性质),只会被初始一次,即使函数返回,它的值也会保持不变(存放在红色笔画线区域)
#include<stdio.h> void testStatic() { //第一次执行testStatic函数的时候会运行static in num = 7 //并把num存入静态存储区中,故第一次运行完num++之后 //num = 8 并把num = 8存入静态存储区 //第二次运行则不执行static in num = 7,而在执行num++时 //变量num的值从静态存储区中取出,即num = 8 ,后进行num++ static int num = 7; num++; printf("num = %d\n", num); } void main() { testStatic(); printf("***********************\n"); testStatic(); }
10.3.全局变量使用static修饰
1.普通全局变量对整个工程可见,其他文件可以使用extern 外部声明后直接使用。也就是说其他文件不能再定义一个 与其相同名字的变量了(否则编译器会认为它们是同一个 变量),静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响
#include<stdio.h> extern int num; void main() { printf("num = %d", num); }
2.定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用
10.4.函数使用 static 修饰
- 函数的使用方式与全局变量类似,在函数的返回类型前加上 static,就是静态函数。非静态函数可以在另一个文件中通过 extern 引用;静态函数只能在声明它的文件中可见,其他文件不能引用该函数
- 不同的文件可以使用相同名字的静态函数,互不影响