一、C语言
【
1、C标准库
{
(C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。)
#include
---:提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。
---:提供了一些函数,可用于测试和映射字符。
---:定义了整数变量 errno,它是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误。
---:文件包含了一组与浮点值相关的依赖于平台的常量。
---:文件决定了各种变量类型的各种属性。定义在该头文件中的宏限制了各种变量类型(比如 char、int 和 long)的值。
---文件定义了特定地域的设置,比如日期格式和货币符号。接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两个重要的函数。
---:文件定义了各种数学函数和一个宏。在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double 类型的结果。
---:文件定义了宏 setjmp()、函数 longjmp() 和变量类型 jmp_buf,该变量类型会绕过正常的函数调用和返回规则。
---:文件定义了一个变量类型 sig_atomic_t、两个函数调用和一些宏来处理程序执行期间报告的不同信号。
---:文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数。
---:文件定义了各种变量类型和宏。这些定义中的大部分也出现在其它头文件中。
---:文件定义了三个变量类型、一些宏和各种函数来执行输入和输出。
---:文件定义了四个变量类型、一些宏和各种通用工具函数。
---:文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
---:文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。
}
2、基础理论知识
{
---程序结构:预处理器指令、函数、变量、语句&表达式、注释。 return 0; ---退出main()函数。
---关键字:auto else long switch break enum register typedefcase extern return unionchar float short unsignedconst for signed voidcontinue goto sizeof volatiledefault if static whiledo int struct _Packeddouble
---数据类型:
@1:基本类型
@2:枚举类型
@3:Void类型
@4:派生类型
---变量:变量的定义-type variable_list; 变量的声明-extern int i; //变量的声明 int i;//变量的定义 --除非有extern关键字,否则都是变量的定义。
---常量:字符常量
\v--垂直制表符 \ooo--一到三位的八进制数 \xhh--一个或多个数字的十六进制数>
定义常量:@1:使用 #define 预处理器
@2:使用 const 关键字。
---存储类:存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。
@1auto:是所有局部变量默认的存储类。auto 只能用在函数内,即 auto 只能修饰局部变量。
@2register:用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 'register' 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
@3static:指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。 static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。 static 是全局变量的默认存储类,以下两个变量
(count 和 road) 都有一个 static 存储类。
@4extern:extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候。
(auto 是局部变量的默认存储类, 限定变量只能在函数内部使用;
register 代表了寄存器变量,不在内存中使用;
static是全局变量的默认存储类,表示变量在程序生命周期内可见;
extern 表示全局变量,即对程序内所有文件可见,类似于Java中的public关键字;)
---运算符:(算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、杂项运算符){
@1:逻辑运算符--&&、||、!
@2:位运算符--&(与)、|、^、>>、<<
@3:杂项运算符--sizeof()、&、*、?:
}
--循环:while 循环、for 循环、do...while 循环、嵌套循环{
@1:循环控制语句:break 语句、continue 语句、goto 语句
@2:无限循环---for( ; ; )
}
--函数:返回类型、函数名称、参数、函数主体
--作用域规则:{ 局部变量、全局变量和形式参数
@1:局部变量的值会覆盖全局变量的值。
@2:当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化。
}
--数组:存储一个固定大小的相同类型元素的顺序集合。
--指针{--指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址。
@1使用指针: int *ip; /* 指针变量的声明 */ ip = &var; /* 在指针变量中存储 var 的地址 */
printf("Address stored in ip variable: %p\n", ip ); /* 在指针变量中存储的地址 */
printf("Value of *ip variable: %d\n", *ip ); /* 使用指针访问值 */
@2空指针:赋为 NULL 值的指针被称为空指针。NULL 指针是一个定义在标准库中的值为零的常量。程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。所以大多情况下要做非空判断。
}
--函数指针和回调函数{
@1:函数指针--是指向函数的指针变量。可以像一般函数一样,用于调用函数、传递参数。 声明:typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型
实例: /* p 是函数指针 */ int (* p)(int, int) = & max; // &可以省略
/* 与直接调用函数等价,d = max(max(a, b), c) */ d = p(p(a, b), c);
@2:回调函数--函数指针作为某个函数的参数,函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。 简单讲:回调函数是由别人的函数执行时调用你实现的函数。
// 回调函数: void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) { }
}
--字符串{
@1:在 C 语言中,字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。 字符串操作函数。。。
}
--结构体{
@1定义:C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。 struct 语句定义了一个包含多个成员的新的数据类型。
@2访问结构成员:使用成员访问运算符(.)。
struct Books{ char title[50]; char author[50]; char subject[100]; int book_id; };
struct Books Book1; /* 声明 Book1,类型为 Books */
/* Book1 详述 */ strcpy( Book1.title, "C Programming"); Book1.book_id = 6495407;
/* 输出 Book1 信息 */ printf( "Book 1 title : %s\n", Book1.title);
@3结构作为函数参数: /* 函数声明 */ void printBook( struct Books book ); printBook( Book1 );
@4指向结构的指针: 定义指向结构的指针,方式与定义指向其他类型变量的指针相似--struct Books *struct_pointer;
指针变量中存储结构变量的地址:struct_pointer = &Book1;
使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符:struct_pointer->title;
实例: /* 函数声明 */ void printBook( struct Books *book );
struct Books Book1; /* 声明 Book1,类型为 Books */
/* 通过传 Book1 的地址来输出 Book1 信息 */ printBook( &Book1 );
@5:位域
}
--共用体{
@1说明:共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
@2定义:使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。
union Data{ int i; float f; char str[20]; } data;
@3访问共用体成员: union Data data; data.i = 10; strcpy( data.str, "C Programming"); printf( "data.i : %d\n", data.i);
}
--位域{ 如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量。
@1定义位域:/* 定义位域结构 */ struct{ unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2;
@2位域声明:struct{ type [member_name] : width ;}; 带有预定义宽度的变量被称为位域。
}
--typedef{
typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE: typedef unsigned char BYTE; ---- BYTE b1, b2;
typedef vs #define --#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
@1:typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
@2:typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
}
--输入 & 输出{
标准文件:
C 语言中的 I/O (输入/输出) 通常使用 printf() 和 scanf() 两个函数。 scanf() 函数用于从标准输入(键盘)读取并格式化, printf() 函数发送格式化输出到标准输出(屏幕)。
@ 格式化数据形式: %d 格式化输出整数 %f 格式化输出浮点型数据