C语言深度解剖-2-24

来源:互联网 发布:php 内容管理系统 编辑:程序博客网 时间:2024/06/06 05:57

第一章 关键字

 

sizeof后面跟着一对括号,但不是函数

 

sizeof是关键字

 

32个关键字:

 

auto

 

char   short int long   float double

 

signed unsigned

 

struct   union

 

enum

 

static  const

 

switch case default break

 

register  volatile

 

typedef

 

extern

 

void return   continue   do while  if else  for   goto   sizeof

 

 

何:

typedef struct

{

      ValueKind kind;

      ValueType type;

      char           *name;

      int              count;

      union{

                void *vp;

                int    *ip;

                float  *fp;

      }value;

}shaderValue;

 

联合(union)

union 联合名{

        数据类型  成员名;

        数据类型  成员名;

        。。。

}联合变量名;

c语言中的结构(struct)和联合(union)简介

看到有朋友介绍union,我以前还没有用过这个东西呢,也不懂,就去搜了点资料来看,也转给大家,希望坛子里的给予改正或补充。谢谢!


            联     合(union)
  1. 联合说明和联合变量定义
  联合也是一种新的数据类型, 它是一种特殊形式的变量。
  联合说明和联合变量定义与结构十分相似。其形式为:
  union 联合名{
      数据类型 成员名;
      数据类型 成员名;
      ...
  } 联合变量名;
  联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。
  下例表示说明一个联合a_bc:
  union a_bc{
      int i;
      char mm;
  };
  再用已说明的联合可定义联合变量。
  例如用上面说明的联合定义一个名为lgc的联合变量, 可写成:
    union a_bc lgc;
  在联合变量lgc中, 整型量i和字符mm公用同一内存位置。
  当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度。
  联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时, 也要用"->;"符号, 此时联合访问成员可表示成:
  联合名->;成员名
  另外, 联合既可以出现在结构内, 它的成员也可以是结构。
  例如:
  struct{
      int age;
      char *addr;
      union{
          int i;
          char *ch;
      }x;
  }y[10];
  若要访问结构变量y[1]中联合x的成员i, 可以写成:
    y[1].x.i;
  若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:
    *y[2].x.ch;
  若写成"y[2].x.*ch;"是错误的。

  2. 结构和联合的区别
  结构和联合有下列区别:
  1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合转只存放了一个被选中的成员, 而结构的所有成员都存在。
  2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。
  下面举一个例了来加对深联合的理解。
  例4:
main()
{
  union{             /*定义一个联合*/
  int i;
  struct{         /*在联合中定义一个结构*/
        char first;
        char second;
        }half;
  }number;

  number.i=0x4241;       /*联合成员赋值*/
  printf("%c%c/n", number.half.first, mumber.half.second);
  number.half.first='a';   /*联合中结构成员赋值*/
  number.half.second='b';
  printf("%x/n", number.i);
  getch();
}
  输出结果为:
  AB
  6261
  从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。

 

 

 

 

原创粉丝点击