为什么创建单链表要传头结点的地址而不是传头结点!
本帖最后由 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)来操纵指针从而改变它的指向。
而传指针仅仅是传的 这个指针指向的那块区域的地址,你只能对那块区域 做一些改变,而无法改变你传入的指针。 头结点的地址才是存放你第一个结点的值 这样吧,head存放的是first_node的地址,然后你用这个链表做其他操作的时候,只需要将head的值传过去,然后就可以找到第一个结点,做其他操作了 我是小白别骗我 发表于 2021-8-2 21:19
头结点的地址才是存放你第一个结点的值
单链表有很多种写法,你说的这种是头结点存的就是第一个有数据的结点的地址,也可以为头结点malloc一块结构体空间,让他的next是第一个有数据的结点 Max472 发表于 2021-8-2 22:31
单链表有很多种写法,你说的这种是头结点存的就是第一个有数据的结点的地址,也可以为头结点malloc一块结 ...
可以的,head->指向第一个结点
页:
[1]