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

用户名

我一生中一直是系统管理员,但最近决定练习一些我的开发知识并尝试担任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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

为什么我需要双指针?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Java

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

模块:何时以及为什么?

来自分类Dev

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

来自分类Dev

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

来自分类Java

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

来自分类Javascript

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

来自分类Java

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么以及何时使用Liquibase?

来自分类Dev

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

来自分类Dev

为什么指针需要类型?

来自分类Dev

为什么grep需要双反斜杠?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Java

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

来自分类Java

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

    为什么我需要双指针?

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

    模块:何时以及为什么?

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

    为什么以及何时使用Liquibase?

  20. 20

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

  21. 21

    为什么指针需要类型?

  22. 22

    为什么grep需要双反斜杠?

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档