最近在看LWIP,看到这样一个函数,因为LWIP做到尽可能的减少内存间复制的处理,所以通常是让应用层直接去操作协议层的netbuf,所以这个函数就是一个获取netbuf指针的函数。
可以看到入口参数是void** data。
函数内,buf->ptr->payload就是netbuf的指针
使用时
为什么要传入指针的指针去获取一个指针呢?直接一个指针不行吗?如下:
单纯设置为netbuf_data(struct netbuf *buf, void *dataptr, u16_t *len) 函数内 为 dataptr = buf->ptr->payload; 调用时netbuf_data(buf, data,&len);
这样是不行的,就好像你想从入口参数传入一个变量,让函数内可以改变变量的值。就是上个函数中的u16_t *len入口参数,不能传入u16 len,得传入len的指针。
同样的道理,如果要往一个函数中传入一个指针,使其可以被修改,就要传入指针的指针。
曾经我也尝试从入口参数去传入一个变量,使其在函数内修改,但是运行过后,完全不是想要的结果。
原因是,你往函数中传入一个变量,在函数内这个变量是一个随机地址,也就是说函数操作的不是这个变量本身的地址,结果当然是错误的。也就是说我要一个函数操作一个变量,我应该给这个变量的地址-也就是指针。
同样的,我要一个函数操作一个变量的地址,那我就要给这个变量的地址的地址-也就是指针的指针。 |