C语言笔记系列之十一——位段+联合体+枚举

时间:2022-09-05 21:31:21

1.编译指令:gcc 文件名–o 执行文件//o要小写

执行指令:./执行文件

2.数组的初始化时候不能使用a[5] = {1, 2, , , 4, 5}这种语句是错误的;如果只对数组的部分元素初始化(从前往后)那么后面未被初始化的元素自动赋0

3.sizeof(数组名)在数组可见范围内得到的结果是数组的大小,如果是传递参数得到的数组名,那么测试出来的大小是数组第一个单元的大小。

4.二维数组的赋值

inta[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//对全部元素赋值

inta[3][4] = {1,2,3,4, 5,6,7,8, 9,10,11,12};

inta[3][4] = {{1,2,3},{5,6},{9,10}};//对部分元素赋值

注意:如果全部赋值,那么第一维的长度可以省略。

5.scanf不能接收空格,gets可以接收空格。当使用scanf接收字符串时,如果输入的字符串长度大于定义的字符数组能够接收的字符串的长度,那么多余的字符依然会放在字符数组的后面(覆盖掉别的空间的内容),所以使用printf输出字符串时可以完整的输出。

6.fgets(数组名,数组长度, stdin); //这样的功能相当于gets

stdin表示标准输入设备,指由键盘输入的字符,stdin  是由系统定义好的,可以直接使用。

7.*:间接寻址运算符。

使用“*地址就是地址所指向的存储单元。如果使用char类型的指针指向int类型的单元,那么取得的数值就是int单元起始地址处往后取一个字节的值。

8.在使用malloc分配存储空间时,一定要做分配是否成功的判断,malloc分配空间的同时一般都会做强制类型转换。

9.数组名是个地址,是个常量,所以数组名不能++运算,也不能对数组名取地址。指针变量是个变量,里面保存地址。

10.一段函数在内存中占用一段连续的内存空间,而函数名就是该函数所占用内存空间的首地址。

函数指针的定义:类型说明符 (*函数指针变量名)(形参表);

使用函数指针调用函数的一般形式:函数指针变量(实参表);

注意:函数指针变量名两端的括号不能省略,不然系统会理解成返回值为类型说明符 *这种类型的返回值。

函数指针必须单独定义,然后让其等于已经定义好的函数名(函数地址),然后才能使用。不能在定义函数指针的时候将分号换为一对大括号然后里面跟函数体。

11.指针数组

int*p[4];//名字后面跟中括号都是表示数组

12.C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段,利用位段能够用较少的位来存储数据。

struct类型名

{

      数据类型成员名:整型常量;

      .....

};

成员名后面是一个冒号和一个整数常量,这个整数指定该位段的位长(bit

编译器对结构中位段的分配遵从下面几点原则:

1.位段成员只能是int,unsignedint,char,unsigned char

2.位段的长度不能大于字的长度。

3.位段不能是数组。

4.位段可以用整型格式输出。

5.位段引用时会被系统自动转换为整型数据。

6.对于长度为0的位段,其下一个位段从下一个字开始存放。(比如一个int的位已经被前面的占完了,只剩下0长度的位段)

7.一个位段必须存储在同一字中,不能跨两个字。

13.位段例程

#include<stdio.h>

struct st

{

      int a:4;

      int b:8;

      int c:4;

      int d:8;

      int e:4;

      int f:8;

};

intmain(void)

{

      struct st s;

      s.a = 15;//4个全1的二进制位被存放到内存中

      printf("%d ", s.a);

      printf("%d ", sizeof(struct st));

      return 0;

}

14.联合体

不同类型的数据使用相同的存储区域,这种形式的数据构造类型称为联合体。

定义:

      union联合体名

      {

             数据类型名成员名;

             ......

      }

联合体变量所占内存单元数为其成员中占最长的成员的长度。各成员共同使用同一存储区域。

#include<stdio.h>

union st

{

      int a;

      char c;

      short d;

};

intmain(void)

{

      union st s;

      s.a = 15;

      s.c = 7;

      s.d = 8;

      printf("%d ", s.a);

      printf("%d ", s.c);

      printf("%d ", s.d);

      printf("%d ", sizeof(union st));//输出8,8,8,4,只认最后一个保存的值

      return 0;

}

15.枚举

枚举类型定义:

enum枚举名{枚举元素表}

枚举元素是常量。枚举元素由系统定义了一个表示序号的数值,从0开始,依次为0,1,2,3...

enumweekday{sun,mon,tue,wed,thr,fri,sat}

sun值为0mon值为1...

enumweekday{sun=3,mon,tue,wed,thr,fri,sat}

mon的值为4,依次递加

可以在定义枚举类型时给枚举元素赋初值,初值必须   int类型。

enumday{A=10,B,C=-1,D,E}

此时,A=10B=11C=-1D=0E=1

枚举类型变量定义:enum枚举名枚举变量名;         

enmu weekdaya;

枚举变量的赋值和使用:只能把枚举元素赋给枚举变量,不能把元素的值直接赋给枚举变量(这样写的可读性不强,但是赋值可以成功)。

如:a=sun

#include<stdio.h>

enum week{Mon= 1, Tue,Wen, Thu};

intmain(void)

{

      enum week s;

      s = Tue;

      printf("%d ", s);

      return 0;

}

16.静态链表就是所有节点都是在程序中事先定义的,不是临时动态申请的,使用完后也不能释放。这种链表就称为静态链表