【发布时间】:2012-01-16 04:08:26
【问题描述】:
void func(char* buf) { buf++;}
我应该称之为通过指针传递还是只通过值传递(值是指针类型)?这种情况下传入的原始指针会被改变吗?
【问题讨论】:
标签: c++ pass-by-reference pass-by-value
void func(char* buf) { buf++;}
我应该称之为通过指针传递还是只通过值传递(值是指针类型)?这种情况下传入的原始指针会被改变吗?
【问题讨论】:
标签: c++ pass-by-reference pass-by-value
这是按值传递。
void func( char * b )
{
b = new char[4];
}
int main()
{
char* buf = 0;
func( buf );
delete buf;
return 0;
}
在调用func 后,buf 仍为 0,新的内存将泄漏。
当您通过值传递指针时,您可以更改指针指向的内容而不是指针本身。
做上述事情的正确方法是
备选方案 1
void func( char *& b )
{
b = new char[4];
}
int main()
{
char* buf = 0;
func( buf );
delete buf;
return 0;
}
注意指针是通过引用而不是值传递的。
替代方案 2
另一种选择是将指针传递给像
这样的指针void func( char ** b )
{
*b = new char[4];
}
int main()
{
char* buf = 0;
func( &buf );
delete buf;
return 0;
}
请注意,我绝不提倡像上面那样使用裸指针和手动内存管理,而只是说明传递指针。 C++ 方法是使用 std::string 或 std::vector<char> 代替。
【讨论】:
要通过“传递指针”实现引用语义,必须发生两件事:调用者必须获取要传递的事物的“地址”,而被调用者必须取消引用指针。
这部分可以通过使用数组来掩盖,数组衰减到指向第一个元素的指针 - 从这个意义上说,数组内容总是“通过引用传递”。不过,您可以使用“一个数组”来隐藏取消引用。
这是直截了当的方法:
void increment_me(int * n) { ++*n; } // note the dereference
int main() { int n; increment_me(&n); } // note the address-of
这也是变相的:
void increment_me(int n[]) { ++n[0]; } // no visible *
int main() { int n[1]; increment_me(n); } // or &
【讨论】:
指针本身是按值传递的(指向的内存是按指针传递的)。改变函数内部的参数不会影响传入的指针。
【讨论】:
指针不会改变。通过指针传递意味着传递一个地址。如果你想改变指针,你必须将一个双指针传递给它一次。
foo( char **b)
{
*b = NULL;
}
【讨论】: