C++ 传输方法中的指针错误(c+;+;)

C++ 传输方法中的指针错误(c+;+;),c++,C++,我遇到了一个问题。我试图更改指针,但指针没有更改。 这是我的密码: void TestPoint(char* point) { point=new char[10]; } int main(int argc, char* argv[]) { char* test=NULL; TestPoint(test); **//At this point the "test" is still null,why ?** return 0; } 对不起,我的英语很差,我不知道如何插入C++

我遇到了一个问题。我试图更改指针,但指针没有更改。 这是我的密码:

 void TestPoint(char* point)
{
point=new char[10];
}
int main(int argc, char* argv[])
{
  char* test=NULL;
  TestPoint(test);
  **//At this point the "test" is still null,why ?**
  return 0;
}

对不起,我的英语很差,我不知道如何插入C++代码。p> 这是因为函数TestPoint接收
test
变量的副本,修改它(将指针分配给分配的内存),然后丢弃。如果您设想用例如
int
替换
char*
,事情可能会变得更清楚

您可以做的最小更改是用以下方式重写测试点签名

void TestPoint(char*& point)

因此,通过引用传递
测试
变量。这些可能会有所帮助。第7.2-7.4章是关于向函数传递参数的。

试试这个,传递指针的地址

void TestPoint(char** point)
{
    *point=new char[10]; //assign to location at point
}
int main(int argc, char* argv[])
{
    char* test=NULL;
    TestPoint(&test);
    printf("test: %x\n",test);
    return 0;
}

一个更多的C++习语将通过引用,

void TestPoint(char* &point)
{
    point=new char[10]; //assign to point reference
}
int main(int argc, char* argv[])
{
    char* test=NULL;
    TestPoint(test);
    printf("test: %x\n",test);
    return 0;
}

想象你要去机场

你拿起一张纸,写下你需要去哪个航站楼,哪个航班和座位

你叫出租车去机场。出租车公司问你“哪个终点站”。你查阅你的文件,告诉他们“终端3”。在旅途中,你告诉你的司机你要飞往巴黎,他告诉你“哦,你真的想去1号航站楼,那会快得多”

你让他带你去1号航站楼。你坐飞机,在巴黎呆一周,然后飞回家。当你打开包装时,你会发现原来的那张纸

上面写的是1号航站楼还是3号航站楼

这是一个“传递值”的例子,C和C++指针实际上是与其他任何变量一样的变量。“3号航站楼”是一个指针,是机场某个地方的地址0x073AF10'是一个32位整数值,但也可能是内存中存储我的信用卡号的位置的地址。如果我告诉你“终端3”,我正在通过值传递我需要的终端地址

这行代码:

void TestPoint(char* point)
  TestPoint(test);
声明一个名为“TestPoint”的函数。每当调用此函数时,计算机将为“char*”指针保留新的存储空间,并且您将能够在代码中使用变量名“point”引用该存储空间。存储将在堆栈上,当您离开函数时,堆栈向上“展开”,变量消失

这行代码:

void TestPoint(char* point)
  TestPoint(test);
调用函数测试点,将变量“test”的值传递给它。您在TestPoint中看到的与“test”不同,它是您输入TestPoint时test值的副本

指针基本上是变量,就像其他任何变量一样,有一个稍微特殊的契约,可以让你对它们做一些额外的魔法——你和计算机同意它们将包含事物的内存位置

您需要的是指针本身的地址:

TestPoint(&test)
TestPoint需要使用指向字符的指针

void TestPoint(char** point)
*point = new char[10]
在TestPoint中,您需要取消对“point”的引用一次,以获得指向char的指针

void TestPoint(char** point)
*point = new char[10]
或者,您可以让TestPoint不带任何参数并返回一个指针值

char* TestPoint()
{
    char point = new char[10];
    return point;
}
如果要更改某个变量,则需要传递该变量的地址。在函数调用期间更改它指向的对象没有任何帮助-当函数返回时,堆栈变量仍然会被清除。