-1

我遇到了问题。我尝试更改指针,但指针没有更改。这是我的代码:

 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

4 回答 4

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”一次以获取指向字符的指针

*point = new char[10]

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

char* TestPoint()
{
    char point = new char[10];
    return point;
}
于 2013-10-30T03:10:27.107 回答
0

这是因为函数 TestPoint 接收变量的副本test,修改它(将指针分配给分配的内存)然后丢弃。char*例如,如果您想象用 替换int,事情可能会变得更清楚。

您可以做的最小更改是通过以下方式重写 TestPoint 签名

void TestPoint(char*& point)

从而test通过引用传递变量。这些在线课程可能会有所帮助。第 7.2 - 7.4 章是关于将参数传递给函数。

于 2013-10-30T02:41:16.910 回答
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;
}
于 2013-10-30T02:43:26.907 回答
0
void TestPoint(char** point)
{
    *point = new char[10];
}

int main(int argc, char* argv[])
{
    char* test = NULL;
    TestPoint(&test);
    /******/
    return 0;
}
于 2013-10-30T02:43:41.183 回答