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++; //在内存里是偏移了整个结构体大小}