博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份拷贝)
阅读量:7026 次
发布时间:2019-06-28

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

 

先看一个例子:这个程序为什么会崩溃?

1 #include 
2 #include
3 4 int f(int *q) 5 { 6 int a = 10; 7 q = (int*)malloc(sizeof(int)); 8 *q = a; 9 return 0;10 }11 12 int main()13 {14 15 int *p = NULL;16 f(p);17 printf("%d", *p);18 return 0;19 }

此处的q任然是p的一个拷贝,可以通过这个程序证明:

1 #include 
2 3 4 int f(int *q) 5 { 6 std::cout << &q << std::endl; 7 return 0; 8 } 9 10 int main()11 {12 int a = 10;13 int *p = &a;14 f(p);15 std::cout << &p;16 return 0;17 }

输出为:   ,    说明指针p与指针q的地址是不同的,证明q是p的一个拷贝。

 

所以第一个程序崩溃的原因:函数中的q其实是实参p的一份拷贝,函数中的操作都是对q进行的,p仍然是NULL,所以输出*p的值产生崩溃!

 

 

可以把形参改为二级指针,程序便可以按预想中的情形进行:

1 #include 
2 #include
3 4 int f(int **q) 5 { 6 int a = 10; 7 *q = (int*)malloc(sizeof(int)); 8 **q = a; 9 return 0;10 }11 12 int main()13 {14 15 int *p = NULL;16 f(&p);17 printf("%d", *p);18 return 0;19 }

 

转载于:https://www.cnblogs.com/FengZeng666/p/9477693.html

你可能感兴趣的文章
字符串的输入输出处理
查看>>
C# WinForm 禁止最大化、最小化、双击标题栏、双击图标等操作
查看>>
xtarbackup恢复
查看>>
用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
查看>>
glance rabbit
查看>>
JVM——Java虚拟机架构
查看>>
如何解决bib的一些问题
查看>>
适应手机端的jQuery图片滑块动画
查看>>
笔记本电池死而复生
查看>>
LINQ 图解
查看>>
日期和时间字符串格式化
查看>>
Python基础之range()
查看>>
springboot访问jsp页面
查看>>
UVALive5402 UVA579 Clock Hands【水题】
查看>>
CCF201512-4 送货(100分)
查看>>
oracle client安装(window版本)
查看>>
组件里传值到父级
查看>>
windows系统调用 遍历进程的虚拟地址
查看>>
centos7(linux)挂载ntfs格式的移动硬盘(转载)
查看>>
Python编程笔记(第一篇)Python基础语法
查看>>