有关指针变量传递的问题?

ismycxp 2008-05-29 04:12:43
加精
void CDlgTestDlg::OnButton1()
{
TCHAR* arr="1";
test(arr);
MessageBox(arr); //弹出1
}

void CDlgTestDlg::test(TCHAR* pChar)
{
pChar="2"; //这里修改了值
MessageBox(pChar); //弹出2,已经修改了值,它传递的是地址啊,为什么上面还是弹出1呢?
}
...全文
2338 114 打赏 收藏 转发到动态 举报
写回复
用AI写文章
114 条回复
切换为时间正序
请发表友善的回复…
发表回复
liaojihei08S 2009-02-11
  • 打赏
  • 举报
回复
我是菜鸟
SenerityChzr 2008-11-20
  • 打赏
  • 举报
回复
……
luyue720 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 crybird 的回复:]
世界上本没有传址,人云亦云的多了,就有了传址。

传址的本意是“传的值是地址”。
[/Quote]
enjoy_coding 2008-06-06
  • 打赏
  • 举报
回复
Mark...
tcchriszhao 2008-06-05
  • 打赏
  • 举报
回复
学习
zsycloud 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 zsycloud 的回复:]
这么快就变成“精”了?呵呵。
大家都还没有对48楼的三种方式进行讨论呢?呵呵。今天就算了吧。明天如果有空的话,再来说说这三种方法的异同。呵呵。

大家早点下班,做个好梦哦。据说天天加班熬夜会加速脑细胞的死亡的哦。呵呵。
[/Quote]

呵呵。总算找到帖子了,一个周末没有来,就找不着了(新手,不懂得怎么找)。呵呵。看来已经有很多大侠做出讲解了,我也就不再重复了。呵呵。
szjtyy 2008-06-04
  • 打赏
  • 举报
回复
***************************************************************************

思想决定行动,行动决定习惯,习惯决定命运.
程序员在深圳QQ群,交流产生思想碰撞.

部份专业群:
程序员在深圳c++群15195967
程序员在深圳英语学习群:23864353
程序员在深圳c++Ⅱ17409451
程序员在深圳嵌入式开发群37489763
程序员在深圳移动开发群31501597
程序员在深圳创业群33653422

部份高级程序员群:
高级群I:17538442
高级群II:7120862

部份初、中级程序员群:
第三群:2650485
第五群:29537639
第四群:28702746
第六群:10590618
第七群:10543585
第八群:12006492
第九群:19063074
第十群:2883885
第十一群:25460595
第十二群:9663807

深圳程序员QQ群联盟成立三年多,拥有三十个以上的QQ群,人数超二千多人,大量经验丰富的老手,成员从业于大公司(如微软、IBM,SUN,华为)、来自国内著名高校和研究院成员,和有丰富实践经验的高级程序员、系统分析员(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写操作系统),还有少数女程序员。推荐:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪6K以下的别加入) c++:15195967 mobile:31501597嵌入式:37489763
——————————————————————————————————————————
群内交流解决问题的方法,一般难以直接得到答案,问题的解决还是要靠自己。(授之以渔与授之以鱼的关系)。
*****************************************************************************
buffering 2008-06-03
  • 打赏
  • 举报
回复
讨论
kyothebest 2008-06-02
  • 打赏
  • 举报
回复
鉴于本帖过于强大,寡人决定先将其收押,以观后效!~!~!~~~~~~
karoto 2008-06-02
  • 打赏
  • 举报
回复
看了这么高手的回复。学习到不少东西了。
jiqing_gao 2008-06-02
  • 打赏
  • 举报
回复
学习
hb19820822 2008-06-02
  • 打赏
  • 举报
回复
挺不错的回复。。。其实主要是形参和实参的传递问题,值只能单向传递(实参到形参),所以形参里面的地址值并不能返回给实参。。
xiaoyu2545 2008-06-02
  • 打赏
  • 举报
回复
学习···
gwhdaxia 2008-06-02
  • 打赏
  • 举报
回复
mark回家慢慢看
  • 打赏
  • 举报
回复
顺便 100楼
  • 打赏
  • 举报
回复
世界上本没有传址,人云亦云的多了,就有了传址。

传址的本意是“传的值是地址”。
wzfxyer 2008-06-01
  • 打赏
  • 举报
回复
学习中,是不是100楼..
「已注销」 2008-06-01
  • 打赏
  • 举报
回复
跟参数的副本有关!
野男孩 2008-05-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 ismycxp 的帖子:]
void CDlgTestDlg::OnButton1()
{
TCHAR* arr="1";
test(arr);
MessageBox(arr); //弹出1
}

void CDlgTestDlg::test(TCHAR* pChar)
{
pChar="2"; //这里修改了值
MessageBox(pChar); //弹出2,已经修改了值,它传递的是地址啊,为什么上面还是弹出1呢?
}
[/Quote]

很多人都认为test(TCHAR* pChar)函数中,参数是指针传递,所以传递过程中没有对实参进行复制。实际上,这里仍然传递的是实参arr的拷贝。上面的代码我写一下函数调用过程中发生的变化:

const char* pTmp1 = "1"; //这里是编译器的行为,为常量字符串"1"分配空间
TCHAR* arr = pTmp1;
//test(arr);
//下面是test的执行过程
TCHAR* pChar = arr;
const char* pTmp2 = "2"; //同上
pChar=pTmp2; //注意:这里是将pChar指向了另一个const char*也就是"2"所在的地址。
//并不是改变了arr的地址的内容。
MessageBox(pChar);//显然这时候会弹出2,因为pChar指向"2"
//此时test(TCHAR* pChar)函数执行完毕,没有人对arr进行修改。
MessageBox(arr); //因为没有人对arr修改,所以这里显示"1"
yyunffu 2008-05-31
  • 打赏
  • 举报
回复
楼主问题实际上是这样的:
函数传递中,默认方式是传值,也就是传递的是实参的拷贝。
当在函数内部修改了指针的指向,实际只是修改了拷贝值,原始指针值并没有改变。
用二级指针或者指针引用可以解决该问题。

各位高手解释的很清楚了。
多多指教,呵呵!
加载更多回复(94)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧