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