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;
}
如果要更改某个变量,则需要传递该变量的地址。在函数调用期间更改它指向的对象没有任何帮助-当函数返回时,堆栈变量仍然会被清除。