鱼C论坛

 找回密码
 立即注册
查看: 1748|回复: 7

[已解决]想请教各位大佬关于结构体指针的问题

[复制链接]
发表于 2019-3-24 11:17:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
struct students{
        char name[10];
        int num;
        float score;
        struct students *next;        
};
这么一个结构体,我声明一个指针struct students *S!
请问
*S1->next = NULL
S1 = NULL
S1 = NULL
分别是什么意思,请大佬们讲的详细一些
最佳答案
2019-3-24 12:22:59
本帖最后由 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[10]          ;
        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)                                                    ; // 使用完毕释放节点内存
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-24 12:22:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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[10]          ;
        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)                                                    ; // 使用完毕释放节点内存
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-24 14:43:15 | 显示全部楼层
jackz007 发表于 2019-3-24 12:22
首先应该明白,s 和 s -> next 是同种类型的变量,都是 struct students * 类型,也就是说,他们都是 ...

s = NULL 和 s -> next = NULL 意思是,把这 2 个指针初始化为空值,这就意味着,这 2 个指针此刻并没有指向任何一个内存区域,所以,还不能作为结构体用来承载信息和被访问。
这个是还没有分配内存时把指针指向空才不能作为结构体凯承载信息是么?还有就是指向空值时不能被访问的么?
还有一个问题是 只是声明struct students *s (*s)的含义是什么?是这个结构体么?我记得时可(*s).next的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 14:49:30 | 显示全部楼层
本帖最后由 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-24 14:57:15 | 显示全部楼层
jackz007 发表于 2019-3-24 12:22
首先应该明白,s 和 s -> next 是同种类型的变量,都是 struct students * 类型,也就是说,他们都是 ...

哦对了,还有一件事情就是**S1 应该怎么理解?
是 **S1 是一个结构体,还是和我想得不一样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 15:00:48 | 显示全部楼层
本帖最后由 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                ;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-24 15:03:03 | 显示全部楼层
jackz007 发表于 2019-3-24 15:00
struct students stu , ** s ;
  * s = & stu                    ;
  (** s) . name                ...

哦好的谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 15:08:50 | 显示全部楼层
看看这些又学到了不少啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 12:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表