当人们想操作函数中的指针时,为什么要传入双指针

When people want to manipulate a pointer in a function, why do they pass in a double pointer?

本文关键字:指针 为什么 操作 函数      更新时间:2023-10-16

在查看代码时,我注意到当人们想要操作指针时,会向函数传递一个指针对一个指针。

示例:我看到类似的东西

void increment_if_J (char ** ptr)
{
    if (**ptr == 'J')
       ++(*ptr);
}

但是,传入对指针的引用不是更有意义吗?

void increment_if_J (char * & ptr)
{
    if (*ptr == 'J')
       ++(ptr);
}

这样,你就不会创建额外的变量,也不必因为思考令人困惑的"点对点"逻辑而破坏你的大脑。

您用[c][c++]标记了问题。

  • 在C中,答案很简单:没有引用,所以第二种方法不是一种选择。

  • 在C++中,两者都是有效的,并且在很大程度上都是一种风格选择。有些人可能会觉得第一个会在调用站点上更清楚地表明指针可能会被函数修改。有些人可能更喜欢第一个,因为他们习惯于用C编码。有些人可能喜欢第二个,因为你引用的原因。等等…

因为传递的每个C参数都是按值调用的。这在C++中是不同的,它有引用

尽管由于与预先存在的C API代码(无引用)的兼容性原因,大多数情况下使用双指针传递,但在某些情况下(除了编码风格),函数可能更喜欢直接修改其参数,而不是分配额外的堆栈本地参数:

void increment_if_J(char ** ptr)
{
    // I can use ptr to do some other processing first
    char** original = ptr;
    char other_str[] = "Jenny";
    char* contrivedptr = other_str;
    ptr = &contrivedptr;
    **ptr = 'F'; // other_str is now "Fenny"
    ptr = original;
    if (**ptr == 'J')
        ++(*ptr);
}
void increment_if_J_ref(char * & ptr)
{
    // Can't directly use ptr without modifying the referred memory
    if (*ptr == 'J')
        ++(ptr);
}
int main(){
    char str[] = "Jerry";
    char* ptr = str;
    increment_if_J(&ptr); // ptr points to "erry"
    ptr = str;
    increment_if_J_ref(ptr); // ptr points to "erry"
    return 0;
}

这不是一种"促进做作"的技术,但在特殊的内存限制情况下可能会派上用场。