C语言学习笔记:22_结构体

/*
 * 22.结构体.c
 *
 *  Created on: 2015年7月9日
 *      Author: zhong
 */
#include 
#include 

/**
 * 结构体:对共性数据的封装
 * 结构体有点使用面向对象的思想,对一类东西的共性进行封闭,以便使用。
 *
 *	定义结构体:
 *	//1>定义结构体,也可以定义在函数中(全局与局部的结构体)
	 struct Person{
		 char *name;// 字符串
		 int age;
		 double hiegth;
	 }; //有分号结尾

	2>:定义一个结构体时并创建一个结构体变量
	struct Person {
		char *name; // 字符串
		int age;
		double hiegth;
	} p;

	3>:没有名字的结构体,只能使用一次
	struct {
		char *name; // 字符串
		int age;
		double hiegth;
	} p;
 *
 */

//---------结构体的基本定义与使用-----------------------------------
//定义结构体,也可以定义在函数中(全局与局部的结构体)
struct Person {
	char *name; // 字符串
	int age;
	double hiegth;
};
//有分号结尾

void use_struct() {
	//创建构造体变量
	struct Person p = { "zhong", 18, 159.0 }; //创建构造体时并赋初值(只有在创建时才可以使用{}赋值)
	p.age = 19;
	p.hiegth = 170.0; //可以使用变量名.结构体的字体名引用结构体中的数据段


	printf("%d\n", sizeof(p.name)); //4   指针4个字节
	printf("%d\n", sizeof(p.age)); //4
	printf("%d\n", sizeof(p.hiegth)); //8
	printf("%d\n", sizeof(p)); //结构体的总大小 :16   4+4+8  各字段之和(计算出的和要是只大字段的陪数,不够保够:)
							   //如: 结构体中最有 int age, char c;现个字段 ,它们的总字节应该是 4+1=5。
							   //因为不是4的陪数,所以补够8,输出结构体的大小 为8
	printf("p p.age=%d,p.name=%s,p.hiegth=%f\n", p.age, p.name, p.hiegth);
}
//----------结构体的嵌套定义------------------------
/**
 * 结构体的嵌套定义,就是一个结构体包含另一个结构体:
 * 例如:使用结构体Date来封装日期数据
 * 	        使用person_来封装一个人的信息,人的信息有生日,生日是一个日期,可以用上面定义的结构体Date来定义
 */
//使用结构体Date来封装日期数据
struct Date{
	int year; //年
	int month; //月
	int day; //日
};
// 使用person_来封装一个人的信息
struct Person_{
	char *name;//性名
	struct Date birthday;
};

//测试
void n_struct(){

	//定义结构体Person_的变量,并初始化
	struct Person_ p={"zhong",{2015,7,9}};

	//访问结构体中结构体的数据
	printf("p.birthday.year=%d\n",p.birthday.year);

	p.birthday.year=2016; //修改数据
	printf("p.birthday.year=%d\n",p.birthday.year);

}

//------结构体数组-----------------------------
void struct_array(){

	//定义结构体数组和定义普通数组一样,都是"类型名  变量名[大小]"
	struct Person persons[10]={ //定义结构体数组时并赋值
			{"zhong1",18,174.0},
			{"zhong2",19,175.0},
			{"zhong3",20,176.0}
	};

	//读取一个结构体并复制给变量p,修改p中的数据,数组中的数组不受影响
	struct Person p=persons[0];
	p.age=20;//修改p中的数据,数组中的数组不受影响
	int age=p.age;//读取数据
	printf("p p.age=%d,p.name=%s,p.hiegth=%f\n", p.age, p.name, p.hiegth);

	//直接用数组下标引用字段,这样修改数据时,才会修改数组中的数据
		persons[0].age=20;
	//	int age=persons[0].age;

	//遍历输出
	int i;
	for(i=0;i<3;i++){
	struct Person p=persons[i];
	printf("p p.age=%d,p.name=%s,p.hiegth=%f\n", p.age, p.name, p.hiegth);
	}
}
//-------指向结构体的指针-----------------------
void p_struct(){
	//定义一个结构体
	struct Student{
		int id;
		int age;
	};

	//定义一个结构体变量存放结构体
	struct Student s={01,19};

	//定义一个结构体指针(把struct Student看成一个整体,一种类型),并指向结构体变量s
	struct Student *p=&s;

	//利用指针修改数据,下面两个方式都可以
	 (*p).id=2;
	  p->id=3;

	//利用指针访问结构体
	printf("s.id=%d,s.age=%d\n",(*p).id,(*p).age);
	//也可以写成这个样子
	printf("s.id=%d,s.age=%d\n",p->id,p->age);//p前面不用加 *  ,用eclipse编写代码时,只要p.age,就会自动变成 p->age
	//当然还可以写成这样
	printf("s.id=%d,s.age=%d\n",s.id,s.age);//p前面不用加 *  ,用eclipse编写代码时,只要p.age,就会自动变成 p->age

}

int main() {
//	use_struct();

//	struct_array();

//	p_struct();

	n_struct();

//	int a=1;
//	int *p=&a;
//	printf("%p\n",&a);//28ff44
//	printf("%p\n",p);//28ff44

	return 0;
}

你可能感兴趣的:(C语言)