想请教各位大佬关于结构体指针的问题
struct students{char name;
int num;
float score;
struct students *next;
};
这么一个结构体,我声明一个指针struct students *S!
请问
*S1->next = NULL
S1 = NULL
S1 = NULL
分别是什么意思,请大佬们讲的详细一些
本帖最后由 jackz007 于 2019-3-24 13:39 编辑
首先应该明白,s 和 s -> next 是同种类型的变量,都是 struct students * 类型,也就是说,他们都是指针类型,在变量定义和初始化的时候,s = NULL 和 s -> next = NULL 意思是,把这 2 个指针初始化为空值,这就意味着,这 2 个指针此刻并没有指向任何一个内存区域,所以,还不能作为结构体用来承载信息和被访问。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct students{
char name ;
int num ;
float score ;
struct students * next ;// 链表节点指针,用于指向下一个节点
} ;
main(void)
{
struct students * s1 , * s2 ; // 声明 s1、s2 为链表节点指针
s1 = (struct students *) malloc(sizeof(struct students *)); // 通过 malloc() 分配一块内存,创建第一个链表节点,用指针 s1 指向这个节点
strcpy(s1 -> name , "张三") ; // 为节点 s1 成员赋值
s1 -> num = 102 ; // 为节点 s1 成员赋值
s1 -> score = 88.5 ; // 为节点 s1 成员赋值
s1 -> next = NULL ; // 为节点 s1 成员赋值
s2 = (struct students *) malloc(sizeof(struct students *)); // 通过 malloc() 分配一块内存,创建第二个链表节点,用指针 s2 指向这个节点
strcpy(s2 -> name , "李四") ; // 为节点 s2 成员赋值
s2 -> num = 103 ; // 为节点 s2 成员赋值
s2 -> score = 82.9 ; // 为节点 s2 成员赋值
s2 -> next = NULL ; // 为节点 s2 成员赋值
s1 -> next = s2 ; // 让第节点 s1 的链表指针指向 s2,这样,s1 -> next == s2
s2 -> next = s1 ; // 让第节点 s2 的链表指针指向 s1,这样,s2 -> next == s1
// 这样,s1 与 s2 形成一个闭环,s1 -> next 指向 s2,而 s1 -> next -> next 又指回了自己
printf("s1 -> name: %s\n" , s1 -> name) ; // 利用 s1 向屏幕输出:s1 -> name: 张三
printf("s1 -> num : %d\n" , s1 -> num) ; // 利用 s1 向屏幕输出:s1 -> num : 102
printf("s1 -> score : %4.1f\n , s1 -> score) ; // 利用 s1 向屏幕输出:s1 -> score : 88.5
printf("s1 -> name: %s\n" , s2 -> next -> name) ; // 利用 s2 向屏幕输出:s1 -> name: 张三
printf("s1 -> num : %d\n" , s2 -> next -> num) ; // 利用 s2 向屏幕输出:s1 -> num : 102
printf("s1 -> score : %4.1f\n , s2 -> next -> score) ; // 利用 s2 向屏幕输出:s1 -> score : 88.5
free(s1) ; // 使用完毕释放节点内存
free(s2) ; // 使用完毕释放节点内存
}
jackz007 发表于 2019-3-24 12:22
首先应该明白,s 和 s -> next 是同种类型的变量,都是 struct students * 类型,也就是说,他们都是 ...
s = NULL 和 s -> next = NULL 意思是,把这 2 个指针初始化为空值,这就意味着,这 2 个指针此刻并没有指向任何一个内存区域,所以,还不能作为结构体用来承载信息和被访问。
这个是还没有分配内存时把指针指向空才不能作为结构体凯承载信息是么?还有就是指向空值时不能被访问的么?
还有一个问题是 只是声明struct students *s (*s)的含义是什么?是这个结构体么?我记得时可(*s).next的。 本帖最后由 jackz007 于 2019-3-24 14:50 编辑
你的理解完全正确!
struct students stu , * ps ;
ps = & stu ; // 把 ps 指向 stu
(* ps) . name ; // stu . name
(* ps) . num ; // stu . num
(* ps) . score ; // stu . score
ps -> name ; // stu . name
ps -> num ; // stu . num
ps -> score ; // stu . score jackz007 发表于 2019-3-24 12:22
首先应该明白,s 和 s -> next 是同种类型的变量,都是 struct students * 类型,也就是说,他们都是 ...
哦对了,还有一件事情就是**S1 应该怎么理解?
是 **S1 是一个结构体,还是和我想得不一样? 本帖最后由 jackz007 于 2019-3-24 15:03 编辑
cookies945 发表于 2019-3-24 14:57
哦对了,还有一件事情就是**S1 应该怎么理解?
是 **S1 是一个结构体,还是和我想得不一样?
** s 是指向节点的指针的指针,意思是 s 所指向的内存中可以保存一个指向节点的指针,而这个指针 (* s) 可以指向一个节点。
struct students stu , ** s ;
* s = & stu ;
(** s) . name ;
(** s) . num ;
(** s) . score ;
(* s) -> name ;
(* s) -> num ;
(* s) -> score ; jackz007 发表于 2019-3-24 15:00
struct students stu , ** s ;
* s = & stu ;
(** s) . name ...
哦好的谢谢大佬
看看这些又学到了不少啊
页:
[1]