二级指针学习心得

2016-12-02 12:52:58来源:网络收集作者:码农伯伯人点击

第七城市

今天在修改以前写的代码的时候遇到了一个问题,我想通过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,在这中间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);
第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台