结构体的引用传递和值传递
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指针),知道了头指针,那么整个链表的元素都能够被访问,也就是说头指针是必须存在的
头结点:有时候我们在单链表的第一个结点之前附设一个结点,称为头结点。头结点的数据域可以不存储任何信息,也可存储如线性表的长度等类的附加信息。