指针的问题

oldbaby 2005-01-03 11:06:11
typedef map<string,pdata *> KeyType;

KeyType Keys;

bool GetData(const string key,pdata * p)
{
KeyType::iterator it;
it=Keys.find(key);
if(it==Keys.end())
return false;
p=(*it).second;
return true;
}
返回p=NULL
经carylin提示改为
bool GetData(const string key,pdata * p)
=》
bool GetData(const string key,ppdata ** pp)

p=(*it).second;
=>
*pp=(*it).second
测试通过

为什么传一个指针进去不行,而要传一个指针的指针?
...全文
124 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gambolgs 2005-01-04
  • 打赏
  • 举报
回复
打个搞笑的比方

如果你家保险柜是变量,传递给函数的值就是发张保险柜的照片,人家把你的照片改了你的东西还是好好的。
所以必须把名片(指针)给别人,上面有你家的地址,然后别人就可以顺着这个地址来把东西偷走。

如果你自己是一个接头人物,你家保险柜里装的是另一个人乙的保险柜的地址。现在有人想把你这条线索断掉,该怎么办呢?这时拿着乙的名片是没有用的,必须要你的名片。
iamwiner 2005-01-04
  • 打赏
  • 举报
回复
因为你要修改指针,和修改变量一样,得把它的指针传进去呀!
我也是初学见笑!
oldbaby 2005-01-04
  • 打赏
  • 举报
回复
明白了,其实是修改指针.一下子钻了牛角尖.
oyljerry 2005-01-04
  • 打赏
  • 举报
回复
需要修改指针,就要用指针的指针
HunterForPig 2005-01-04
  • 打赏
  • 举报
回复
哈,见到这样的问题了
其实这个问题有点像该
变量的值,就如把指针的指向的地址看成一变量值
如果想通过参数传递,那么肯定就的是一个指向此指针
的指针!
kchai1 2005-01-04
  • 打赏
  • 举报
回复
可以这么看,这个问题看你使用的目的了:

p-> | 10 | 001
| 20 | 003
p'->| 0 | 005

---------------------
如果你想改变的是指针指向地址的值,也就是10
那么你可以传递*p;但是如果你想改变的是指针
p的指向地址,也就是001,改为p'的地址话,那
么你必须传递**p。而你的问题中正是后者!
russule 2005-01-04
  • 打赏
  • 举报
回复
这是个返回值的问题,p=(*it).second把p的地址改变了,而不是仅仅改变p所指的值,要返回地址,只能用指针的指针。
hyamw 2005-01-04
  • 打赏
  • 举报
回复
bool GetData(const string key,pdata * p)
这个函数其实也是传值得做法,你只是把指针p的值传进去了。这个指针指向一个地址,所以这个地址里的东西是可以改变的。但是由于传入的是值,所以指针本身所指向的地址是不能改变的。要改变指针本身的内容,就需要传入这个指针本身的地址。
bool GetData(const string key,ppdata ** pp)
Mr-Chen 2005-01-04
  • 打赏
  • 举报
回复
应为你需要改变* p的内容,所以需要使用ppdata ** pp作为参数,道理同c++的一个入门程序
void switch(int a,int b)

int c;
c = a;
a = b;
b = c;


void switch(int a,int b)

int c;
c = a;
*a = b;
*b = c;
guangsan 2005-01-04
  • 打赏
  • 举报
回复
我猜测你是不是在前面有定义pdata为字符型。

对于字符串来说。
如果传得是指针,相当于传值;而只有传指针的指针才传的是地址。虽然语法上我的说法行不通,但事实上对于字符串来说就是这样。特别是你想在函数中修改字符串的值。
delphihero 2005-01-04
  • 打赏
  • 举报
回复
传指针的指针,你就指向了 map 表里面的pdata结构,并没有给这个指针的指针分配内存,修改这个指针会改变映射表中内容.

如果传指针,就要先给他分配内存,你的p = NULL,使没有内存不能执行值拷贝
pdata* p = NULL;
p = new pdata;
调用 bool GetData(const string key,pdata * p) 改为 *p=*((*it).second);
修改 p不会影响map表中内容

16,471

社区成员

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

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

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