博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再看传指针
阅读量:4656 次
发布时间:2019-06-09

本文共 1480 字,大约阅读时间需要 4 分钟。

#include
#include
void getMemery(int *pt){ printf("pt=%p\n",pt); printf("&pt=%p\n",&pt); /*申请1024个int大小*/ pt = malloc(sizeof(int) * 1024); if (NULL == pt) { printf("malloc failed\n"); pt = NULL; }}int main(void){ int *p = NULL; printf("address of &p is %x\n", &p); getMemery(p); printf("address of p is %p\n", p); return 0;}

 如果是为指针p申请一段内存,上面的代码能达到目的吗? 

通过前面的内容分析,肯定是达不到预期效果的。

运行结果:

这是为什么呢?我们还是利用前面所知来分析,由于传递给getMemory函数的参数都是一个副本,因此函数内的p也是外部p的一个副本,因此即便在函数内部,将p指向了一块新申请的内存,仍然不会改变外面p的值,即p还是指向NULL。

 

 上面的代码 指示把指针p的值NULL传给了pt,一开始我打印了,数值和地址就一目了然了。

其实这两个指针是相互独立的,在内存中是相互独立的。pt申请了1024,不代表p就申请了。

 

如何修改呢?我们需要传入p的地址,即指向int类型指针的指针。

#include
#include
void getMemery(int **pt){ printf("pt=%p\n",pt); printf("&pt=%p\n",&pt); /*申请1024个int大小*/ *pt = malloc(sizeof(int) * 1024); if (NULL == *pt) { printf("malloc failed\n"); *pt = NULL; }}int main(void){ int *p = NULL; printf("address of &p is %x\n", &p); getMemery(&p); printf("address of p is %p\n", p); free(p); p = NULL; return 0;}

  

从运行结果可以看到,p的值被改变了,而不再是初始的NULL。

可配合下面的图进行理解

 int *p; 说明p申请了一个int 指针,&p说明p的地址是0x60fdb8,

int **p; 二级指针,pt保存的是p的地址,0x60fdb8,

*pt=*(&p)=p,就是对p进行操做了。 

总结

本文总结如下:

  • 函数的参数都是原数据的“副本”,因此在函数内无法改变原数据

  • 函数中参数都是传值,传指针本质上也是传值

  • 如果想要改变入参内容,则需要传该入参的地址(指针和引用都是类似的作用),通过解引用修改其指向的内容

  • 以上结论不限于C语言

部分文字转载自

转载于:https://www.cnblogs.com/CodeWorkerLiMing/p/11450914.html

你可能感兴趣的文章
Some configure
查看>>
流量调整和限流技术 【转载】
查看>>
1 线性空间
查看>>
VS不显示最近打开的项目
查看>>
DP(动态规划)
查看>>
chkconfig
查看>>
2.抽取代码(BaseActivity)
查看>>
夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
查看>>
反射的所有api
查看>>
css 定位及遮罩层小技巧
查看>>
[2017.02.23] Java8 函数式编程
查看>>
sprintf 和strcpy 的差别
查看>>
JS中window.event事件使用详解
查看>>
ES6深入学习记录(一)class方法相关
查看>>
C语言对mysql数据库的操作
查看>>
INNO SETUP 获得命令行参数
查看>>
HTML5与CSS3权威指南之CSS3学习记录
查看>>
docker安装部署
查看>>
AVL树、splay树(伸展树)和红黑树比较
查看>>
多媒体音量条显示异常跳动
查看>>