A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ITClody 中级黑马   /  2015-6-28 00:16  /  858 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1)结构指针定义和初始化
                a、指向结构体变量的指针
                        ①一个指针变量用来指向一个结构体变量时,称之为结构体指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。
                        ②一般形式:
                                struct 结构名 *结构指针变量名
                                与前面的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。
                                赋值是把结构体变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。
                        ③什么是结构体指针?
                                用来存放结构体变量地址的指针变量。
                        ④结构体指针定义
                                格式:
                                        struct 结构体名 *指针变量名
                                代码:
                                        struct Car{
                                                int lunzi;
                                                int speed;
                                        };

                b、结构名、结构体变量名、结构体指针
                        结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。结构指针变量,就是用来存储结构体变量地址的,就能更方便地访问结构变量的各个成员。

  2)结构体指针间接访问成员值
                a、指向结构体变量的指针
                        其访问的一般形式为:
                                (*结构体指针变量).成员名
                        例如:
                                (*pstu).num
                        或:
                                结构指针变量->成员名
                        例如:
                                pstu->num
                b、结构体变量的成员值
                        struct Stuent{
                                int age;
                                char *name;
                        };
                        struct Stuent stu1={17,"张三"};//成员值有两个①stu1.age  ②stu1.name

                c、用结构体指针间接访问结构体变量的成员值
                        struct Student *p=&stu1;
                        //使用p  获取 18 和 张三丰
                        两种方法:
                                方法一:
                                        ①(*p).age;//访问年龄
                                        ②(*p).name;//访问姓名
                                        需要注意:(*p)两侧的括号不可少,因为成员符"."的优先级高于"*".
                                        如果去掉括号写作*p.age则等效于*(p.age),这样意义就完全不对了。
                                方法二:
                                        ①p->age    //访问年龄
                                        ②p->name   //访问姓名

  3)结构体嵌套使用
                a、结构体嵌套使用
                        成员也可以又是一个结构,即构成了嵌套的结构。
                        结构体嵌套:结构体定义的里面有其他结构体。
                        结构体不可以嵌套自己的变量,但是可以嵌套指向自己这种类型的指针。
                b、注意事项:
                        ①结构体定义中可以嵌套其他结构体类型的变量;
                        ②结构体定义中不可以嵌套自己这个类型的变量;
                        ③可以嵌套自己类型的指针
                        例如:
                                //定义一个Date的结构体
                                struct Date{
                                        int year;
                                        int month;
                                        int day;
                                };
                                //定义了一个学生的结构体
                                struct Student{
                                        char *name;
                                        int age;
                                        float score;
                                        //错误写法 struct Student stu;//这种写法是错误的,不能在自己说嵌套自己类型的结构
                                        struct Student *stu;//这种写法是正确的
                                        struct Date birthday;
                                };
                c、嵌套结构体如何进行初始化
                        struct Student stu1={"张三丰",19,80f,{1991,12,12}};//定义了一个结构体变量
                d、嵌套的结构体如何进行访问
                        printf("姓名:%s,年龄:%d(生日:%d-%02d-%02d),成绩:%.2f\n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day);
                c、多级嵌套
                        例如:
                                //定义一个Time的结构体
                                struct Time{
                                        int hour;
                                        int min;
                                        int sec;
                                };
                                //定义一个Date的结构体
                                struct Date{
                                        int year;
                                        int month;
                                        int day;
                                        //嵌套time结构体
                                        struct Time time;
                                };
                                //定义了一个学生的结构体
                                struct Student{
                                        char *name;
                                        int age;
                                        float score;
                                        //错误写法 struct Student stu;//这种写法是错误的,不能在自己说嵌套自己类型的结构
                                        struct Student *stu;//这种写法是正确的
                                        struct Date birthday;
                                };
                c、嵌套结构体如何进行初始化
                        struct Student stu1={"张三丰",19,80f,{1991,12,12,{12,12,12}}};//定义了一个结构体变量
                d、嵌套的结构体如何进行访问
                        printf("姓名:%s,年龄:%d(生日:%d-%02d-%02d %02d:%02d:%02d),成绩:%.2f\n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day,stu1.birthday.time.hour,stu1.birthday.time.min,stu1.birthday.sec,stu1.score);

  4)结构体嵌套自身的指针
                struct Person{
                        char *name;
                        int age;
                        //嵌套自己类型的指针
                        struct Person *child;
                };
                //结构体嵌套自身指针的初始化
                //定义kim
                struct Person kim={"Kimmy",8,NULL};
                //struct Person *child=&kim;
                struct Person p1={"林志玲",30,&kim};
                //结构体 嵌套自身指针的访问
                printf("%s的儿子是:%s,儿子的年龄是:%d\n",p1.name,(*p1.child).name,(*p1.child).age);
                或者:
                printf("%s的儿子是:%s,儿子的年龄是:%d\n",p1.name,p1.child->name,p1.child->age);



2 个回复

倒序浏览
看着灰常详细。。。
回复 使用道具 举报
丁铭检 发表于 2015-6-28 11:41
看着灰常详细。。。

谢谢鼓励,继续加油!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马