鱼C论坛

 找回密码
 立即注册
查看: 2101|回复: 4

[技术交流] 为什么创建单链表要传头结点的地址而不是传头结点!

[复制链接]
发表于 2021-7-19 22:35:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Max472 于 2022-5-30 23:00 编辑
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
        int data;
        struct node* next;
} node;

typedef node* LinkList;

void f(LinkList* L);

void F(LinkList L);

int main(void)
{
        node p;

        LinkList L = &p;

        printf(" main 中 &L = %p, L = %p, p = %p\n", &L, L, &p);

        f(&L);

        F(L);

        return 0;
}



void f(LinkList* L)
{
        printf(" f 中 *L = %p, L = %p, &L = %p\n", *L, L, &L);
}

void F(LinkList L)
{
        printf(" F 中 L = %p, &L = %p\n", L, &L);
}


这里是运行结果:(由于等级不够,不能上传图片,我把结果复制了一下 )
         main 中 &L = 0117FD30, L = 0117FD3C, p = 0117FD3C
         f 中 *L = 0117FD3C, L = 0117FD30, &L = 0117FC5C
        F 中 L = 0117FD3C, &L = 0117FC5C

注:这些内存地址在不同电脑上都是不一样的,在一台电脑上多次运行的结果每次也都是不一样的。


f 函数传的是指针的地址,F 函数传的是指针


C语言的函数是传值,当你传指针的时候,其实是 重新创建了一个和你传的指针 指向相同的指针,这俩是 两个指针,就是他俩指向同一块地址,你在函数里边修改指针的指向 其实修改的是 这个函数里边新创建的指针的指向,原指针的指向还是 原来的地方没有变,如果你想改变原指针的指向,就要给函数传 指针的地址,虽然也是传值,但这个值是指针的地址,你可以通过对这个地址进行解引用(也就是 *head)来操纵指针从而改变它的指向。

而传指针仅仅是传的 这个指针指向的那块区域的地址,你只能对那块区域 做一些改变,而无法改变你传入的指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-2 21:19:41 | 显示全部楼层
头结点的地址才是存放你第一个结点的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-2 21:21:01 | 显示全部楼层
这样吧,head存放的是first_node的地址,然后你用这个链表做其他操作的时候,只需要将head的值传过去,然后就可以找到第一个结点,做其他操作了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-2 22:31:02 | 显示全部楼层
我是小白别骗我 发表于 2021-8-2 21:19
头结点的地址才是存放你第一个结点的值

单链表有很多种写法,你说的这种是头结点存的就是第一个有数据的结点的地址,也可以为头结点malloc一块结构体空间,让他的next是第一个有数据的结点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-3 13:47:29 | 显示全部楼层
Max472 发表于 2021-8-2 22:31
单链表有很多种写法,你说的这种是头结点存的就是第一个有数据的结点的地址,也可以为头结点malloc一块结 ...

可以的,head->指向第一个结点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 22:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表