c语⾔联合体定义中冒号作⽤,C语⾔笔记系列之⼗⼀——位段
+联合体+枚举
1.编译指令:gcc ⽂件名 –o 执⾏⽂件 //o要⼩写
执⾏指令:./执⾏⽂件
2.数组的初始化时候不能使⽤a[5] = {1, 2, , , 4, 5}这种语句是错误的;如果只对数组的部分元素初始化(从前往后)那么后⾯未被初始化的元素⾃动赋0。
3.sizeof(数组名)在数组可见范围内得到的结果是数组的⼤⼩,如果是传递参数得到的数组名,那么测试出来的⼤⼩是数组第⼀个单元的⼤⼩。
4.⼆维数组的赋值
int
a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//对全部元素赋值
int
a[3][4] = {1,2,3,4, 5,6,7,8, 9,10,11,12};
int
a[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,unsigned
int,char,unsigned char。
2).位段的长度不能⼤于字的长度。
3).位段不能是数组。
4).位段可以⽤整型格式输出。
5).位段引⽤时会被系统⾃动转换为整型数据。
6).对于长度为0的位段,其下⼀个位段从下⼀个字开始存放。(⽐如⼀个int的位已经被前⾯的占完了,只剩下0长度的位段)
7).⼀个位段必须存储在同⼀字中,不能跨两个字。
13.位段例程
#include
struct st
{
int a:4;
int b:8;
int c:4;
int d:8;
enum c++int e:4;
int f:8;
};
int
main(void)
{
struct st s;
s.a = 15;//4个全1的⼆进制位被存放到内存中
printf("%d ", s.a);
printf("%d ", sizeof(struct st));
return 0;
}
14.联合体
不同类型的数据使⽤相同的存储区域,这种形式的数据构造类型称为联合体。
定义:
union 联合体名
{
数据类型名成员名;
......
};
联合体变量所占内存单元数为其成员中占最长的成员的长度。各成员共同使⽤同⼀存储区域。#include
union st
{
int a;
char c;
short d;
};
int
main(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,
enum
weekday{sun,mon,tue,wed,thr,fri,sat};
sun值为0,mon值为1...
enum
weekday{sun=3,mon,tue,wed,thr,fri,sat};
mon的值为4,依次递加
可以在定义枚举类型时给枚举元素赋初值,初值必须
是int类型。
enum
day{A=10,B,C=-1,D,E};
此时,A=10,B=11,C=-1,D=0,E=1
枚举类型变量定义:enum
枚举名 枚举变量名;
enmu weekday
a;
枚举变量的赋值和使⽤:只能把枚举元素赋给枚举变量,不能把元素的值直接赋给枚举变量(这样写的可读性不强,但是赋值可以成功)。如:a=sun;
#include
enum week{Mon= 1, Tue,
Wen, Thu};
int
main(void)
{
enum week s;
s = Tue;
printf("%d ", s);
return 0;
}
16.静态链表就是所有节点都是在程序中事先定义的,不是临时动态申请的,使⽤完后也不能释放。这种链表就称为“静态链表”。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论