博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针用作传出参数时,需要二级指针
阅读量:6857 次
发布时间:2019-06-26

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

1. 参数传递的原则是:形参传给实参,不能反向传递;

2. 一级指针可以在函数内部修改形参指针指向的内容;

如:

void fun(char *p) {     p[2] = a;//由形参(实参)指向的函数外部的数组的内容就被改变了。}

 

如果我们想改变实参本身呢?也就是说,我们连指针值都要改变,如果使用:

 

void GetMemory(int num, char *p) {     p = (char *)malloc(num * sizeof(char))    //或C++中:p = new char[10];}

 

就不行了,因为在函数内部不能通过改变形参的值来改变实参

 

但是,可以通过二级指针来改变指针值。

void GetMemory(char **p, int num){     *p = new char[num];     *p[2] = a;     delete char[];}

 

 

关键是:

 

1. 编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。

在本例中,_p申请了新的内存,只是把 _p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。

如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,
2. 变量作函数形参调用的时候都是要分配一个副本,不管是传值还是传址。传入后就和形参没有关系了,它不会改变形参的值。

 

注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。

你定义了一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数栈中的内存会被释放掉,不要让指针指向此函数栈中的内存空间,要指向堆上或此函数外的内存空间。

 

转载于:https://www.cnblogs.com/tianlangshu/p/5385195.html

你可能感兴趣的文章
Jeff Bean谈Flink与流式处理的5大新发现
查看>>
Node常用命令备忘
查看>>
阿里云ECS上CentOS系统配置从入门到进门
查看>>
如何使用一条语句执行mkdir和cd命令
查看>>
Android笔记:存储相关,getExternalCacheDir, getExternalFilesDir,getExternalStorageDirectory等
查看>>
LAMP 全功能编译安装 for CentOS6.3笔记
查看>>
Apache - AH01630
查看>>
试着写写Map/Reduce程序
查看>>
一种被忽视的攻击方式-padding oracle
查看>>
硬盘MBR常识和修复MBR的方法解析
查看>>
Lync 客户端功能对比之会议支持
查看>>
初步了解Docker容器(三)
查看>>
部署无需边缘提供外部访问的Lync Server前端
查看>>
安装、部署DPM 2012 R2服务器
查看>>
内核中的UDP socket流程(8)——udp_sendmsg
查看>>
大数据实战之环境搭建(三)
查看>>
Linux架设Jsp环境
查看>>
XenApp_XenDesktop_7.6实战篇之九:SQL Server数据库服务器规划及部署
查看>>
ExtJS样例总结 -1
查看>>
IT-标准化-系列-10.在VPC 2007中快速部署操作系统-下
查看>>