C语言学习
#include "filename"和#include 之间的区别
它们的主要区别在于编译器查找头文件的路径和顺序不同。
#include “filename”
当使用引号形式时,编译器会按照以下顺序查找头文件:
1、当前源文件所在的目录:首先在与当前源文件相同的目录中查找。
2、用户指定的目录:查找通过编译器选项(如-I)指定的目录。
3、系统标准目录:最后在系统标准目录中查找。
这种形式通常用于包含用户自定义的头文件,如项目中的头文件。
#include
当使用尖括号形式时,编译器会按照以下顺序查找头文件:
1、系统标准目录:直接在系统标准目录中查找,跳过当前目录。
2、编译器指定的系统目录:查找编译器预定义的系统目录。
这种形式通常用于包含系统库或标准库的头文件,如stdio.h、stdlib.h等。
static–存储类说明符:
static关键字表示这个变量具有内部链接(internal linkage);这意味着该变量只在定义它的文件(翻译单元)内可见,不能被其他文件访问;它存储在静态存储区,程序运行期间一直存在
const–类型限定符:
表示这个变量是只读的,即常量一旦初始化后,就不能再修改它的值;表示这个变量是只读的,即常量
一旦初始化后,就不能再修改它的值
数组指针和指针数组之间的区别:
指针数组:
指针数组是一个数组,其元素都是指针。其声明方式如下所示:
int *ptr_array[5]; // 声明一个包含5个int指针的数组
其示例如下所示:
int a = 10, b = 20, c = 30, d = 40, e = 50;
int *ptr_array[5] = {&a, &b, &c, &d, &e};
// 访问元素
printf("%d", *ptr_array[0]); // 输出10
printf("%d", *ptr_array[1]); // 输出20
常见应用:
1、字符串数组
2、函数指针数组
3、多维数组的替换
数组指针
数组指针是一个指针,它指向一个数组。其声明方式如下所示:
int (*ptr_to_array)[5]; // 声明一个指向包含5个int的数组的指针
其示例如下所示:
int array[5] = {10, 20, 30, 40, 50};
int (*ptr_to_array)[5] = &array;
// 访问元素
printf("%d", (*ptr_to_array)[0]); // 输出10
printf("%d", (*ptr_to_array)[1]); // 输出20
常见应用:
1、处理多维数组
2、作为函数参数
结构体
结构体定义
结构体定义描述了结构体的类型和成员,通常在头文件中,如:
// 在 emv_test.h 文件中
typedef struct {
int socket_fd; // 套接字文件描述符
bool is_connected; // 连接状态
// 其他成员...
} RelayController;
结构体变量声明
结构体变量声明是根据已定义的结构体类型创建一个实例,如:
// 在 emv_test.c 文件中
static RelayController global_relay = {0};
结构体定义的两种方式:
1、不使用typedef(原始方式):
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
// 声明变量时必须使用 struct sockaddr_in
struct sockaddr_in server_addr;
2、使用typedef:
typedef struct {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
} sockaddr_in;
// 声明变量时可以直接使用别名
sockaddr_in server_addr;
memset函数:
是 C 语言编程中常用的内存操作函数之一,用于将一块内存区域设置为指定的值,负责设置(填充)空间的内容。malloc函数则是负责开辟(分配)空间。
sscanf函数:
从一个字符串中,按照指定的格式读取数据。
1、scanf:从键盘中读取数据
2、fscanf:从文件中读取数据
3、sscanf:从字符串读取数据
编译C语言:
在C语言编译过程中,每个.c文件都会被编译成一个对应的.o(目标文件)文件。
C语言编译的过程:
1、预处理:处理#include、#define等预处理指令
2、编译:将每个.c文件编译成对应的.o(目标文件)
3、链接:将所有.o文件链接在一起,生成最终的可执行文件
shell脚本:
shell是一个应用程序,它提供了用户与操作系统内核之间的交互界面。通过shell,用户可以向操作系统发送命令,操作文件系统,运行程序,以及执行各种系统任务。shell通常是一个命令行界面,用户可以在其中输入文本命令来执行各种任务。
常见的shell有sh、bash、csh、tcsh、ash等。
栈内存存放的变量类型:
1、局部变量
2、函数参数
3、函数调用时的返回地址
python使用C语言的.so动态库:
使用ctypes库进行导入,其加载动态库的操作如下所示:
import ctypes
# 加载动态库
lib = ctypes.CDLL('test.so')
# 调用C语言里的接口
lib.test()

5157

被折叠的 条评论
为什么被折叠?



