文章目录文章是作者本人认为需要记录的知识点,读者选取需要的阅读。
- 一、C语言的关键字
- 二、两个c文件的互相引用
- 三、常量的定义
- 四、C的存储类
- 五、C语言函数
- 六、C的作用域
- 七、枚举
- 八、指针
- 九、函数指针
- 十、回调函数
- 十一、结构体
- 十二、共用体
- 十三、typedef
| 关键字 | 说明 |
|---|---|
| auto | 声明自动变量 |
| break | 跳出当前循环 |
| case | 开关语句分支 |
| char | 声明字符型变量或函数返回值类型 |
| const | 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变 |
| continue | 结束当前循环,开始下一轮循环 |
| default | 开关语句中的"其它"分支 |
| do | 循环语句的循环体 |
| double | 声明双精度浮点型变量或函数返回值类型 |
| else | 条件语句否定分支(与 if 连用) |
| enum | 声明枚举类型 |
| extern | 声明变量或函数是在其它文件或本文件的其他位置定义 |
| float | 声明浮点型变量或函数返回值类型 |
| for | 一种循环语句 |
| goto | 无条件跳转语句 |
| if | 条件语句 |
| int | 声明整型变量或函数 |
| long | 声明长整型变量或函数返回值类型 |
| register | 声明寄存器变量 |
| return | 子程序返回语句(可以带参数,也可不带参数) |
| short | 声明短整型变量或函数 |
| signed | 声明有符号类型变量或函数 |
| sizeof | 计算数据类型或变量长度(即所占字节数) |
| static | 声明静态变量 |
| struct | 声明结构体类型 |
| switch | 用于开关语句 |
| typedef | 用以给数据类型取别名 |
| unsigned | 声明无符号类型变量或函数 |
| union | 声明共用体类型 |
| void | 声明函数无返回值或无参数,声明无类型指针 |
| volatile | 说明变量在程序执行中可被隐含地改变 |
| while | 循环语句的循环条件 |
代码一
#include#include "add.c" int x=1; int y=2; int addtwonum(); int main(void) { int result; result = addtwonum(); printf("result 为: %dn",result); return 0; }
代码二
#includeextern int x ; extern int y ; int addtwonum() { return x+y; }
注意细节:
1.在本文件中引入其他文件可以使用include
2.若函数与变量的定义不在同一个文件中,通过extern关键词进行引用,通过extern声明的变量名不会有存储空间。
3.在使用其他文件的函数的时候,需要声明一下函数。
1.使用define定义
例如
#include#define LENGTH 10 #define WIDTH 5 #define NEWLINE 'n' int main() { int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }
2.使用const定义
例如
#include四、C的存储类int main() { const int LENGTH = 10; const int WIDTH = 5; const char NEWLINE = 'n'; int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }
存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类:
1.auto存储类
2.register存储类
3.static存储类
4.extern存储类
函数的声明当中,里面的参数名称可以不重要,但是里面的数据类型很重要。当您在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数。
传值调用:该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用:通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
区别在于:前者不能改变声明的函数的值,而后者通过指针的方法改变变量的值。此点在后续实操需要注意。
形式参数、全局变量、局部变量三个作用域下的函数值是选取的不同的
例如
#include七、枚举int a = 20; int main () { int a = 10; int b = 20; int c = 0; int sum(int, int); printf ("value of a in main() = %dn", a); c = sum( a, b); printf ("value of c in main() = %dn", c); return 0; } int sum(int a, int b) { printf ("value of a in sum() = %dn", a); printf ("value of b in sum() = %dn", b); return a + b; }
枚举变量的定义:
1.先定义枚举类型,在定义枚举变量
2.定义枚举类型的同时定义枚举变量
3.省略枚举名称,直接定义枚举变量
指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
数据类型 *变量名
如何使用指针?
#includeint main () { int var = 20; int *ip; ip = &var; printf("var 变量的地址: %pn", &var ); printf("ip 变量存储的地址: %pn", ip ); printf("*ip 变量的值: %dn", *ip ); return 0; }
从上到下的结果依次为var变量的十六进制地址,IP存储的var变量的十六进制的地址,前两个的值是相同的,最后一个则是var变量的值。
空指针:在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
函数也可以使用指针,用指针的形式指向函数,再通过指针进行调用。
例如:
#include十、回调函数int max(int x, int y) { return x > y ? x : y; } int main(void) { int (* p)(int, int) = & max; // &可以省略 int a, b, c, d; printf("请输入三个数字:"); scanf("%d %d %d", & a, & b, & c); d = p(p(a, b), c); printf("最大的数字是: %dn", d); return 0; }
回调函数就是一函数执行时,将调用另外一个函数进行操作
例如:
#include十一、结构体#include // 回调函数 void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) { for (size_t i=0; i return rand(); } int main(void) { int myarray[10]; populate_array(myarray, 10, getNextRandomValue); for(int i = 0; i < 10; i++) { printf("%d ", myarray[i]); } printf("n"); return 0; }
结构体就相当于定义一个统一数据的数据类型,用户自己定义,例如一个图书管理系统,那么就可以声明一个结构体,结构体中包含图书管理系统会用到的变量。
声明变量的格式:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
一般情况下,这三个要素必须至少要出现两个,结构体的初始化可以直接跟在book后面赋值,也可以在函数中声明book结构体变量,然后通过strcpy函数将字符串的地址赋值给结构体变量.变量。结构体可以作为参数,也可以使用指针。
十二、共用体共用体的概念同结构体相差不大,例如共用体内部可以声明多个不同类型的变量,但注意,同一时间内只能给一个变量赋值,这样才能保证值不会被损坏。
声明变量格式:
union Data
{
int i;
float f;
char str[20];
} data;
十三、typedef
使用typedef为数据类型定义新的名字,从而后面可以用这个名字进行变量的定义。typedef vs #define
#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
- typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
- typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。



