C++ 通过引用传递指针—;无法更改值

C++ 通过引用传递指针—;无法更改值,c++,pointers,reference,C++,Pointers,Reference,我读过很多关于通过引用向函数传递指针的主题,但我真的找不到答案。问题是,在我通过引用传递指针并更改其值后,在离开函数后,原始指针的值不会更改。我真的被它缠住了。请帮帮我!你是我唯一的希望 顺便说一句,我粘贴的代码与我需要处理的代码相同,我无法真正更改函数的调用。 代码: 以及调用此函数: void *ptr; f((char *)&ptr); 我将非常感谢任何帮助 您的函数声明需要通过引用传递指针,如下所示: void f(char *&p) {...} 问题是,在我通过引用

我读过很多关于通过引用向函数传递指针的主题,但我真的找不到答案。问题是,在我通过引用传递指针并更改其值后,在离开函数后,原始指针的值不会更改。我真的被它缠住了。请帮帮我!你是我唯一的希望

顺便说一句,我粘贴的代码与我需要处理的代码相同,我无法真正更改函数的调用。 代码:

以及调用此函数:

void *ptr;
f((char *)&ptr);

我将非常感谢任何帮助

您的函数声明需要通过引用传递指针,如下所示:

void f(char *&p) {...}
问题是,在我通过引用传递指针并更改其值后,在离开函数后,原始指针的值不会更改

您不是通过引用传递。这需要有一个函数签名,如

void f(char *&p){
          // ^
您的代码原样仅更改
p
的值参数副本:

p = np;    

你的问题不清楚,所以我需要猜猜这个问题。我猜问题是你不能改变函数的签名或调用

void f(char* p);
...
void *ptr;
f((char *)&ptr);
你想改变f的主体,它会改变ptr,指向f主体中的文本。如果我猜对了问题,答案是:

void f(char* p)
{
   *((char**)(p)) = "aaaaaaaaaaaaaaaaa";
}
如果我猜错了问题,请问得更清楚些


在调用中,您已将void**强制转换为char*,删除了一个间接级别,然后在函数内部将该间接级别强制转换回,同时将最终目标从void更改为char。这并不像看上去那么奇怪(或者我会对你的问题有不同的猜测)。在char*中转换内容可能有助于解决别名问题(否则编译器可能会优化整个操作)。所以也许你的问题是合法的。但这已经够难看了,必须有更好的方法。

ISO C++11不允许从字符串文字转换为“char*”。在询问“高级”之前,请先阅读一些书,为什么要将其标记为C?C中不存在引用。愚蠢的用户界面,意味着标记为重复,按enter键,我会发送一个我不想发送的标志……如果
ptr
void*
,那么
&ptr
void**
。将它转换成<代码> char */COD>并没有什么意义。更不用说C中没有传递引用。虽然初始语句可能有点误导,但是这个答案显示C和C++都是正确的语法,所以为什么要下投票?@副磁力仪删除了那个部分。他是“通过引用传递指针”。在C意义上的那个短语(这个短语在C++被发明之前意味着什么)。这种C++代码可以在C++中使用,但是,通过C++的存在,用于描述代码的术语(即使在C中)也不正确。相反,他正在传递一个伪装成字符的
something**
,需要再次使用伪装的
something**
。@JSF是的,然后呢?这不会改变使用引用的意义。传递那个地址是错误的,不能解决主要问题,地址没有返回。是的,它确实有效,谢谢你的回答,但正如我所说的,我不能真正改变函数获取参数的方式和声明ptr的方式。@Michal那么你不能通过引用传递,你的问题没有任何意义。注意:这不需要对调用方进行任何更改!“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!但我相信你是对的!如果我在进行内外测试,本地人会说:“0x001ecc72{ConsoleApplication.exe!string'}”aaaaaaaa“。所以它似乎起作用了。非常感谢。是的,我知道你问题中的“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。我想你现在理解了答案的关键部分,那就是回到**并通过该转换分配。通过引用传递指针是一个非常具体的C++,与你所做的非常不同。所以在C问题上使用这个短语和C++标记会导致你不想要的答案。再次感谢你!
void f(char* p)
{
   *((char**)(p)) = "aaaaaaaaaaaaaaaaa";
}