C语言结构体、字节对齐

1、结构体所占字节空间的大小:

struct STU

{

        char b;                       (8 byte)      (4 byte)

        double a;                   (8 byte)        (8 byte)

        char c;                        (8 byte)        (4 byte)

        int num;                   (4byte)      (4 byte)

        float score;                ( 4byte)       (4 byte)

}

window(32/64)VC6.0:总的字节数为32 byte

linux(32/64)/GCC:         总的字节数为24 byte;

字节对齐:与最大字节成员对齐。(对齐参数的倍数)

PS-->自身对其参数:结构体其他成员与其字节对齐时候的字节数。

        (在windows(32)/VC6.0下各种类型的变量的自身对齐参数就是该类型变量所占字节数的大小,而在linux(32)/GCC下double类型的变量自身对齐参数是4,是因为linux(32)/GCC下如果该类型变量的长度没有超过CPU的字长,则以该类型变量的长度作为自身对齐参数,如果该类型变量的长度超过CPU字长,则自身对齐参数为CPU字长,而32位系统其CPU字长是4,所以linux(32)/GCC下double类型的变量自身对齐参数是4,如果是在Linux(64)下,则double类型的自身对齐参数是8。)

注意结构体成员为指针的使用!!(不要使用野指针)

struct STU

{

        char name[15];      

        //char *p ; (没有指向具体的地址空间)

        int num;                  

        float score;              

}

2、 结构体类型变量的定义

变量的定义:数据类型 变量名;

变量数据类型:变量所存储的数据的类型决定;

结构体类型变量的定义:3种方式

①在定义结构体类型的同时,定义结构体类型的变量;

struct STU

{

       int num;

       char name[10];

       float score;

}s1;

②先定义结构体类型,然后提取类型,再定义变量;

struct STU  s1,s2,s3;

③定义匿名的结构体类型

扩展:typedef

typedef 类型重定义----->给类型取别名

形式:typedef 原类型名 别名;

(1)基本类型重定义:typedef unsigned char U8

(2)结构体类型重定义:typedef struct student

{

       int num;

       char name[10];

       float score;

}STU;

//struct student 等价于 STU

(3)数组类型取别名:typedef int Array[10];  //Array是数组的新类型名

int main()

{

       Array a;//等价于int a[10];

       a[0]=9;

       printf("a[0]=%d\n",a[0]);

       return 0;

}

(4)函数指针类型重定义:

int(*padd)(int,int);//函数指针的定义

typedef int(*padd)(int,int);

//padd就是函数指针的新类型名;

padd p; 等价于 int (*p)(int,int);

3、结构体类型变量的初始化

形式:struct 结构体名 变量名={成员,成员.........};

示例:struct STU s1={101,"张三",98.8};

4、结构体类型变量成员访问

形式:变量名.成员名

示例:

#include<stdio.h>

struct STU
{
       int num;
       char name[10];
       float score[3];
};

int main()
{
       struct STU s1={101,"张三",{98.8,88,78}};//初始化
       struct STU s2;
       printf("%d  %s  %f  %f %f\n",s1.num,s1.name,s1.score[0],s1.score[1],s1.score[2]);
       return 0;
}

结构体类型嵌套使用:

#include<stdio.h>

struct SCORE
{
       float score1;
       float score2;
       float score3;
};

struct STU
{
       int num;
       char name[10];
       struct SCORE s;
};

int main()
{
       struct STU s1={101,"张三",98.8,88,78};//初始化
       struct STU s2;
       printf("%d  %s\n",s1.num,s1.name);
       printf("成绩:%.2f %.2f %.2f\n",s1.s.score1,s1.s.score2,s1.s.score3);
//结构体类型嵌套使用的时候,在访问成员的时候要逐层访问;
       return 0;
}

5 、结构体类型变量的赋值

注意:

①除初始化以外,结构体类型变量不能整体赋值,只能采用

引用的方式逐一赋值;

#include<stdio.h>
#include<string.h>

struct SCORE
{
       float score1;
       float score2;
       float score3;
};

struct STU
{
       int num;
       char *name;
       struct SCORE s;
};

int main()
{
       struct STU s1={101,"张三",98.8,88,78};   //初始化
       //无论以什么方式访问成员,都看的是成员本身的性质;
       s1.num=111;//赋值
       s1.name="lisi";//如果成员是数组,不能以此方式进行赋值,如果成员是指针,那么可以用此方式赋值;
       strcpy(s1.name,"lisi");
       s1.s.score3=80;
       //以输入的方式进行赋值
       printf("输入数据:");
       scanf("%d %s %f %f %f",&s1.num,s1.name,&s1.s.score1,&s1.s.score2,&s1.s.score3);
       printf("%d  %s\n",s1.num,s1.name);
       printf("成绩:%.2f %.2f %.2f\n",s1.s.score1,s1.s.score2,s1.s.score3);
//结构体类型嵌套使用的时候,在访问成员的时候要逐层访问;
       return 0;
}

6、结构体类型数组

(1)结构体类型数组的定义:3种形式;

#include<stdio.h>
#include<string.h>

struct STU
{
       int num;
       char name[10];
       float score;
};

int main()
{
       int i;
       //初始化
       struct STU a[3]={
                                          {101,"张三",89},
                                          {102,"李四",90},  
                                          {103,"王五",88}   
                                   };

       //结构体数组中成员的访问:数组名[下标].成员名;
       printf("第二个人的成绩:%.2f\n",a[1].score);
       printf("输入数据:\n");
       for(i=0;i<3;i++)
       {
              printf("输入第%d个人的信息:",i+1);
              scanf("%d %s %f",&a[i].num,a[i].name,&a[i].score);
       }

       //输出
       printf("输出数据:\n");
       for(i=0;i<3;i++)
       {
              printf("%d  %s  %.2f\n",a[i].num,a[i].name,a[i].score);
       }

       return 0;

}

7 、结构体类型指针

结构体类型指针指向变量:

#include <stdio.h>

int main()

{
       struct STU s={101,"张三",90};
       struct STU *ps=&s;//指针指向变量s
       /*指针访问成员:

       1.(*指针名).成员名;

       2.指针名->成员名;

       */
       printf("输入数据:");
       scanf("%d %s %f",&(*ps).num,ps->name,&ps->score);
       printf("%-10d  %-15s  %.2f\n",s.num,s.name,s.score);
       printf("%-10d  %-15s  %.2f\n",(*ps).num,ps->name,ps->score);   
       return 0;

}

结构体类型指针指向数组:

示例:

#include<stdio.h>
#include<string.h>

struct STU
{
       int num;
       char name[10];
       float score;
};

int main()
{
       int i;
       //初始化
       struct STU a[3]={
                                          {101,"张三",89},
                                          {102,"李四",90},  
                                          {103,"王五",88}   
                                   };

       struct STU *pa=a;//指针指向数组
       //结构体数组中成员的访问:数组名[下标].成员名;
       printf("第二个人的成绩:%.2f\n",a[1].score);
       printf("输入数据:\n");
       for(i=0;i<3;i++)
       {
              printf("输入第%d个人的信息:",i+1);
              //scanf("%d %s %f",&a[i].num,a[i].name,&a[i].score);
              scanf("%d %s %f",&(*(pa+i)).num,(pa+i)->name,&(pa+i)->score);
       }
       //输出
       printf("输出数据:\n");
       for(i=0;i<3;i++)
       {
              //printf("%d  %s  %.2f\n",a[i].num,a[i].name,a[i].score);
              printf("%d  %s  %.2f\n",(*(pa+i)).num,(pa+i)->name,(pa+i)->score);
       }

       return 0;

}

共用体

数据类型:四类

基本数据类型:整型,字符型,浮点型;

构造数据类型:数组,结构体,共用体(联合体);

指针

空类型:void   void * (万能指针)

共用体性质:一组具有相同或者不同数据类型的数据的有序集合,

但是所有成员共用同一个地址空间;

共用体类型的定义:

union  共用体名

{

      成员列表;

};

示例:

#include<stdio.h>

int main()

{
       //共用体类型的定义
       union Data
       {
              char c;
              int d;
              float f;
       };

       printf("size=%d\n",sizeof(union Data));
       union Data data={.f=33333.1456};//共用体类型变量的定义,以及初始化
       //共用体成员的访问与结构体方式相同,变量名.成员名;

       data.c='x';
       printf("c=%c\n",data.c);
       data.d=2147483647;
       printf("d=%d\n",data.d);
       printf("f=%f\n",data.f); 

       return 0;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值