小甲鱼_带你学C带你飞_p42结构体

P42结构体

结构体声明

  • 语法

    struct 结构体名称
    {
        结构体成员1;
        结构体成员2;
        结构体成员3;
        ......
    };
    // 结构体声明只是进行一个框架的描绘,并不会在内存中分配存储空间
    // 直到真正定义一个结构体变量的时候,才会在内存中分配空间
    
  • 一本书的结构体声明

    struct Book //为了与普通变量名和宏名区分开,使用第一个大写的单词,后面小写
    {
    	char title[128];
    	char author[40];
    	float price;
    	unsigned int date;
        char publisher[40];
    };
    

    定义结构体类型变量

    struct 结构体名称 结构体变量名
    
    • 尝试定义书的结构

      • 第一遍自己写

        # include<stdio.h>
        struct Book{
            char title[128];
            char author[40];
            float price;
            unsigned int date;
            char publisher[40];
        };
        int main(){
            struct Book book;
            return 0;
        }
        
        • 跟着视频写

          # include<stdio.h>
          // 放在外面是全局的,所有函数都可以看到
          // 放在main函数里面,只有在main函数才可以对它进行定义
          struct Book
          {
              char title[128];
              char author[40];
              float price;
              unsigned int date;
              char publisher[40];
          };
          
          // 还有另一种定义的方法,在声明的时候定义
          /*
          struct Book
          {
              char title[128];
              char author[40];
              float price;
              unsigned int date;
              char publisher[40];
          } book;   // 这里book是一个全局变量,其他函数也可以对它进行引用和访问
          */
          
          int main(void){
              struct Book book; // book放在这里,是属于main函数的局部变量
              return 0;
          }
          
  • 访问结构体变量

    • 要访问结构体成员,我们需要引入一个新的运算符——点号(.)运算符。比如book.title就是引用book结构体的title成员,它是一个字符数组;而book.price则是引用book结构体的price成员,它是一个浮点型的变量。

    • 写一个简单的书籍录入程序

      #include<stdio.h>
      struct Book{
          char title[128];
          char author[40];
          float price;
          unsigned int date;
          char publisher[128];
      }book;
      
      int main(void){
          printf("请输入书名 :");
          scanf("%s",book.title); //字符数组,直接给名字
          printf("请输入作者 :");
          scanf("%s",book.author);
          printf("请输入售价 :");
          scanf("%f",&book.price);
          printf("请输入出版日期 :");
          scanf("%d",&book.date);
          printf("请输入出版社 :");
          scanf("%s",book.publisher);
          
          printf("\n========数据录入完毕=====");
          printf("书名: %s\n",book.title);
          printf("作者: %s\n",book.author);
          printf("售价: %.2f\n",book.price);
          printf("出版日期: %d\n",book.date);
          printf("出版社: %s\n",book.publisher);
       	
          return 0;
      }
      
      • 初始化结构体变量

        初始化一个变量和数组
        int a = 520;
        int array[5] = {1,2,3,4,5};
        
  • 初始化一个结构体变量

    struct Book book = {
        "<<带你学C带你飞>>",
        "小甲鱼",
        48.8,
        20171111,
       "清华大学出版社"
    };
    
  • 初始结构体的指定成员值

    • 其语法和数组指定初始化元素类似,不过结构体指定初始化成员使用点号(.)运算符和成员名。

    • 数组使用方括号和下标值。

    • 比如我们可以让程序只初始化Book的price成员:

      struct Book book = {.price = 48.8}
      
    • 还可以不按结构体声明的成员顺序进行初始化:

      struct Book book = {
      	.publisher = "清华大学出版社",
          .price = 48.8,
          .date = 20171111
      };
      
  • 算一算

    #include<stdio.h>
    int main(void){
        struct A{
            char a;
            int b;
            char c;
        } a = {'x',520,'o'};
        
        printf("size of a = %ld\n",sizeof(a));
        return 0;
    }
    /* 结构体成员名叫a,和结构体变量名叫a,是不会冲突的。
    可以同名。错误答案 : 6
    结果 : size of a = 12
    编译器对结构体的成员进行内存对齐后的结果,内存对齐,就是让CPU可以更快地处理和读取数据
    的一个方式。所有的数据都会进行内存对齐
    对于32位系统来说,它的对齐系数通常是4个字节。*/
    
  • 把结构体稍作修改

    # include<stdio.h>
    int main(){
        struct A{
            char a;
            char c;
            int b;
        } a = {'x','o',520};
        printf("size of a = %ld\n",sizeof(a));
    	return 0;
    }
    /* size of a = 8
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值