`

回忆C语言

阅读更多

学java已经两年过去了,有时想想真是可恨,java一个这么好的一个语言,居然要背着虚拟机满街跑,对于普通客户来说那可是一种煎熬!~所以前几天我做了个决定,一个很傻很天真,很黄很暴力的决定!,没错,我要学Windows API,学一个针对WINDOWS平台的语言!

   今天的收获还算挺大,基本上把以前的C语言所有的基础类型,指针,地址,结构,联合全部回忆清楚了。

还是把这些东西记录一下吧。

 

指针:

    指针变量在定义中允许带初始化项。如:
      int i=5, j,*ip1=&i,*ip2; 在非定义状态下只能这样操作 ip1 = &i;

      指针间的操作:

ip2 = ip1 // 把ip1指向的内存地址赋值给ip2;

*ip2=*ip1 // 把ip1指向的数据赋值给ip2,也就是i,也就是5


结构体:

struct 结构名
     {
          类型  成员名;
          类型  成员名;
          ...
     } 结构变量;

 如果省略结构名, 则称之为无名结构,结构成员的表示方式为: 结构变量.成员名

 

结构指针
    结构指针是指向结构的指针。它由一个加在结构变量名前的"*" 操作符来定
义, 例如用前面已说明的结构定义一个结构指针如下:
     struct string{
          char name[8];
          char sex[2];
          int age;
          char addr[40];
     }*student; 
 struct string *student; 
 使用结构指针对结构成员的访问, 与结构变量对结构成员的访问在表达方式
上有所不同。结构指针对结构成员的访问表示为:
       结构指针名->结构成员 

     strcpy(student->name, "Lu G.C");
     student->age=18;
    实际上, student->name就是(*student).name的缩写形式。
    需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地
, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间,
这可用下面函数完成, 仍以上例来说明如下: 
 student=(struct string*)malloc(sizeof (struct string));

      位结构:

      位结构定义的一般形式为: 
           struct 位结构名{ 
                数据类型 变量名: 整型常数; 
                数据类型 变量名: 整型常数; 
           } 位结构变量; 


      例如: 下面定义了一个位结构。 
      struct{ 
          unsigned incon: 8;  /*incon占用低字节的0~7共8位*/
          unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
          unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
          unsigned blink: 1;  /*blink占用高字节的第7位*/
     }ch; 


 注意:
    1. 位结构中的成员可以定义为unsigned, 也可定义为signed,  但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
    2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
    3. 位结构总长度(位数), 是各个位成员定义的位数之和,  可以超过两个字
节。
    4. 位结构成员可以与其它结构成员一起使用。
联合:

1. 联合说明和联合变量定义
    联合也是一种新的数据类型, 它是一种特殊形式的变量。
    联合说明和联合变量定义与结构十分相似。其形式为:
     union 联合名{
          数据类型 成员名;
          数据类型 成员名;
          ...
     } 联合变量名;


联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型
和不同长度的变量

 

 下例表示说明一个联合a_bc:
     union a_bc{
          int i;
          char mm;
     };

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 的低八位和高八
位。 
枚举(enum)

 

枚举的说明与结构和联合相似, 其形式为:
          enum 枚举名{
               标识符[=整型常数],
               标识符[=整型常数],
               ...
               标识符[=整型常数],
          } 枚举变量;


如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始,  顺
次赋给标识符0, 1, 2, ...。但当枚举中的某个成员赋值后, 其后的成员按依次
加1的规则确定其值。
    例如下列枚举说明后, x1, x2, x3, x4的值分别为0, 1, 2, 3。
     enum string{x1, x2, x3, x4}x;
    当定义改变成:
      enum string
      {
          x1,
          x2=0,
          x3=50,
          x4,
      }x;
    则x1=0, x2=0, x3=50, x4=51 

  注意:
    1. 枚举中每个成员(标识符)结束符是",",  不是";", 最后一个成员可省略
","。
    2. 初始化时可以赋负数, 以后的标识符仍依次加1
    3. 枚举变量只能取枚举说明结构中的某个标识符常量。
    例如:
      enum string
      {
          x1=5,
          x2,
          x3,
          x4,
      };
     enum strig x=x3;
    此时, 枚举变量x实际上是7。

类型说明

 

类型说明的格式为:
    
typedef 类型 定义名;

类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。这
里类型是Turbo C许可的任何一种数据类型。定义名表示这个类型的新名字。
    例如: 用下面语句定义整型数的新名字:
     typedef int SIGNED_INT;
    使用说明后, SIGNED_INT就成为int的同义词了, 此时可以用SIGNED_INT 定
义整型变量。
    例如:  SIGNED_INT i, j;(与int i, j等效)。 


    typedef同样可用来说明结构、联合以及枚举。
    说明一个结构的格式为:
      typedef struct{
          数据类型  成员名;
          数据类型  成员名;
          ...
        } 结构名;


    此时可直接用结构名定义结构变量了。例如:
     typedef struct{
          char name[8];
          int class;
          char subclass[6];
          float math, phys, chem, engl, biol;
      } student;
      student Liuqi;
    则Liuqi被定义为结构数组和结构指针。


未完待续!~

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics