c函数参数中的一级指针和二级指针作用区别
先来看一个最常用函数模型,函数func()参数为一个uint8_t 的指针类型,那这个函数有什么作用?
1 2 3 4 5 6 7 8 9 10 11 |
uint8_t data1[3]; void func(uint8_t *p) { p[0]=0x01; p[2]=0x02; } void main() { uint8_t *p1=data1; func(data1); } |
- 在main函数中先定义了一个指针p1,然后把p1指向了一个数组data1。
- 把p1作为参数传递进函数func()
- 结果也很容易猜到,就是data1中的值在func运行时被改变了,分别等于0x01,0x02
那我们就不难理解,指针作为参数传递进去,而函数内部就可以修改这个指针所指向的数据。如下图所示:
而这个就是一级指针,简单的可以看函数定义的参数带一个 “*” 号就是一级指针。p1就是一个一级指针传递进去,而传递进去以后就可以修改这个一级指针所指向的地址的数据,也就是data1。
假如我想修改p1所指向的地址,该怎么办?
如下如所示,现在我想让p1不再指向data1,而是指向data2
这个很明显用上面的一级指针作为参数已经实现不了,它只能修改p1所指向的地址的数据,而现在是要修改p1本身让他指向data2。有的小伙伴可能已经能猜到,p1指向data1我们可以修改data1,那再用一个指针指向p1不就是可以修改p1了。
那这里我们就可以定义一个指针的指针pp1,让他指向p1,这样把pp1传入到函数中,函数内部就可以修改p1的值了。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
uint8_t data1[3]; uint8_t data2[3]; void func2(uint8_t **pp) { *p=data2; } void main() { uint8_t *p1=data1; uint8_t *pp1=&p1; func(pp1); } |
这里传入的pp1就是一个二级指针,而func2的参数也是带两个星号。
那二级指针也就不难理解了,他可以修改指向的指针,也就是修改pp1指向的指针p1的值,让p1可以指向另外一块内存。
那实际上一般在使用的时候可能大部分都会省略掉这个pp1而使用更简便的写法:
1 2 3 4 5 6 |
void main() { uint8_t *p1=data1; func(&p1); } |