为什么以及何时需要双指针?

用户名

我一生中一直是系统管理员,但最近决定练习一些我的开发知识并尝试担任devops职位。因此,我一直在练习一些C和Python技能,并编写了一些代码以将数字插入到链表中。

void list_insert(struct list *h, int d)
{
        struct list *elem = malloc(sizeof(struct list));

        elem->data = d;
        elem->next = NULL;

        if (!h) {
                h = elem;
        } else {
                elem->next = h;
                h = elem;
        }
}           

我注意到该函数似乎并没有改变变量h的外部视图(即传递给list_insert的任何东西),并且我注意到在insert函数末尾进行打印似乎可以工作。因此,尝试在网上寻找答案后,我什么都找不到,很明显,但是我发现大多数列表实现都带有双指针。我将函数更改为使用双指针,然后突然开始工作。有人可以帮我了解这里发生的事情,因为我知道指针管理是一个重要的概念,并且我想我了解指针是什么以及它与内存的关系,但是我不明白为什么不更改单个指针,而双指针可以。

谢谢!

用户名

在C语言中,函数的参数由值传递。甚至指针也由值传递。

例如:

#include<malloc.h>
#include<stdio.h>
int allocatingMemory(int* ptr)
{
    ptr = malloc(sizeof(int)); 
    if(ptr==NULL)
        return -1;
    else 
        return 0;
}// We are not returning the pointer to allocated memory

int main(void)
{
    int* ptr;
    int allocated = allocatingMemory(ptr);
    if(allocated == 0)
    {
        *ptr = 999;// Boom!!! 
        free(ptr);
    }

    return 0;
}

为了克服这个问题,我们使用

int allocatingMemory(int** ptr)
{
    *ptr = malloc(sizeof(int));
    if(*ptr == NULL)
        return -1;
    else 
        return 0;
}

int main(void)
{
    int* ptr;
    int isAllocated = allocatingMemory(&ptr);
    if(isAllocated == 0)
    {
        *ptr = 999;
        free(ptr);
    }

    return 0;
}

如果您使用linked lists并说出例如,您想修改头部。您将向传递pointer to pointer(注意,它不被称为双指针)head node

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 C 中使用指针时,我们何时以及为什么需要使用 malloc?

为什么我需要双指针?

为什么以及何时在 C 中使用指针?

为什么以及何时需要提供自己的删除器?

我何时以及为什么需要引用星号

为什么以及何时需要展平JSON对象?

为什么以及何时在JAXB中需要JAXBElement?

为什么可变对象不需要双指针?

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

为什么以及何时应该在C中使用指针到指针而不是简单的指针?

模块:何时以及为什么?

什么是数据对齐?在C中类型转换指针时,为什么以及何时应该担心?

为什么以及何时通过指针传递C ++中的类类型?

我们何时以及为什么需要ApplicationRunner和Runner接口?

为什么以及何时需要在React中绑定函数和eventHandler?

将函数的参数声明为final:为什么以及何时需要它?

为什么以及何时需要在样式中添加android:前缀?

为什么以及何时需要在 tensorflow 中使用全局步骤

为什么以及何时使用Liquibase?

为什么以及何时继承Collection <T>

为什么指针需要类型?

为什么grep需要双反斜杠?

为什么在C中将指针转换为双指针?

为什么我们需要使用双指针来访问二维数组?

为什么需要双指针来更改头部,而无需更改链接列表中的其他位置

为什么以及何时在Java中使用Skeletal实现

为什么以及何时使用@JvmStatic与伴侣的对象?

为什么以及何时使用Promise.resolve?

* .xlsx文件何时以及为什么包含* .bin文件?