先来看一个最常用函数模型,函数func()参数为一个uint8_t 的指针类型,那这个函数有什么作用?

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的值了。
代码如下:

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而使用更简便的写法:

void main()
{
    uint8_t *p1=data1;
    func(&p1);
}

By DK45

发表评论

电子邮件地址不会被公开。 必填项已用*标注