链表指针的传参,传值和传地址

简介: 本文讨论了链表操作中指针传参的问题,特别是指针的传值与传地址的区别,并提供了修正代码,以确保链表插入操作能正确地修改指针指向的地址。

在学数据结构的过程中,往往会出现空指针的问题,我debug一下发现并不是初始化的问题,而是在初始化后的值没有传回来,这时我就意识到是指针传参问题。

这个代码xuhuan*这个指针是传参的,而*list本身定义为xuhuan的指针然后在按照取地址符就可以正常按地址传指针。

问题代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct xuhuan
{
    int data;
    xuhuan* next;
}*list;

void init(xuhuan* p) {
    p = (xuhuan*)malloc(sizeof(xuhuan));
}

void charu(xuhuan* p) {
    int e=0;
    scanf_s("%d", &e);
    xuhuan* q;
    q = (xuhuan*)malloc(sizeof(xuhuan));
    q->data = e;
    q->next = p->next;
    p->next = q;
}

void prints(xuhuan* p) {
    p = p->next;
    while (p->data) {
        printf("%d\n", p->data);
        p = p->next;
     }
}


int main() {
    xuhuan* i = NULL;
    init(i);
    charu(i);
    prints(i);
    return 0;
}

可以看出,我输入的值(4)这个并没有输出来。

解决代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct xuhuan
{
    int data;
    xuhuan* next;
}*list;

void init(list &p) {
    p = (xuhuan*)malloc(sizeof(xuhuan));
}

void charu(list &p) {
    int e=0;
    scanf_s("%d", &e);
    xuhuan* q;
    q = (xuhuan*)malloc(sizeof(xuhuan));
    q->data = e;
    q->next = p->next;
    p->next = q;
}

void prints(list &p) {
    p = p->next;
    while (p->data) {
        printf("%d\n", p->data);
        p = p->next;
     }
}


int main() {
    list i = NULL;
    init(i);
    charu(i);
    prints(i);
    return 0;
}

目录
相关文章
|
1月前
|
存储 C语言
指针的函数传参的详细讲解(一)
本文介绍了计算机内存管理与C语言中指针的基本概念及应用。从内存单元的划分到指针的定义,解释了指针作为地址的作用及其数据类型特性。文章通过代码示例详细说明了一级指针、二级指针的使用方法,以及`void*`指针的特点和限制。此外,还探讨了指针运算规则、函数指针传参解引用的原理,并结合链表实例分析了一级与二级指针在实际场景中的区别。最后附带两道指针练习题,帮助读者巩固理解。
34 0
|
存储 C语言
用指针处理链表
用指针处理链表
134 3
|
9月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
96 2
|
9月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
106 0
|
12月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
108 1
【数据结构OJ题】复制带随机指针的链表
|
C语言
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
111 1
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
95 1
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
74 1
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
C语言
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
87 0