C语言指针进阶:二级指针、void与volatile的实战解析

1. 二级指针:指针的指针,到底有什么用?

记得我刚学C语言那会儿,遇到二级指针就头疼。什么指向指针的指针,绕来绕去简直像绕口令。直到后来做嵌入式开发,真正用上了才发现,这玩意儿真是神器!

二级指针其实就是存储指针变量地址的指针。比如我们定义一个普通整型变量 int a = 10;,然后用一级指针 int *p = &a; 指向它。这时候如果还想有个指针指向p,那就需要二级指针了:int **pp = &p;

在实际项目中,二级指针最常用的场景就是需要修改指针本身的值的时候。比如说你在函数内部想要改变外部指针的指向,这时候传一级指针的地址(也就是二级指针)就派上用场了。

我举个实际遇到的例子。之前做嵌入式设备的内存管理,需要动态分配多个缓冲区。用二级指针来管理这些缓冲区的指针数组,修改起来特别方便:

void allocate_buffers(char ***buffers, int count, size_t size) {
    *buffers = (char**)malloc(count * sizeof(char*));
    for(int i = 0; i < count; i++) {
        (*buffers)[i] = (char*)malloc(size);
        memset((*buffers)[i], 0, size);
    }
}

// 使用时
char **my_buffers = NULL;
allocate_buffers(&my_buffers, 5, 1024);  // 这里传二级指针才能修改my_buffers的值

这种用法在嵌入式开发中特别常见,尤其是需要动态管理多块内存的时候。如果不传二级指针,函数内部根本无法修改外部的指针变量。

2. void指针:C语言中的"万能钥匙"

void指针可能是C语言里最包容的指针了——它能指向任何类型的数据,简直就是指针界的万金油。但这也是最容易用错的地方,很多初学者在这里踩坑。

void指针的定义很简单:void *ptr;。它可以指向int、char、float,甚至结构体,任何类型都能塞进去。但有个重要的限制:不能直接对void指针进行解引用和算术运算。

为什么不能直接解引用?因为编译器不知道它指向的数据类型有多大。比如int是4字节,char是1字节,解引用时取多少字节?编译器没法判断,所以必须显式类型转换。

我在实际开发中经常用void指针来写通用函数。比如下面这个例子,一个通用的数据交换函数:

void swap(void *a, void *b, size_t size) {
    unsigned char *p = (un
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值