结构类型是一种能够将不同的数据类型的成员组织起来所形成的一种新的构造类型。
声明结构类型是创建用户自定义的数据类型的过程,它并不创建对象,既不进行存储分配。
声明结构类型的一般形式是: 存储类型 struct 结构类型名{ 成员声明表 };其中:struct是关键字,用以说明结构类型,结构体类型名是该结构体类型的名字,花括号界定的是成员声明表。
存储方法有两大类:静态存储类和动态存储类。具体包括四种:自动的(auto),静态的(static),寄存器的(register)和外部的(extern);
auto变量:函数中的局部变量,如不专门声明static,一般都是动态地分配存储空间。自动变量:在调用该函数时系统会给他们分配存储空间,一旦函数调用结束这些存储空间就会自动释放。关键字“auto”可以省略,不写则隐含确定为“自动存储类别”,属于动态存储方式。
static声明变量:用static声明的静态局部变量,在函数调用结束后不消失,反而保留当前的数据,在下一次该函数调用时,该变量现有的值就是上一次函数调用结束时的值。一般用static声明一个变量的作用有二:(1)对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在。(2)对全部变量用static声明,则该变量的作用域只限于本文件模块,即被声明的文件中。
register变量:一般变量的值都是存储在内存中,(当程序需要用到哪一个变量的值,由控制器发出指令将内存中该变量的值送到运算器,完了如果需要存数,再从运算器将数据送到内存中存放。)所以就引出一个问题,如果我们进行一段频繁的运算,则存储变量的值肯定要花费不少时间,所以C语言允许将局部变量的值存放在寄存器中,这样需要时就直接搬用,不必再进行过内存。提高运算速度。
extern声明外部变量:外部变量(即全局变量)是在函数的外部定义的。作用域为从变量的定义处开始,到本程序文件的结尾。可以在一个文件内声明外部变量;
对结构变量中成员的应用则需要通过成员选择运算符“.”来实现。当两个结构体变量的类型相同时,他们之间可以直接相赋值。
通过成员运算符"."对成员进行访问和操作: 结构体变量名.成员名 "."操作符具有最高优先级;
结构变量的成员的数据类型还可以是除自身之外的其他结构类型。
访问结构指针所指结构变量的成员的表达式的一般形式:(*结构指针).成员名; 它表示先通过*操作访问结构指针所指结构变量,再通过.操作符访问结构指针所指结构变量的成员;
struct IC_Card a,b = {"zhangdan","2112324","435224",19843578};
struct IC_Card *pa = &a, *pb = &b;
*pa = *pb; 与a = b等价;
scanf("%s",(*pa).name);
scanf("%d",&(*pa).balance);
通过成员选择运算符"->"访问结构变量的成员: 结构指针名->结构成员名; 它表示应用结构指针所指结构变量的成员。
char *printx()
{
char a[] = “hello”;
return a;
}
这种写法是有问题的,它返回的是数组a的地址值,但数组a是函数中得一个局部变量,函数执行完,a所指向的那片空间会被释放掉。
但结构体可以作为返回值;char c[] =“abcdef\0\0\0\0\0”
printf(“%zu, %lu”,sizeof(c),strlen(c)); 12,6;
对齐方式
#pragma pack(n) n只能为2的指数倍,以n个字节作为内存分配的最小单位长度;
结构体类型分配内存,默认按字节最大的类型来作为单位长度
struct student {
long time;
long time2;
long time3;
int age;
int age;
char b,c;
char name[10];
}
struct student2 {
long time;
int age;
long time2;
int age;
long time3;
char b,c;
char name[10];
}
默认情况下:sizeof(struct student),sizeof(struct student2) 字节长为48,56;
但指定分配方式后#pragma pack(1)后, 字节长变为42,42;