句柄到底是啥,句柄是一个地址吗

首页 > 数码 > 作者:YD1662024-06-23 17:03:47

为了使大家看的更清楚,代码简单修改一下

#include <stdio.h> #include <stdlib.h> #include <string.h> void getmemory(char *p) { p = (char *) malloc(100); strcpy(p,"www.zhiguoxin.cn"); printf("*p:%s &(*p):0x%x\r\n",p,&p); } int main() { char *str="www.baidu.cn"; getmemory(str); printf("str:%s &str:0x%x\r\n",str,&str); free(str); return 0; }

按照我们一般人的的想法,结果应该是:

p :www.zhiguoxin.cn &p :xxxxxxx str:www.zhiguoxin.cn &str:xxxxxxx

但是实际上结果是多少?

句柄到底是啥,句柄是一个地址吗(5)

完全没有变化,为了彻底解决这个问题,画了一个图,希望大家能够看的更加清楚一点。

句柄到底是啥,句柄是一个地址吗(6)

从这里可以看出来,在分配内存后,str与p就分道扬镳了,而str也还是指向www.baidu.cn。

如何修改呢?正确的是啥样的?

#include <stdio.h> #include <stdlib.h> #include <string.h> void getmemory(char **p) { *p = (char *) malloc(100); strcpy(*p,"www.zhiguoxin.cn"); printf("*p:%s &(*p):0x%x\r\n",*p,&(*p)); } int main() { char *str="www.baidu.cn"; getmemory(&str); printf("str:%s &str:0x%x\r\n",str,&str); free(str); return 0; }

编译运行,发现没问题。

句柄到底是啥,句柄是一个地址吗(7)

达到了我们想要的目的,字符串也得到了正常的拷贝。

如何解释?

函数中参数都是传值,传指针本质上也是传值,只不过它的值是指针类型罢了。如果想要改变入参内容,则需要传该入参的地址,通过解引用修改其指向的内容

这里的str的值就是*p的值,是多少?它们都是一个指针,就是保存的是一个地址,地址是多少?地址就是使用动态分配内存malloc函数分配的100字节的首地址。然后又使用strcpy()函数将hello world拷贝到*p里面。

这里面就涉及到了二级指针,首先str毫无疑问是一个指针变量对吧?那么&str是啥?理所当然就是一个指针的指针吧,就是地址的地址。

所以,我如果在某个地方申请了一块内存,如果想得到这块内存的首地址,而此时我们又定义了一个指针变量,想让这个指针来保存我们申请内存你的首地址,就必须要传入这个指针的地址,即指针的指针(二级指针)而不是传入这个指针。

至于原因上面的例子已经非常清楚的讲解了原因。

下面接着回到我们最开始的创建函数的任务句柄。在开始之前我们再把上面的函数封装一下。

句柄到底是啥,句柄是一个地址吗(8)

上一页123下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.