结构体(2)【C语言】

/*结构体数组*/

#include 
#include 

typedef struct BOOK1{
    int id;
    char name[128];
    float price;
}BOOK2;

int main()
{    
    int i;
    BOOK2 book_0[3]={{1,"aaa",11.11},{2,"bbb"}};
    for(i=0;i<3;i++)
    {
        printf("id=%d,  name:%s,  price=%.2f\n\n"
        ,book_0[i].id
        ,book_0[i].name
        ,book_0[i].price);
    }
    
    BOOK2 book_1[2];
    printf("输入:\n");
    for(i=0;i<2;i++)
    {
        scanf("%d%s%f"
        ,&book_1[i].id
        ,book_1[i].name
        ,&book_1[i].price);
    }
    for(i=0;i<2;i++)
    {
        printf("id=%d,  name:%s,  price=%.2f\n\n"
        ,book_1[i].id
        ,book_1[i].name
        ,(*(book_1+i)).price);
    }

    
}

/*编译结果:
id=1,  name:aaa,  price=11.11

id=2,  name:bbb,  price=0.00

id=0,  name:,  price=0.00

输入:
33 cc 33.3
44 dd 44.4
id=33,  name:cc,  price=33.30

id=44,  name:dd,  price=44.40
*/
/*总结:
结构体数组本质上是一个数组,数组中元素的类型是结构体类型。
使用“结构体关键字 结构体类型 数组名[数组长度]”的格式来定义一个结构体数组。
*/

/*结构体指针*/

#include 
#include 

typedef struct students{
    int id;
    char name[10];
    float score;
}student;

int main()
{    
    student *p=NULL;
    printf("p=%d\n",sizeof(p)); //p=4  p是一个指针  p->id=123  不可直接赋值 p指针要有指向
    student stu;
    p=&stu;
    p->id=123;strcpy(p->name,"abc");p->score=12.3;
    printf("id=%d, name:%s, score=%.2f\n",p->id,p->name,p->score);
    
    student STU[3];
    student *q=&stu;
    int i;
    for(i=0;i<3;i++)
    {
        printf("输入:\n");
        scanf("%d%s%f",&(q+i)->id,(q+i)->name,&(q+i)->score);
    }
    
    for(i=0;i<3;i++)
    {
        printf("id=%d, name:%s, score=%.2f\n"
                ,(*(p+i)).id,(p+i)->name,(p+i)->score);
    }
    
    
}

/*编译结果:
p=4
id=123, name:abc, score=12.30
输入:
1 a 11
输入:
2 b 22
输入:
3 c 33
id=1, name:a, score=11.00
id=2, name:b, score=22.00
id=3, name:c, score=33.00
*/
/*总结:
结构体指针本质上是一个指针,指针的类型是结构体类型。
定义格式:“结构体关键字 结构体类型 *变量名”

p是一个指针  p->id=123  不可直接赋值 p指针要有指向(p=&stu)
(q+i)->id:   ->优先级高
(*(p+i)).id:  .的优先级高于*
*/

/*共用体*/

#include 
#include 

typedef union students{
    int id;
    char name[10];
    float score;
}student;
union NUM{
    int a;
    char b;
};

int main()
{    
    //共用体结构类型字节大小
    student stu;
    printf("sizeof(int)+sizeof(char)*10+sizeof(float)=%d\n",sizeof(int)+sizeof(char)*10+sizeof(float));
    printf("stu=%d\n",sizeof(stu));
    printf("union students = %d\n",sizeof(union students));
    
    //共用体赋值输出
    printf("输入:\n");
    student *p=&stu;
    scanf("%d%s%f",&p->id,p->name,&p->score);
    printf("id=%d,  name:%s,  score=%.2f\n",p->id,p->name,p->score);
        
    //共用体判断大端(小尾)
    union NUM num;
    union NUM *q=#
    q->a = 0x12345678;    //int 4字节32位    16进制一位==2进制四位
    printf("q->b = %#x",q->b);
    
}

/*编译结果:
sizeof(int)+sizeof(char)*10+sizeof(float)=18
stu=12
union students = 12

输入:
123 abc 12.34
id=1095069860,  name: pEA        ,  score=12.34

q->b = 0x78
*/
/*总结:
    4                 12                   12
———     —————     —————     =    12
 int(4)          char(1)            float(4)  
共用体是一个特殊的结构体,使用关键字“union”来表示一个共用体。
共用体中的数据成员共用一个内存空间,成员变量的最新赋值会把之前的数据覆盖掉。
共用体变量在存储器中占用的存储空间就是共用体最大成员变量占用的空间且最终的申请空间是最大类型的整数倍
在windows操作系统下,最终所占字节是成员中最大类型的整数倍
在linux操作系统32位下,最终所占字节是4的整数倍。

小端
            0x78         0x56        0x34         0x12
int  :   ————   ———     ———    ————
            cahr/0         1              2               3
*/

/*枚举类型*/

#include 
#include 

enum num{a,b,c,d};
enum NUM{q,w,e=0,r};

int main()
{    
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    printf("c=%d\n",c);
    printf("d=%d\n\n",d);
    
    printf("q=%d\n",q);
    printf("w=%d\n",w);
    printf("e=%d\n",e);
    printf("r=%d\n\n",r);
    
}

/*编译结果:
a=0
b=1
c=2
d=3

q=0
w=1
e=0
r=1
*/
/*总结:
枚举类型是一组整形常量
格式定义:“enum 枚举类型名{枚举常量1,枚举常量2,枚举常量3,….,枚举常量n}”
枚举常量默认从0开始,后面一个是前面的成员变量加1。
*/
 

你可能感兴趣的:(C语言,c语言)