结构体struct

int main()
{
    /*
     定义结构体类型
     1.结构体占用空间大小为属性(成员)占用空间大小的和
        1>如果结构体占用空间大小不是占用空间最大元素的倍数
          则会自动补齐为倍数。
        2>sizeof(p4.name)=8, sizeof(p4.age)=4, sizeof(p4.sex)=4
          8+4+4=16, 16=2*8 所以 sizeof(p4)=16
        3>sizeof(t.a)=8, sizeof(t.b)=4
          8+4=12, 12<2*8 && 12>1*8 所以 sizeof(t)=16

     2.指针占用8byte
     3.结构体在内存中的存放方式

     低位

     地址      属性名称
     ff00       name
     ff08       age
     ff0c       sex

     高位

     4.相同作用域范围内的结构体类型名称不能重复
     5.结构体类型定义时,可省略名称
     6.结构体类型定义在哪里,那么他的作用域范围就属于那里
       如果在函数test里定义了结构体T,那么结构体T只能在函数test里使用
     7.结构体类型必须在使用前定义,如果结构体的类型定义在使用之后会报错
       类似变量在定义后才能使用,是一个道理

     */

    struct Test
    {
        char *a;
        int b;
    }t;

    struct Person
    {
        char *name;
        int age;
        int sex;
    }p4;//可在定义类型时直接定义变量


    /*
     此方式定义结构体变量是正确的
     允许省略结构体名称
     */
    struct
    {
        char *a;
        int b;
    } t1;



    printf("sizeof(p4)=%lu, sizeof(p4.name)=%lu"+
          "\nsizeof(p4.age)=%lu, sizeof(p4.sex)=%lu\n\n",
           sizeof(p4), sizeof(p4.name),
           sizeof(p4.age),sizeof(p4.sex));
    printf("sizeof(t)=%lu, sizeof(t.a)=%lu, sizeof(t.b)=%lu\n\n",
           sizeof(t), sizeof(t.a),sizeof(t.b));


    printf("&p4=%p, &p4.name=%p \n&p4.age=%p, &p4.sex=%p\n\n",
           &p4,&p4.name,&p4.age,&p4.sex);

    printf("----------------------------------------\n\n");

    //定义结构体变量
    struct Person p1={"p1",10,1};

    struct Person p2;
    p2.name="p2";
    p2.sex=0;
    p2.age=11;

    //赋值的时候可以不按照顺序,但必须指定属性
    struct Person p3={.age=12,.name="p3",.sex=1};

    p4.name="p4";

    printf("p1=%s, p2=%s, p3=%s, p4=%s\n\n",p1.name,p2.name,p3.name,p4.name);

    struct Test tt[3]=
    {
        {"tt1",1},
        {"tt2",2},
        {"tt3",3}
    };

    //错误的写法,结构体只有在初始化时才允许用{}进行赋值
    //tt[0]={"5",5};

    tt[0].a="tt5";
    tt[0].b=5;

    for(int i=0;i<3;i++)
    {
        printf("%s,%d\n",tt[i].a,tt[i].b);
    }

    printf("----------------------------------------\n\n");

    /*
     结构体指针
     */
    struct Person *pp=&p1;

    //先取出对应的结构体变量(*pp) 再找对应的属性
    printf("(*pp).name=%s, (*pp).age=%d, (*pp).sex=%d\n\n",
           (*pp).name,(*pp).age,(*pp).sex);
    //直接通过结构体地址找到结构体中的属性 -> 用在结构体指针中
    printf("pp->name=%s, pp->age=%d, pp->sex=%d\n\n",
           pp->name,pp->age,pp->sex);

    printf("----------------------------------------\n\n");

    /*
     结构体的嵌套定义
     1.结构体不允许包含自己
       struct Test{
            struct Test t;
       };

       上边是错误的写法

     */
    struct Test2
    {
        int a;
        struct Test t;
    };
    struct Test2 test2={1,{"t1",1}};
    test2.t.b=10;
    printf("test2.a=%d, test2.t.a=%s, test2.t.b=%d\n\n",
          test2.a,test2.t.a,test2.t.b);


    return 0;
}

输出结果

sizeof(p4)=16, sizeof(p4.name)=8
sizeof(p4.age)=4, sizeof(p4.sex)=4

sizeof(t)=16, sizeof(t.a)=8, sizeof(t.b)=4

&p4=0x7fff4ff78bc8, &p4.name=0x7fff4ff78bc8 
&p4.age=0x7fff4ff78bd0, &p4.sex=0x7fff4ff78bd4

----------------------------------------

p1=p1, p2=p2, p3=p3, p4=p4

tt5,5
tt2,2
tt3,3
----------------------------------------

(*pp).name=p1, (*pp).age=10, (*pp).sex=1

pp->name=p1, pp->age=10, pp->sex=1

----------------------------------------

test2.a=1, test2.t.a=t1, test2.t.b=10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值