void func(char* buf) { buf++;}
我应该通过指针调用它还是只传递值(值为指针类型)?在这种情况下,传入的原始指针会被改变吗?
答案 0 :(得分:5)
这是通过值传递的。
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;
}
请注意,指针是通过引用而不是值传递的。
ALTERNATIVE 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>
代替。
答案 1 :(得分:0)
指针不会被改变。传递指针意味着传递一个地址。如果你想改变指针,你必须传递一个双指针,它只需要一次。
foo( char **b)
{
*b = NULL;
}
答案 2 :(得分:0)
指针本身正在按值传递(指向的内存正由指针传递)。更改函数内的参数不会影响传入的指针。
答案 3 :(得分:0)
要通过“传递指针”来实现引用语义,必须发生两件事:调用者必须接受要传递的东西的“地址”,并且被调用者必须取消引用指针。
使用数组可以掩盖部分内容,数组会衰减到指向第一个元素的指针 - 在这个意义上,数组内容始终“通过引用传递”。但是,您可以使用“数组之一”来模糊解除引用。
这是直截了当的预言:
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 &