结构:
结构变量
struct{
int number;
char name[10];
int onHand;
}part1,part2;
初始化:
{112,"Disk",10}
c99中指定的初始化:
{.number = 112,.name = "Disk",.onHand = 10}//若赋值不完全,则默认为0
结构体
声明:
typedef struct part{
int num;
char name[10];
long ld;
}part;//别名
由于内存分配会将结构中的变量分配到内存的边界上,以方便访问,所以每个成员方的位置是从本身长度的倍数位开始。但本身长度超过4 的,以4计算。此成为对齐。
结构 struct:
作为参数传递以及返回值,结构变量和基本数据类型(如 int)一样的。
传递的是结构变量的地址(指针):
(*指针).成员 指针->成员(常见用法)
对齐:
分配内存的时候,每个成员都要放在他长度的倍数位置,如果不够,补位对齐,
若大于4,则为4。
补齐:
对整个结构变量的空间要求总长度一定是最长的成员的倍数,不够补齐。
不管是对齐还是补齐,最长的成员长度超过4,以4计。
数组成员以数组元素的长度计算,而不是以数组的整个长度。
位段(位域):本质上是一个结构
struct switch{//最后会补齐成int的倍数
int s1:1; //占一个二进制位
int s2:1;
int s3:1;
};
用二进制位对结构的成员进行内存分配。(一般在程序中不太使用,效率低)。
但可以节省内存的使用,经常用在内存受限的地方。
联合 union:(是一个公共的单元)
使用方式和结构一样,通过.运算操作成员。
所有成员的首地址相同。 用不同的视角解释一片内存,在一定情况下可以节省内存。
枚举 enum:(是常量,默认从0开始)
C语言中的枚举类型等同于int类型,枚举值就是int型的常量,类似于const int定义的常量值,也等同于整形字面值(如 1,2,3,4)
使用枚举可以提高程序的可读性,方便编程。
C语言中的结构、联合、枚举都不同于C++中的结构、联合和枚举。可以这么说,C++中的
结构、联合和枚举兼容于C,但功能比C更多,要求也更严格。
数组:
一维数组:
访问一个不存在的元素,可能导致断错误,可能破坏数据
编译时不会检查越界。
在函数传递时指向同一个地址,不再重新分配空间。在形参出可以不指出数组的大小,一般会把数组的
大小用变量分开传递。(eg:(int a[] ,int n))
初始化:
int a[10] = {1,2,3,4,5,6,7,8,9,0};
但不可以是:int a[10];
a = {1,2,3,4,5,6,7,8,9,0};
int c[10] = {1,2,3,4,5}//后面的数据为0
int c[10] = {};//是垃圾数据,不一定是0
int d[5] = {1,2,3,4,5,6,7}//多余的数据会自动丢弃,会出现警告
int d[] ={1,2,3,4,5}//编译器会自己计算长度来确定数组的大小。
int d[10] = {0};//通常用该法初始化数组
数据之间的赋值必须是单个数据赋值,不能直接赋值(eg:a = c)
二维数组:
初始化: int a[3][4] = {0};//全部初始化为0
int a[2][3] ={{1,2,3},{4,5,6}};
int a[2][3] ={{1,2},{4,5,6}};//缺少的用0补
int a[2][3] ={{1,2,3,4,5};//最后一个用0补
在函数传递时必须指定第二维的大小,第一维的大小用参数传递。因此二维数组的传递时只能是第二维
大小相同才可以,否则会出现错误。
eg: 形参为: f(int a[][4] ,int n)
实参必须为: f(a,m) 但a数组的定义中必须为:int a[5][4]; a[4][4]......
字符串数组:
char ss[2][4] = {"abc","def"};//栈里面分配的,可以修改
strcpy(ss[0],"ccc");
//ss[0] = "ccc"; //错误,相当于改变数组名
//数组本身在栈区,字符串在代码区
char *ss[3] = {"aaa","bbb","ccc"};
//strcpy(ss[0], "abc"); //错误,在修改代码区
ss[0] = "ABC";//相当于改变指针的指向
用第一种字符串数组更好
多维数组:
数组可以是任意维数的。
C语言是按照行主序存储数组的。
多维数组的初始化:
初始化时没有足够的数字填满数组,则补0;
甚至可以省掉内存的花括号
本质上和一维数组是一样的,但形式上不一样。
变长数组:c99中才允许
数组:
含有多个数据值的数据结构。
每个数据值具有相同的数据类型,这些数据成为元素。
下标:
1、从0开始
2、c语言不检查下标的范围, 当越界访问时,结果不可预知