有关指针的一个小问题——传参和修改
2013-12-19 11:00
148 查看
假如定义一个函数,只有一个指针做参数,如果我们希望通过这个参数获取返回值,怎么来写这个函数?
一般我们直接想到的会是:
然后进行调用:
这种调用是无效的,很有可能会出现乱码,在函数内对形参进行修改并不能真正地修改形参的值,问题就出在GetMemory()函数的形参。
正确的定义方式是:
这样的话,在函数内对指针分配内存的操作即能正常进行,最后调用Test()函数也能成功输出”hello,world”。这又要说回指针和引用的问题。
这两者之间区别的讨论网上千千万万,园里也看到有人写得很好的一篇:
http://www.cppblog.com/mzty/archive/2006/07/07/9531.html
所以就不再多做介绍了,那篇博文最后一句话总结得很好:
“函数的参数进行值拷贝,即使传的是指针,也的对指针(即指针里存的地址)的拷贝。”
不过这位仁兄到最后也是没有详细讲解二维指针的问题,其实对于二维指针(或者指针数组)我也只是懂一点。仅仅是知道怎么使用,但是对于它为什么能够成功地从函数中返回参数感到非常奇怪。希望高手看到这篇渣文能够给予指教。。。。。。
一般我们直接想到的会是:
void GetMemory(char *p) { p = new char[20]; }
然后进行调用:
Void Test() { char * str = NULL; GetMemory(str); strcpy(str,"hello,world"); cout<<str<<endl; delete str; str = NULL; }
这种调用是无效的,很有可能会出现乱码,在函数内对形参进行修改并不能真正地修改形参的值,问题就出在GetMemory()函数的形参。
正确的定义方式是:
void GetMemory(char *&p) { p = new char[20]; }
这样的话,在函数内对指针分配内存的操作即能正常进行,最后调用Test()函数也能成功输出”hello,world”。这又要说回指针和引用的问题。
这两者之间区别的讨论网上千千万万,园里也看到有人写得很好的一篇:
http://www.cppblog.com/mzty/archive/2006/07/07/9531.html
所以就不再多做介绍了,那篇博文最后一句话总结得很好:
“函数的参数进行值拷贝,即使传的是指针,也的对指针(即指针里存的地址)的拷贝。”
不过这位仁兄到最后也是没有详细讲解二维指针的问题,其实对于二维指针(或者指针数组)我也只是懂一点。仅仅是知道怎么使用,但是对于它为什么能够成功地从函数中返回参数感到非常奇怪。希望高手看到这篇渣文能够给予指教。。。。。。
相关文章推荐
- 有关new出一个指针,将该指针指向另一个指针,释放不掉的问题
- 翻译《有关编程、重构及其他的终极问题?》——6.当把一个指针明确的转换为整型时,请检查所有相关代码
- 一个鼠标指针有关的启发(存在问题,可以参考一下 呵呵)
- 一个鼠标指针有关的启发(存在问题,可以参考一下 呵呵)
- 怎么修改button切换选中状态的时候背景出现一个小蓝点的问题
- csdn一个有关影像处理问题帖子的解答
- 指针修改变量的值,以及指针交换两个数字的值的问题
- .Net有关问题。在GridView中添加了一个HyperLinkField,用来显示显示详细信息,请教跳转后的详细信息页面该怎样写代码
- 关于js修改css属性的一个小问题
- C语言中一个指针传递问题的分析
- C指针的一个问题
- 解决一个吐血问题,在winform编程中修改控件的X,Y坐标值,并不能修改控件的位置
- 一个指针转换引起的问题及谈起”高位优先,低位优先”
- 解决tomcat 热部署问题,避免每次修改某一个小部分代码就得重启一次项目。浪费时间
- 有关 Fabonacci 和 Fabonacci质数 数列的的一个问题
- C中指针传递的一个错误--二级指针的传值问题
- 有关mysql修改密的一点问题
- 一个函数重载问题—指针和整数问题
- 一个有关C语言浮点数保留2位小数的操蛋问题
- 关于一个指针取值的问题