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

1419

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



