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

时间:2013-10-30 02:34:22

标签: 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 ++代码。

4 个答案:

答案 0 :(得分:1)

想象一下,你要去机场

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

你打电话叫出租车去机场。出租车公司问你“哪个终端”。你查阅你的纸张并告诉他们“3号航站楼”。在旅程中,你告诉你的司机你要飞往巴黎,他告诉你“哦,你真的想去1号航站楼,它会更快”。

你让他带你到1号航站楼。你做你的航班,在巴黎度过一个星期并飞回家。当您打开包装时,您会找到原始纸张。

是说终端1还是终端3?

这是“按值传递”的示例,在C和C ++中,指针实际上与其他变量非常相似。 “3号航站楼”是指针,它是机场地点的地址。 '0x073aff10'是一个32位整数值,但它也可以是存储我的信用卡号的内存中的位置地址。如果我告诉你“3号航站楼”,我通过值传递了我需要的终端的地址。

这行代码:

void TestPoint(char* point)

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

这行代码:

  TestPoint(test);

调用函数测试点,将变量'test'的传递给它。您在TestPoint中看到的与'test'相同,它是您在输入TestPoint时的test值的副本。

指针基本上是变量,就像任何其他变量一样,只需要一些特殊的契约就可以让你用它们做一些额外的魔法 - 你和计算机都认为它们会包含事物的记忆位置。

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

TestPoint(&test)

和TestPoint需要一个指向指针的指针

void TestPoint(char** point)

并且在TestPoint中你需要取消引用“point”一次以获得指向char的指针

*point = new char[10]

或者,您可以让TestPoint不带参数并返回指针值。

char* TestPoint()
{
    char point = new char[10];
    return point;
}

答案 1 :(得分:0)

这是因为函数TestPoint收到test变量的副本,修改它(分配指向已分配内存的指针)然后丢弃。如果您想用char*取代int,事情可能会变得更加清晰。

您可以做的非常小的改变是以下列方式重写TestPoint签名

void TestPoint(char*& point)

因此通过引用传递test变量。这些online lessons可能会有所帮助。第7.2章到第7.4章是关于将参数传递给函数。

答案 2 :(得分:0)

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

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 :(得分:0)

void TestPoint(char** point)
{
    *point = new char[10];
}

int main(int argc, char* argv[])
{
    char* test = NULL;
    TestPoint(&test);
    /******/
    return 0;
}