C语言进阶-第15~16讲:结构体(含指针和函数)

知识点总结

        (二)指向结构体变量的指针

            1)结构体变量指针的访问形式

                 

                   

            2)指向结构体变量的指针作实参:

    #include <stdio.h>  
    #include <string.h>  
    struct Student{  
        int num;  
        char name[12];  
        float score[3];  
    };  
    void print(struct Student*);  
    int main( ){  
        struct Student stu,*pt;  
        stu.num=12345;  
        strcpy(stu.name, "Li Fung");  
        stu.score[0]=67.5;  
        stu.score[1]=89;  
        stu.score[2]=78.5;  
        pt=&stu;  
        print(pt);  
        printf("%d %s ", stu.num, stu.name);  
        printf("%.1f %.1f %.1f\n", stu.score[0], stu.score[1], stu.score[2]);  
        return 0;  
    }   
    void print(struct Student *p){  
        printf("%d %s ", p->num, p->name);  
        printf("%.1f %.1f %.1f\n", p->score[0], p->score[1], p->score[2]);  
        p->score[2]=100;  
    }  

            3)使用指向结构体变量的指针的特点:

                  空间和时间的开销都很小
                  效率较高,但不够直观
                  在函数中,可以改变实参指向的结构体



      (三)结构体成员为指针『如何正确引用指针数据成员』

           1)回顾出现指向整型变量的野指针(给还未指向任何地址的指针赋值)

                 

            2)以容易出错的字符型指针作为数据成员为例

                a.错例(未给str一段地址空间就强行赋值)

                  

               b.危险的例子(可以将s作为字符串的首地址赋值给str,

               但一旦s是动态分配的空间,执行完有关s的操作后就释放很正常,之后出现str的语句,str则为野指针)

                

              c.正解(当有数据成员是指针时,必须先为其分配空间!  如此,即使s先分配后释放,也已经为str分配了空间)

                                     

    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    struct Test{
        int x;
        char *str;
    };

    int main(){
        struct Test a;
        a.x=100;
        char *s=(char*)malloc(10);
        strcpy(s,"hello");
        a.str=(char*)malloc(strlen(s)+1);
        strcpy(a.str,s);
        free(s);
        printf("%d %s\n", a.x, a.str);
        free(a.str);
        return 0;
    }


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值