C语言基础-结构体篇

本文介绍了C语言中结构体的基本概念、定义与使用方法,包括结构体数组的区别、结构体的定义、变量访问、赋值操作以及结构体指针的运用。特别强调了在定义结构体指针时的常见错误及其修正方案,并通过案例展示了结构体数组在处理成绩信息时的应用。
摘要由CSDN通过智能技术生成

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

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

二、如何定义结构体

// 模板的作用
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++;   //在内存里是偏移了整个结构体大小
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值