C语言基础知识——结构体

1、C语言中提供了一些由系统已经定义好的数据类型,如:int,float,char等,用户可以在程序中用它们定义变量,解决一般的问题,但人们要处理的问题往往比较复杂,只有系统提供的类型还不能满足应用的要求,C语言允许用户根据需要自己建立一些数据类型,用它来定义变量。

2、C语言允许用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体。
声明一个结构类型的一般形式如下:
  struct 结构体名
  {
   成员列表
  };

大括号内是该结构体中的各个成员,由它们组成一个结构体,对各成员都应进行类型声明。举例如下:

	struct student1
	{
		int id;
		char name[20];
	}s0;//定义struct student1类型的变量s0

注:一个结构体变量中可以存放一组数据(结构体数组)
定义结构体类型的变量,并在其中存放具体的数据。举例如下:

struct student1 s1; //定义struct student1类型的变量s1

struct student1 s2 = {2, "小明"}; //定义结构体变量并直接初始化
struct student1 s3 = {4, "小红"};

注:a. 类型与变量是不同的概念,只能对变量赋值,存取或运算。不能对一个类型赋值,存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间
  b. 对结构体中的成员可以单独使用,它的作用相当于普通变量
  c. 成员也可以是一个结构体变量

  
  使用.引用成员,指针用“->”引用成员

 	printf ("id2 = %d, name2 = %s\n", s2.id, s2.name);     //id2 = 2, name2 = 小明
	struct student1 *ps = &s1;
	s1.id = 20;
	printf ("id4 = %d, name4 = %s\n", ps->id, ps->name); //id4 = 20, name4 = 小红

3、内存对齐
I、结构体成员的首地址要能被该成员的类型长度整除
II、结构体为成员分配空间原则:
a、每次分配的时候按当前最大类型分配
b、如果当前空间够用,则不再分配空间
c、如果当前类型大于系统系数的时候,按系统系数标准进行分配空间,否则按最大类型分配空间

#include <stdio.h>

struct Test
{
	char c1;
	int  a;
	char c2;
	//char c3——再加上c3这一成员时,所占内存空间依旧为12字节
};

struct Test1
{
	char c1;
	char c2;
	char c3;
	int  a;
};

struct Test2
{
	char c1;
	short s;
	int  a;
	char c3;
	struct Test t1;  //成员也可以是一个结构体变量
	int b[20];
};

int main()
{
	printf ("sizeof Test = %lu\n", sizeof(struct Test));      //sizeof Test = 12
	printf ("sizeof Test1 = %lu\n", sizeof(struct Test1));  //sizeof Test = 8
	printf ("sizeof Test2 = %lu\n", sizeof(struct Test2));  //sizeof Test = 104
	
	struct Test2 t1, t2;
	t1 = t2;//通过结构体可对数组进行赋值
 
	return 0;
}

**4、**共用体
所用成员共用一段内存,共用体大小是成员中占据最大的成员的大小

union Test
{
	int a;
	char c;
};

int main()
{
	printf ("sizeof Test = %lu\n", sizeof(union Test)); //sizeof Test = 4
		
	union Test t;
	t.a = 10;
	t.c = 'A';
	
	printf ("%d\n", t.a); //65,原先所存的Int型的10,被后存入的char型‘A’所覆盖(‘A’==65)
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ypjsdtd/article/details/84566279