文章目录
一、结构体的数组的区别:
数组:类型相同的一组数集合
结构体:类型不同的一组数集合
二、如何定义结构体
// 模板的作用
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; 是野指针 - 会导致段错误
#include<stdio.h>
struct Datas
{
char *p;
};
int main(){
struct Datas d;
strcpy(d.p , "你今天真好看")
printf("%s\n",d.p);
}
2.用结构体定义指针时 - 正确用法(一)
#include<stdio.h>
struct Datas
{
char p=[128];
};
int main(){
struct Datas d;
strcpy(d.p,"你今天真好看");
printf("%s\n",d.p);
}
3.用结构体定义指针时 - 正确用法(二)
#include<stdio.h>
struct 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<stdio.h>
//初始化结构体数组
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<stdio.h>
//初始化结构体数组
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++; //在内存里是偏移了整个结构体大小
}