请看先看下面,猜猜会有什么样的结果!
void B(char*);
void D(char*);
void A()
{
char * p = new char[20];//(char*)malloc(20);
B(p);
cout <<"in A, address=" <<(long) p << endl;
cout <<"in A, content=" << p << endl;
delete(p);
}
void B(char * p)
{
memcpy(p,"aaa",3);
cout << "in B, address=" << (long)p << endl;
cout << "in B, content=" << p << endl;
}
void C()
{
char * p = 0;
D(p);
cout <<"in C after call D, address=" <<(long) p << endl;
cout <<"in C after call D, content=" << p << endl;
free(p);
}
void D(char* p)
{
p = (char*) malloc(20);
memcpy(p,"aaa",3);
cout << "in D, address=" << (long)p << endl;
cout << "in D, content=" << p << endl;
}
int main()
{
A();
cout << "-----" << endl;
C();
}
为什么A调B可以获取指针参数所指内容,而C调D无法获取内容?
---------------------------------------------------------------
void D(char*& p);
---------------------------------------------------------------
因为D接受的是一个“指针值参”(C不支持变参类型),所以你在D中对p的赋值不会影响C的的变量。
改为:
void D(char** p)
{
*p = (char*) malloc(20);
memcpy(*p,"aaa",3);
cout << "in D, address=" << (long)*p << endl;
cout << "in D, content=" << *p << endl;
}
void C()
{
char * p = 0;
D(&p);
cout <<"in C after call D, address=" <<(long) p << endl;
cout <<"in C after call D, content=" << p << endl;
free(p);
}
也就是用指针实现“变参”的方法。
---------------------------------------------------------------
因为c是传值而不是传地址的
void D(char* p)
{
p = (char*) malloc(20); //被重新赋值但无法返回。
memcpy(p,"aaa",3);
cout << "in D, address=" << (long)p << endl;
cout << "in D, content=" << p << endl;
}
改为:
char * D()
{
p=...
return p;
}
void C()
{
char * p = 0;
p= D();
...
}
---------------------------------------------------------------
因为c是传值而不是传地址的
void D(char* p)
{
p = (char*) malloc(20); //被重新赋值但无法返回。
memcpy(p,"aaa",3);
cout << "in D, address=" << (long)p << endl;
cout << "in D, content=" << p << endl;
}
改为:
char * D()
{
p=...
return p;
}
void C()
{
char * p = 0;
p= D();
...
}
---------------------------------------------------------------
或者如snipersu所说使用引用类型(只能在C++中使用)
---------------------------------------------------------------
用char*传递参数,实际上是传递了指针的副本。如果修改指针所指的内容,则函数调用结束后内容自然保存了变化。如果是修改了指针,则实际上是修改了指针副本本身,此时再修改其所指值,则显然不是修改的原来地址处的内容,所以函数结束后也没有看到内容变化。D中使用malloc改变了指针副本所指向的单元。
如果要想在被调函数中分配空间,赋值后希望调用方能获取内容,应该使用char**类型做参数。
---------------------------------------------------------------
因为在函数中传指针(如:p)的话,实际上是函数建立一个指针指向p所指的地方,由于才C中p是个空指针,所以虽然在D中让D的p指向了分配的空间但在C中的p还是指向空的。