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

Pointer errors in the method of transmission(c++)

本文关键字:C++ 错误 指针 方法 传输      更新时间:2023-10-16

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

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

想象一下你要

去机场

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

你叫出租车去机场。出租车公司会问你"哪个航站楼"。您查阅您的纸并告诉他们"3 号航站楼"。在旅途中,你告诉你的司机你要飞往巴黎,他告诉你"哦,你真的很想去1号航站楼,它会快得多"。

让他带你去1号航站楼。你乘飞机,在巴黎呆一个星期,然后飞回家。当你打开包装时,你找到了原来的一张纸。

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

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

这行代码:

void TestPoint(char* point)

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

这行代码:

  TestPoint(test);

调用函数测试点,向其传递变量"test"的值。您在TestPoint中看到的内容与"test"不同,它是您输入TestPoint时测试值的副本。

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

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

TestPoint(&test)

并且 TestPoint 需要采用指针到指针到字符

void TestPoint(char** point)

在 TestPoint 中,您需要取消引用"点"一次才能到达指向字符的指针

*point = new char[10]

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

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

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

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: %xn",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: %xn",test);
    return 0;
}
void TestPoint(char** point)
{
    *point = new char[10];
}
int main(int argc, char* argv[])
{
    char* test = NULL;
    TestPoint(&test);
    /******/
    return 0;
}

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

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

void TestPoint(char*& point)

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