C语言结构体,共用体及typedef

结构体

        定义

#include 
#include 

struct student //结构体
{
    int num;       //**** 四个字节
    char name[10]; //**** **** **(**) 字节对齐 剩下的两个会补充两个 12个字节
    double garde;  //**** **** 八个字节
}stu3={3,"wangwu",88},stu4={4,"taoliu",82};

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

    struct student stu1,stu2 ={2,"lisi",83.5};

    stu1.num =1;
#if 0 //条件编译 不编译

    //stu1.name ="zhangsan"; error!
    stu1.name[0]='z';
    stu1.name[1]='h';
    stu1.name[2]='a';
    stu1.name[3]='n';
    stu1.name[4]='g';
#endif

    strcpy(stu1.name,"zhangsan");
    stu1.garde =94.3;

    printf("%d %s %f\n",stu1.num,stu1.name,stu1.garde);
    printf("%d %s %f\n",stu2.num,stu2.name,stu2.garde);
    printf("%d %s %f\n",stu3.num,stu3.name,stu3.garde);
    printf("%d %s %f\n",stu4.num,stu4.name,stu4.garde);
    printf("%ld  %dl\n",sizeof(struct student),sizeof(stu1));


    return 0;
}

     C语言结构体,共用体及typedef_第1张图片

          使用方式:

                1.先定义再使用(如stu1)

                2.边定义边使用(如stu2)

                3.定义结构体时赋值(如stu3,stu4,多个用逗号隔开)

                4.以数组形式赋值(如 s[3] ,也可以在结构体后面直接赋值如 s1[2] )

#include 
#include 

struct student
{
    int num;
    char name[10];
    double garde;
}s1[2]={{4,"lisi",89.5},{5,"wangwu",54}};

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

    struct student s[3]={{1,"zhaoyi",60},{2,"liuer",75.5},{3,"zhangsan",100}};
/*
    可以一个一个赋值,也可以和上面一样一起赋值
    struct student s[2];
    s[0].num =1;
    strcpy(s[0].name,"zhaoyi");
    s[0].garde =60;
*/    
    int i;
    for(i =0;i<3;i++){
        printf("%d %s %f\n",s[i].num,s[i].name,s[i].garde);
    }
    for(i =0;i<2;i++){
        printf("%d %s %f\n",s1[i].num,s1[i].name,s1[i].garde);
    }

    return 0;
}

C语言结构体,共用体及typedef_第2张图片

        通过指针访问值

#include 
#include 

struct student
{
    int num;
    char name[10];
    double garde;
};

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

    struct student *p;
    struct student stu1 ={2,"lisi",83.5};

    p =&stu1;

    printf("%d %s %f\n",stu1.num,stu1.name,stu1.garde);
    printf("%d %s %f\n",(*p).num,(*p).name,(*p).garde);
    printf("%d %s %f\n",p->num,p->name,p->garde);

    return 0;
}

C语言结构体,共用体及typedef_第3张图片

                1. 通过原名来访问

                2. 通过 (*p).num ... 来访问

                3. 通过 p->num ...来访问 之后常用这个

共用体

        概念

                在c语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型成为共同

        体,简称共用,又称联合体

                共用体在定义,说明和适用形式上与结构体相似,两者本质上的不同仅在于使用内存的

        方式上

        定义一个共用体的一般形式

                union 共用体名

                {

                        成员表列;

                };

#include 

union gy
{
    int a;
    char b;
};

int main(int argc,char *argv[]){
    
    union gy n;
    n.a=0x12345678;

    printf("%ld\n",sizeof(union gy)); // a,b成员共用的内存 只有四个字节
    printf("%#x\n",n.a);
    printf("%#x\n",n.b);

    n.b ='b';     //如果b进行改变 那么a的值也会改变
    printf("%#x\n",n.a);
    printf("%#x\n",n.b);

    return 0;
}

               C语言结构体,共用体及typedef_第4张图片

                        共用体中改变其中一个,另外的也会随之改变

                共用体嵌套结构体

                C语言结构体,共用体及typedef_第5张图片

                        访问用n.f.c  ...

typedef

        定义

                        在C语言中,允许使用关键字typedef定义新的数据类型

        语法

                        typedef    <已有数据类型>  <新数据类型>

                        如: typedef  int INTEGER;

                        这里重新定义了数据类型INTEGER,其等价于int

                                INTEGER   I; <==>  int  i;

                C语言结构体,共用体及typedef_第6张图片        

        使用方法

                        1. 在main函数中定义 (如STU)

                        2. 直接在结构体上定义 (如STU1) ,如果直接重命名,结构体就可以不需要取名了

                        3. 定义指针访问(如 *STU_P)

C语言结构体,共用体及typedef_第7张图片

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