c语言:结构体与共用体

1.结构体

   1.声明一个结构体类型的一般形式为

    struct   结构体名

    { 成员列表};

  注意不要忽略最后的分号。struct 是声明结构体类型时所必须使用的关键字,不能省略),它向编译系统声明这是一个“结构体类型”,它包括 num、name、sex、age、score、addr等不同类型的数据项。应当说明struct student是一个类型名。

   结构体名第一个字母必须大写。

例如:

  2.定义结构体类型变量

      1.先声明结构体类型再定义变量名

         

struct Test1        //这是声明
{
    int i;
    double k;
};
int main(void)
{
    struct Test1 s;  //这是定义
}

    2.再声明类型的同时定义变量

      

struct   结构体名

    {

           成员列表

    }变量名表列;

struct  Test1
{
    int i;
    double k;
} s;

   3.直接定义结构体类型变量

   struct   

    {

           成员列表

    }变量名表列;

   这样定义,在下面的函数中就不能再定义变量了。

  注:     (1)类型与变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。

              (2)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。

              (3)成员也可以是一个结构体变量。

             (4)成员名可以和程序中的变量名相同,二者不代表同一对象。

3.结构体变量的引用

   不能将一个结构体变量作为一个整体进行输人和输出。只能对结构体变量中的各个成员分别进行输入和输出。引用结构体变量中成员的方式为        结构体变量名.成员名

   如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。

   对结构体变量的成员可以像普通变量一样进行各种运算。

   可以引用结构体变量成员的地址,也可以引用结构体变量的地址。

4.结构体变量的初始化

    

struct Test1
{
    int i;
    float j;
};
int main(void)
{
    struct Test1 = {1,2.0};
    return 0;
}

 在初始化时,顺序必须按照结构体成员声明先后次序依次初始化。

 在初始化时,可以对部分成员初始化,其他成员为0。

5.sizeof

   结构体对齐:为了提高cpu的执行效率。

   1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
   2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
   3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
   4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。

  6.定义结构体数组和结构体数组初始化

     

struct Test2
{
    int i;
    char c[20];
};
int main(void)
{
    struct Test2 a[] = {{1,"hello"},
                        {2,"world"}};
    return 0;
}

7.用结构体变量和指向结构体的指针做函数参数

   当结构体作为函数参数传递时,一般用指针传递,效率快。

   当指向结构体中成员时,变量后用 .,指针后用 ->

  结构体变量可以整体赋值。

8.链表

   链表是由若干个节点组成。

   链表节点地址不连续。

   phead指向第一个节点。

   

有头链表 (第一个节点中的值域无用)

无头链表  (第一个节点中的值域有用)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值