写了两个函数,它们都能输出链表的值,但第二个函数会将头节点的指向置为空。
这是结构体本身:
输出结果:
第一个函数与第二个函数相同,但是第二个函数使用过后,导致头节点置为空
第一个函数原理:(改变的是指针指向,与头节点无关)
#include<stdio.h>
struct dog //定义结构体
{
int name;//结构体里面定义一个变量叫做name
};
void fun(struct dog *f1,struct dog *f2)//通过函数传值改变
{
f1 = f2;//把结构体f2赋值给f1
}
int main()
{
struct dog f1,f2;
f1.name = 10;//给结构体f1的name赋值为10
f2.name = 20;//给结构体f2的name赋值为20
fun(&f1,&f2);
printf("%d",f1.name);
return 0;
}
第二个函数原理:(通过传地址改变结构体里变量的值)
#include<stdio.h>
struct dog //定义结构体
{
int name;//结构体里面定义一个变量叫做name
};
void fun(struct dog *f1)//通过函数传值改变
{
f1->name = 20;
}
int main()
{
struct dog f1;
f1.name = 10;//给结构体赋值为10
printf("%d\n",f1.name);
fun(&f1);//调用函数改变name的值;
printf("%d",f1.name);
return 0;
}
总结:
因为这两个函数都是通过传过来的一个头节点的地址来访问链表,因此在第一个函数里f1是一个struct dog型的指针,它指向的的是传过来的头节点的地址,因此改变f1的值只是改变f1的指向,因此不会影响头节点的值,但f1->next指向的是头节点next的地址,改变f1->next的值则会改变头节点的next的值因此操作完成后会把头节点指向空