2011-12-08 38 views
3
void func(char* buf) { buf++;} 

我应该将它称为传递指针还是只传值(值为指针类型)?在这种情况下原来的指针会被改变吗?它是否通过指针?

回答

5

这是通过价值。

void func(char * b) 
{ 
    b = new char[4]; 
} 

int main() 
{ 
    char* buf = 0; 
    func(buf); 
    delete buf; 
    return 0; 
} 

BUF仍然会调用func和newed存储器将泄漏后为0。

当您通过值传递指针时,您可以更改指针指向的不是指针本身。

正确的方法来做到上述的东西将是

ALTERNATIVE 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::stringstd::vector<char>

+0

洛尔和RAM将被泄露:) –

+0

@MichaelDorgan为什么 –

+0

呼唤新的直接无呼叫删除。与通过指针或值传递无关。 –

0

指针不会被改变。通过指针传递意味着传递一个地址。如果你想改变指针,你必须传递一个双指针来尊重它。


foo(char **b) 
{ 
    *b = NULL; 
} 
0

指针本身正在通过值传递(指向的内存被指针传递)。更改函数内部的参数不会影响传入的指针。

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 &