/*
* 22.结构体.c
*
* Created on: 2015年7月9日
* Author: zhong
*/
#include <stdio.h>
#include <stdlib.h>
/**
* 结构体:对共性数据的封装
* 结构体有点使用面向对象的思想,对一类东西的共性进行封闭,以便使用。
*
* 定义结构体:
* //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;
}