如何解决为什么需要双指针?在哪种情况下?
我有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在“为什么我的链表删除仅在第一个元素之后才起作用?”方面存在很多问题。
大约一半的答案建议返回新的头指针并在函数外部进行更新。另一半建议使用双指针以允许在函数内部对其进行修改(指针到头部的指针)。两种作品都取决于使用哪种方式的口味/习惯/意见。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。