> 文档中心 > C语言基础-结构体篇

C语言基础-结构体篇

文章目录

  • 一、结构体的数组的区别:
  • 二、如何定义结构体
  • 三、结构体的定义和使用
  • 四、如何访问结构体:目标 内部变量
  • 五、结构体数据-赋值
  • 六、常犯下的致命问题
    • 1.用结构体定义指针时 - 错误用法
    • 2.用结构体定义指针时 - 正确用法(一)
    • 3.用结构体定义指针时 - 正确用法(二)
    • 案例一:结构体数组来玩成绩
  • 七、结构体指针

一、结构体的数组的区别:

数组:类型相同的一组数集合
结构体:类型不同的一组数集合

二、如何定义结构体

// 模板的作用struct Datas{int a;char c;float f;char *p;int array[2];};

struct 关键字

struct Student   //自定义类型{    int score;    //特性:名字    char name[128]; //特性:分数    void (*pintroduce)(char *pname);  //行为:函数指针(自我介绍)};

三、结构体的定义和使用

!!!提醒:这里容易忘记在结构体 } 后面带上; 必须: };

struct Student{ int score; char name[128];};int main(){//类型   变量名初始值  int      a    =      10; struct Student  stu1   =   {98 , "王晓聪"};}

四、如何访问结构体:目标 内部变量

struct Student {   int score;   char name[128];};int main(){//类型   变量名初始值  int      a    =      10; struct Student  stu1   =   {98 , "王晓聪"};printf("a=%d\n",a);printf("结构体:score=%d\n",stu1.score);printf("结构体:name=%s\n", stu1.name);}

五、结构体数据-赋值

struct Student {   int score;   char name[128];};int main(){struct Student  aa ={100,"李四"};struct Student  test;test.score =99;//test.name="张三";   java 可以这么做,但是c语言不行strcpy(test.name,"张三");printf("结构体:score=%d\n", stu1.score);printf("结构体:name=%s\n", stu1.name);}

六、常犯下的致命问题

1.若你要用结构体定义指针的时候 要注意的问题;

1.用结构体定义指针时 - 错误用法

以下这样用的时候会出现 —— 段错误)
char *p; 是野指针 - 会导致段错误

#includestruct Datas{  char *p;};int main(){struct Datas d;strcpy(d.p , "你今天真好看")printf("%s\n",d.p);}

2.用结构体定义指针时 - 正确用法(一)

#includestruct Datas{char p=[128];};int main(){struct Datas d;strcpy(d.p,"你今天真好看");printf("%s\n",d.p);}

3.用结构体定义指针时 - 正确用法(二)

#includestruct Datas{char *p;};int main(){struct Datas d;d.p=(char *)malloc(128);memset(d.p , '\0',128);strcpy(d.p,"你今天真好看");printf("%s\n",d.p);}

案例一:结构体数组来玩成绩

信息有限,考最高分的人是谁?

#include//初始化结构体数组struct Student{   int score;   char *name;};int main(){  int i;  struct Student stus[3];  for(i=0 ;i<sizeof(stus)/sizeof(stus[0]); i++){ printf("请输入%d个学生的名字:\n",i++); stus[i].name = (char *)malloc(128); //!!千万不要忘记开辟空间,不然会导致段错误 scanf("%d",&stus[i].name); printf("请输入%d个学生的分数:\n",i+1); scanf("%d",&stus[i].score);//!!千万别忘记取地址符&  }  for(i=0 ; i<sizeof(stus)/sizeof(stus[0]) ; i++){printf("第%d个学生的名字和分数:\n",i+1);printf("%s:%d\n",stus[i].name , stus[i].score);}//找最高分,找人struct Student Maxstu;struct Student Minstu;Maxstu = Minstu = stus[0];for(i=0 ; i<sizeof(stus)/sizeof(stus[0]) ;i++){    if(Maxstu.score < stus[i].score){   Maxstu = stus[i];    }    if(Maxstu.score > stus[i].score){   Minstu = stus[i];    }    printf("最高分的是:%s:%d\n",Maxstu.name ,Maxstu.score);    printf("最低分的是:%s:%d\n",Minstu.name ,Minstu.score);    }    return 0;}

七、结构体指针

1. 如果用结构体指针,就不能用点运算符"."
2. 如果用结构体指针,访问结构体中的变量 要用 " -> "

3. 指针要注意:是不是野指针或者NULL

#include//初始化结构体数组struct Student{   int score;   char *name[128];};int main(){struct Student *p ;   //野指针struct Student stu1;p=(struct *)malloc(sizeof(struct Student))  //  若不用该空间应该释放掉://   free(p);p.score = 100;     //会报错,如果用结构体指针,就不能用点运算符p->score = 100;    //如果用结构体指针,访问结构体中的变量 要用->strcpy(p->name,"李四");printf("名字:%s,分数:%d\n",p->name , stu1->score);//指针是存放地址的变量,之前是指向malloc的那块空间,现在指针变量存放的是stu1的地址p=&stu1;p++;   //在内存里是偏移了整个结构体大小}