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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值