结构体与共用体
c语言中的结构体有些类似对象,只是不能继承实例化,只能用于表示存储不同的数据类型。
例如顶一个Book的“对象”:
struct Book{ char title[50]; char author[50]; char subject[100]; int book_id; } book;
其中Book是结构体的标签,book结构体的变量名,里面的char title[50];是定义了一个个的变量。
==========================================================
char title[50];表示对title变量强制生命50个字符的空间。
在 C 语言中,字符串实际上是使用 null 字符 '\0' 终止的一维字符数组,比如我要打印一个hello,这一共是5个字符呢,
char greeting[] = "Hello";//最后编译器会自动增加一个
如果是:
char greeting[5] ="hello";这是会有异常显示
char greeting[4] = "hello";会提示长度太小。
===========================================================
访问结构体的成员方法:使用.(点)来访问,这个和对象使用属性比较接近。
定义好结构体以后,声明变量--->可以类比,定义好类以后,实例化对象
struct Book book1; struct Book book2;
内存对齐:
对齐方式一般多分为4字节对齐和8字节对齐,具体是那种方式,以结构体中最大的字节长度为准,如指针是8字节,则以八字节为准,如果只有char, int则以int长度为准4字节,如果一个结构体里面有三个全是char,那么就是1字节对齐。
32位系统中 long 是4个字节;64位系统中long 是8个字节
测试一下
book.c
#include <stdio.h> struct Book{ char title; int i; } book; int main (){ struct Book book; printf("%zu",sizeof(book)); }
编译运行:
gcc book.c ./a.out
========================================================================================================================================
共用体:
共用体顾名思义,就是共用内存,可以在相同的位置存储不同类型的变量。以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。就像上厕所,可以不同的人去上,但是每次只能有一个人。
共用体的大小有最大值决定。
测试一下:
#include <stdio.h> union Data { int i; float f; char u[20]; } data; int main( ) { union Data data; printf( "%d\n", sizeof(data)); return 0; }