C04结构体

一 、 结构体是什么?
1.与C语言中的数组,用法跟其他语言差不多。当一个整体由多个数据构成时,可以用数组来表示这个整体,
但是数组有个特点:内部的每一个元素都必须是相同类型的数据。
2.通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,
这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型。
3.C语言专门提供了一种构造类型来解决上述问题,就是结构体,它允许内部的元素是不同类型的。
二 、 结构体有什么用?
1.更好的管理内存,解决基本数据类型和数组都不好存储的数据
三 、 结构体怎么用?

方法一:先定义结构体类型再定义变量名

struct  student
{int  num;
  char  name[20];
  char  sex;
  int  age;
  char  addr[30];
};
struct   student    student1, student2;

有时,可用符号常量代表一个结构体类型 ,如:

#define STUDENT struct student
STUDENT
{int  num;
  char  name[20];
  char  sex;
  int  age;
  char  addr[30];
};

方法二:在定义类型的同时定义变量

struct  student
{int  num;
  char  name[20];
  char  sex;
  int  age;
  char  addr[30];
} student1, student2;

方法三:直接定义结构类型变量。
其一般形式是:
struct
{
成员表列
} 变量名表列;
- 结构体变量的指针:是该结构体变量所占居的内存段的起始地址,指向该结构体

int main( )
{
 struct student
  {
  long int num;
  char name[20];
  char sex;
  };
struct student stu_1;
struct student *p;
p=&stu_1;
return 0;
} 
  • 引用结构体成员的三种形式:
    1) 结构体变量名 . 成员名
    2) (*p).成员名
    3) p- >成员名
  • 结构体的初始化
 struct  student
{long int num;
  char name[20];
  char sex;
  char addr[20];
} stu={9801,”Wang hong”,’W’,”2 Linggong Road”};

或者

 struct  student
{long int num;
  char name[20];
  char sex;
  char addr[20];
};

struct Student stu ={9801,”Wang hong”,’W’,”2 Linggong Road”}

四 、 使用结构体要注意什么?
1.  类型与变量是不同概念,不要混淆;
2.  结构体中的成员,可以单独使用,其作 用与地位相当于普通变量;
3.  成员名可以与程序中的变量名相同,二 者不代表同一对象。
4.  成员也可以是一个结构体变量;
5. 不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出
6. 只能在定义变量的同时进行初始化赋值,初始化赋值和变量的定义不能分开

五 、 结构体代码举例
  • 例1一般应用
//一个结构体
 struct Student {
    char *name;
     int age;
 };
 struct Student stu;
// 访问stu的age成员
 stu.age = 27;
//两个结构体搭配
struct Date {
      int year;
      int month;
       int day;
 };
 struct Student {
      char *name;
      struct Date birthday;
 };
 struct Student stu;
 //注意成员变量的访问
 stu.birthday.year = 1986;
 stu.birthday.month = 9;
 stu.birthday.day = 10;
  • 例2结构体作为函数参数(值传递)
#include <stdio.h>
  // 定义一个结构体
 struct Student {
     int age;
 };
 void test(struct Student stu) {
      printf("修改前的形参:%d \n", stu.age);
     // 修改实参中的age
     stu.age = 10;

     printf("修改后的形参:%d \n", stu.age);
 }

 int main(int argc, const char * argv[]) {

     struct Student stu = {30};
     printf("修改前的实参:%d \n", stu.age);

     // 调用test函数
     test(stu);


    printf("修改后的实参:%d \n", stu.age);
     return 0;
 }
  • 例3 利用指向结构体数组的指针计算学生各科的平均成绩
#include <stdio.h>
int main()
{
 struct STUDENT *pt;
 float  sum[4] = {0.0},average[4] = {0.0};
 int   i;
 char  *name[]={"score of Computer","score of English",
                "score of Math","score of Music"};

 pt = stu;    /*pt指向结构体数组的第一个元素*/
 for (pt=stu; pt<stu+30; pt++)
 {
  sum[0] = sum[0] + pt->scoreComputer;//用->访问成员变量
  sum[1] = sum[1] + pt->scoreEnglish;
  sum[2] = sum[2] + pt->scoreMath;
  sum[3] = sum[3] + pt->scoreMusic;  
 }
 for (i=0; i<4; i++)
 {
     average[i] = sum[i]/4;    
  printf("%20s : %4.2f\n", name[i], *(average+i));//格式输出,平均分保留两位
 }
return 0;
}

六 、 结构体总结
1.不允许对结构体本身递归定义
2.结构体内可以包含别的结构体
3.定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样。
只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量
4.结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列
5.初始化:将各成员的初值,按顺序地放在一对大括号{}中,并用逗号分隔,一一对应赋值
6.一般对结构体变量的操作是以成员为单位进行的,引用的一般形式为:结构体变量名.成员名
7.如果某个成员也是结构体变量,可以连续使用成员运算符"."访问最低一级成员
8.相同类型的结构体变量之间可以进行整体赋值
9.将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。
因此,形参的改变不会影响到实参。
10.每个结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量
11.typedef 的用法 ,功能:定义新类型,即为C语言中已有的数据类型 名定义一个新名字。 定义格式: typedef   标识符1    标识符2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值