二级指针学习心得

来源:互联网 发布:水上电动滑板 淘宝 编辑:程序博客网 时间:2024/06/06 16:28

今天在修改以前写的代码的时候遇到了一个问题,我想通过timer_fresh_func 函数去修改指针*head指向的地址,但是,实际的结果是*head指向的地址并没有发生什么改变。在思考的时候我的脑中蹦出了二级指针这个东西。

void timer_fresh_func(user_timer_t *ctx, user_timer_t *node){    ctx = node;}user_timer_t *head;user_timer_t timer;timer_fresh_func(head, &timer);

在我的理解中,指针在C语言中是一种特殊的数据类型,相较其他的数据类型(整型、浮点型等)来说,指针型量所保存的数据是其指向的变量(变量、函数等)在内存中的地址。*符号则是用于读取该地址所保存的数据,指针的类型决定了CPU从该地址中读取空间的大小。同理,二级指针也是指针,只不过它是一种指向指针的指针。
为什么在上面的程序中head所指向的地址最终没有改变,实际上原因十分简单。ctx在执行到ctx = node; 之前它指向的地址是head,在执行完ctx = node; 之后它指向的地址是node,在这中间只有ctx指向的地址发生了变化,与head并没有什么关系。
上面的那段程序等效于下面这段程序。

user_timer_t *ctx = head;user_timer_t *node;ctx = node;

二级指针是一种能够指向指针的指针,然而它本身还是指针,二级指针所保存的数据是它所指向的指针在内存中的地址,而它所指向的指针保存的是其指向的变量在内存中的地址(有点像链表)。为了改变指针head所指向的地址,我们只需要修改二级指针所指向的一级指针所保存的数据(保存的变量地址)就能够改变head的地址了。所以程序只要修改成这样就能够完成目的了。理解了这些二级指针其实很简单!

void timer_fresh_func(user_timer_t **ctx, user_timer_t *node){    *ctx = node;}user_timer_t *head;user_timer_t timer;timer_fresh_func(&head, &timer);
0 0
原创粉丝点击