我遇到了问题。我尝试更改指针,但指针不会改变。 这是我的代码:
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 ++代码。
答案 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;
}