为什么需要双指针?在哪种情况下?

问题描述

我有2条代码,如下所示:

第一个是:

void input(int * a) {
    (*a) = 10;
}

int main() 
{
    int * a = (int *) malloc(sizeof(int));
    input(a);
    printf("%d",*a);
    free(a);
    return 0;
}

第二个是:

void input(int ** a) {
    *(*a) = 10;
}

int main() 
{
    int * a = (int *) malloc(sizeof(int));
    input(&a);
    printf("%d",*a);
    free(a);
    return 0;
}

我运行了这两个代码,它们显示了相同的输出(为10)。我想知道它们是否具有相同的含义?您能帮我指出区别(如果有)吗?

解决方法

您最终将其设置为int值(10),因此显然您的示例中确实不需要int**

但是,如果您需要将其设置为int*值,则将需要int**

例如:

void input(int** a) {
    *a = (int*)malloc(sizeof(int));
}

int main() 
{
    int* a;
    input(&a);
    printf("%p",a);
    free(a);
    return 0;
}
,

您证明了自己了解需要一个指向int的指针,
也就是说,如果预期函数的结果/效果是所指向的int的修改。

当预期的效果是对指针的修改时,就需要使用双指针。
修改(或可能修改)指针的最普遍需求是链表的插入,排序或删除操作。需要能够修改引用列表(或列表中的第一个元素)的指针。

例如,StackOverflow在“为什么我的链表删除仅在第一个元素之后才起作用?”方面存在很多问题。
大约一半的答案建议返回新的头指针并在函数外部进行更新。另一半建议使用双指针以允许在函数内部对其进行修改(指针到头部的指针)。两种作品都取决于使用哪种方式的口味/习惯/意见。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...