关于(void**)&的理解
来源:互联网 发布:java服务器开发与c 编辑:程序博客网 时间:2024/06/04 17:59
转来的,照例,祭出原地址~
因为函数参数是按值传递的,所以要想改变变量,必须传递地址。
二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**。
(void**)&必须是本质上就是指针变量的地址才可以做这样的转换,并不是说把一个一级指针也可以转换,void**的本质是标识一个二级指针。
&data就是(默认数据类型 **)&data,(void **)&data和&data还是同一块内存,只不过数据类型发生变化了。
如果默认数据类型是int,&data就是(int **)&data
一级指针:
二级指针:
高级一点使用void**只是为了通用,可以交换各种类型。
注意char*是字符串指针,需要改变其对应的变量必须用地址,s1就是"abc"的起始地址,是不能被改变,要想改变s1必须用他的地址也就是&s1,所以需要void**:
(void**)& 本质
在看《算法精解 C语言描述》的双链表dlist.c的代码看到这样一段
算法精解:C语言描述\examples_unix\examples\chtbl\ex-1.c
算法精解:C语言描述\examples_unix\source\dlist.c
其实很简单:
data是指针变量;
&data是data指针变量的地址所以传递他就是void**
看下面这幅调试图就明白了,起始&data就是(int **)&data,(void **)&data和&data还是同一块内存,只不过数据类型发生变化了。
注意:原书有问题就是dlist_remove之后没有free()。
相对而言,redis那种风格的删除节点更好,因为是在函数体内释放节点的,而不是外面。关于二者的比较参考:
Redis:adlist.c
网上也有人遇到这个问题,人家自己写了个destroy函数,其实就是free
数据结构学习之双向链表结构 数据结构学习之单向链表结构补充说明:
element是链表结点,这个结点里含有个数据域data,它只是个指针变量,它指向的是应用层分配的空间,
*data指向的不是element内存,而是指向element中的data域,这个域是由应用层来管理的,即当element被删除时,其element内的data域应该保存由应用层开发人员负责释放。
element是DListElmt的一个变量,变量内含有个data指针域, 接口的data域是二级指针,这两个不要混淆了.element被删除后,其data域本身所占用的资源被回收(因为是指针,占4字节),但是并不意味着data所指向的资源也被回收,这是不同的两个概念.
*data = element->data; 这句话将element内data域所指向的物理内存地址记录下来,返回给应用层处理.
《算法精解》这个哈希表的例子作者是给出了删除后要free的代码:
C语言描述\examples_unix\examples\chtbl\ex-1.c
其实在作者的代码结尾dlist_destroy函数也说明这一点:
算法精解:C语言描述\examples_unix\examples\chtbl\ex-1.c
算法精解:C语言描述\examples_unix\source\dlist.c
- 关于(void**)&的理解
- 关于typedef void (*sighandler_t)(int)的理解
- 关于(void**)及其相关的理解
- 关于typedef void (*sighandler_t)(int)的理解
- 关于operator void*()和bool operator !()的一点理解
- (*(void (*)( ) )0)( )的理解
- (void)0的理解
- void 0 的理解
- javascript:void()的理解
- 关于typedef和define的一种理解方式,typedef void(*Fun)(void);
- 关于c语言声明 void (*signal(int sig, void(*func)(int)))(int)的理解
- 对 void *(* func)(void *) 的理解
- static void SetSysClockTo72(void)的一些理解
- 关于void的使用
- 关于void main(void)的错误
- 关于void*与void**的区别
- 关于typedef int (init_fnc_t) (void);理解
- 对于(void*)0 的理解
- 信号量详解
- debug到手软的筛法,输出条件很重要。
- JAVA基础(一)------认识JAVA
- FFmpeg源码分析。
- 神奇的计算机画图学
- 关于(void**)&的理解
- Permission denied: user=administrator, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
- populating-next-right-pointers-in-each-node-ii
- VIM基本命令
- 第9届北信校赛
- [生产力工具]Mysql入门
- 计算圆的面积
- Swift UIScrollView 属性及代理方法
- [LeetCode] 4. Median of Two Sorted Arrays