C的构造类型:结构体、枚举、联合体

前言:数组只能存储相同类型的数据,使用构造类型可以在一个结构中存储不同类型的数据还保持了数据的独立性;提高了信息处理的能力;

1 结构体 struct

  1.1 基本结构体

    1.1.1 结构体声明

struct Book{
char title[100];
float price;
};
/*结构体定义表明了该结构体是如何存储数据的的形式,相当于一种数据类型struct Book;不是实体;*/
/*结构体声明不是函数定义,可以声明在函数内外,头文件中等;*/

    1.1.2 结构体初始化

struct Book library={
"C Primer Plus ",
53.5
};  /*定义变量,并按顺序初始化*/

struct Book library1={
.price=35.5,
.title="C Program"
};  /*定义变量,并用初始化器初始化*/

struct Book{
char title[100];
folat price;
} library1={"C Program",35.5};
   /*声明结构体,并定义变量及初始化*/

    1.1.3 结构体成员调用

printf("title:%s",library1.title );   
/*成员运算符的优先级max,结构体成员与普通变量使用方法一样;汉字属于字符串;*/
/*如果一个结构体成员还是结构体,初始化或者调用的时候是使用结构体内的结构体的成员;要层级调用;*/

  1.2 结构体数组:数组元素是结构体变量的数组;

    1.2.1 声明

struct Book library3[100];
/*library3具有100个元素,每个元素都是一个struct Book类型的对象;*/

    1.2.2 初始化

library3[0]={"book name"35.9};

    1.2.3 调用

printf("book name ==  %s ", library3[0].title );
printf("    k     ==  %s ", library[0].title[3] );
printf("   35.9   ==  %.2f ", library3[0].price );

  1.3 指向结构体变量的指针:传递的是结构体变量的起始地址

    1.3.1 指向结构体的指针声明

/*先假设有两个结构体如下:*/
struct Friends{
char friend1[20];
char friend2[20];
};

struct Info{
char name[20];
int age;
struct Friends connct_people };

struct Info ZHANGSAN={
"zhang san",24,{"lee si ", "wang wu"}};

/*声明一个指向struct Info类型的指针*/
struct Info * ptr_Info ;
ptr_Info= &ZHANGSAN;

    1.3.2指向结构体的指针调用

printf("name==zhang san %s ", ( * ptr_Info).name );
printf("age == %d" , ptr_Info -> age );
/*  结构体变量.成员  = (* 结构体指针).成员  = 结构体指针->成员  */
/*. 运算符和->运算符的优先级高于自加加运算符 */
ptr_Info->age++;      //先取出age的值,使用后值加1;
++ptr_Info->age ;     //取出age的值,值加1后使用;
(++ptr_Info) ->age ;  //先将指针移动至下一个结构体变量,然后使用age的值??应该是这个意思

  1.4 结构体与函数参数的联系 

    1.4.1 使用结构体成员作为函数实参传递

#include<stdio.h>
struct Fund{
double bankfund;
double save;
} David={300.2 , 400.3};

double sum(double total,double save_money)
{
    return  ( total+save_money )  ; 
} 

int main(void)
{
     printf(" %.2f " , sum(David.bankfund , David.save ) ) ; 
}

    1.4.2 使用指向结构体变量的指针  作为函数实参传递

#include<stdio.h>
struct Fund{
double bankfund;
double save;
} David={300.2 , 400.3};

double sum( const struct Fund * money )
{
    return  ( money->bankfund + (* money).save  )  ; 
} 
/*传递的是指向结构体的指针,养成习惯给它加个const,防止数据串改;*/

int main(void)
{
     printf(" %.2f " , sum( &David ) ) ; 
}

     1.4.3 使用结构体变量  作为函数实参传递

#include<stdio.h>
struct Fund{
double bankfund;
double save;
} David={300.2 , 400.3};

double sum( const struct Fund Struct_money )
{
    return  ( Struct_money.bankfund + Struct_ money.save  )  ; 
} 
/*传递的是指向结构体的指针,养成习惯给它加个const,防止数据串改;*/

int main(void)
{
     printf(" %.2f " , sum(David ) ) ; 
}

    1.4.4 结构体类型相同的变量可以互相赋值,并给新的相同类型的结构体变量初始化;(感觉并不值得特别指出,但是也不想丢弃的特性;)

2 联合体 union:把几种不同类型的变量存放在同一段内存中,同一时刻的共用体变量只有一个值;

  2.1 声明

union favorite{
int num;
char fruit[20];
};
union favorite Bob="apple" ;
/*创建并初始化了union favorite类型的变量Bob;*/

union favorite Bob= 8 ;
/*重新初始化Bob对象为8;前面的apple被清除了*/

/*使用方法和struct相同,但是联合体基本用不上;*/

3 枚举 enum:用变量名来表示整型常量;

  3.1 声明枚举类型

enum color {red, orange, yellow, green, blue,violet };
/*创建一个enum colorType的枚举类型 */
/*默认从0开始初始化,依次加1给下一个常量初始化;*/

  3.2初始化枚举类型

enum color {red=1,yellow=3,blue = 5};
/*声明的同时初始化常量,常量初始化之后不可以在调用过程中修改;*/

enum color {red , yellow, blue =5, green };
/*red默认为0,yellow默认递增为1,blue为5,green递默认递增为6;*/
原文地址:https://www.cnblogs.com/caesura-k/p/9807634.html