C语言指针(引用传递和值传递,头指针和头结点)

结构体的引用传递和值传递

LinkList&L 是引用传递 可以起到修改链表的效果
LinkList L 是值传递 传的是L的一个副本 对副本操作后无法起到修改链表的效果

在这里插入图片描述
在函数changStudentAge1 和 changStudentAge2里面我们都给传入的指针变量分配了一个新的内存,然后再将数据域的值赋值为5,但是我们发现,当函数结束之后,changStudentAge1没有改变传入指针L对应的one->age 的值,而changStudentAge2改变了one->age 的值。

对于changStudentAge1中的StudentPtr S来说,只是单纯的将传入指针one的指向地址赋予S这个临时指针的指向地址,而changStudentAge2 里S本身的地址,实际上就是L本身所对应的地址。

所以,如果只是单纯的改变指针指向地址的内容的话,那么两者是等效的,如果涉及到改变指针本身地址的时候,那么两者就不能等同起来了,前者改变的只是临时变量而已,后者可以改变传入指针本身。

总结:如果是需要用到链表的数据,只需要传递值就可以了;如果需要修改或是删除链表,则在参数上加上地址符。

结构体的引用传递和值传递的地址变化

结构体指针的引用传递和值传递的地址变化

typedef struct 结构体

typedef struct Lnode{
	ElementType data;
	struct Lnode *next;
}Lnode, *LinkList;//注意Lnode *L与LinkList L等价
//*LinkList表示指向Lnode结构体的指针

结构体的输出与输入

struct student
{
    char name[20];
    int age; 
    char sex;
};

int main()
{
	struct student s1={"fgh",6,'a'};
    printf("%s %d %c\n",s1.name,s1.age,s1.sex);
    struct student s2;
    scanf("%s%d%c\n",s2.name,&s2.age,&s2.sex);
    //用scanf函数输入的时候成员变量前要加&
    printf("%s %d %c\n",s2.name,s2.age,s2.sex);
    //用printf函数输出的时候成员变量前不用加&
    struct student *s3=(struct student *)malloc(sizeof(struct student)*64);
    //定义结构体指针是,必须进行初始化分配内存,不然系统无法运行
    strcpy(s3->name,"aaa");
    s3->age=10;
    s3->sex='a';
    printf("%s %d %c\n",s3->name,s3->age,s3->sex);
}

1.(* 指针变量名).成员名;
/p两边的括号不可省略,因为成员运算符".“的优先级高于指针运算符”",
所以如果 p 两边的括号省略的话,那么p.num就等价于(p.num)了。*/
2.指针变量名->成员名;

头指针和头结点

头指针:指向第一个结点的指针称为头指针,那么每次访问链表时都可以从这个头指针依次遍历链表中的每个元素。由于链表的特性(next指针),知道了头指针,那么整个链表的元素都能够被访问,也就是说头指针是必须存在的
头结点:有时候我们在单链表的第一个结点之前附设一个结点,称为头结点。头结点的数据域可以不存储任何信息,也可存储如线性表的长度等类的附加信息。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值