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

原创 2015年07月09日 21:04:28
/*
 * 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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言学习笔记(十二) -结构体 Struct

定义结构体变量/* 结构体 自定义的一种类型称为构造类型,在C语言中称为结构体 定义结构体: struct [结构体名] { [成员列表;] }; 定义...
  • wangzi11322
  • wangzi11322
  • 2015年03月17日 10:18
  • 1533

c语言基础语法六——结构体(完结)

1;关于c语言结构体的引入; 在前面已经介绍了整形(int,long,….),浮点型(flaot,double),字符型(char),还介绍了数组(存储一组具有相同类型的数据),字符串。但是在实际问...
  • zw1996
  • zw1996
  • 2016年12月24日 14:47
  • 2414

C语言结构体的简单使用实例

结构体的简单实例
  • baidu_33232390
  • baidu_33232390
  • 2017年02月16日 11:17
  • 1358

数据结构(C语言版)-递归学习笔记

递归,介绍了解决某一类问题的思维方式。在一个函数定义中出现了对自己本身的调用,称为直接递归。一个函数p的定义中包含了对函数q的调用,而q的实现过程中又调用了p,即函数调用形成了一个环状调用链,这种方式...
  • zhonglj0314
  • zhonglj0314
  • 2015年04月19日 15:23
  • 1252

C语言中的结构体(struct)

C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型)。本文主要介绍关于结构体以下几部分。 1、概念为什么要有结构体?因为在实际问题中,一组数据往往有很多种不同的数据类型。例...
  • yanggangclcsdn
  • yanggangclcsdn
  • 2015年11月08日 13:50
  • 3258

解析C语言结构体及位段

解析C语言结构体及位段
  • lu_1079776757
  • lu_1079776757
  • 2017年07月18日 15:38
  • 317

C语言中结构体的三种初始化方式以及结构体作为传参传递

最近因项目需要,用到结构体来传参数 下面整理一下,以备查阅 1,初始化(赋值)方式(注意,在定义结构体时是不允许赋值的) 第一种:这种比较常用,也比较清晰 struct TEST{ int a...
  • baidu_36649389
  • baidu_36649389
  • 2017年03月18日 16:53
  • 1265

c语言中,结构体做参数调用例子结构体形参例子

c语言中,结构体做参数调用例子结构体形参例子 typedef struct AnyscanFtStr { int StrID; int StrFac...
  • mynameislinduan
  • mynameislinduan
  • 2017年01月19日 13:39
  • 849

C语言题目-结构体基础题

1438 计算总分 Time Limit : 1000 MS | Memory Limit : 32768 KB Submits : 295 | Solved : 112 D...
  • xindada559
  • xindada559
  • 2016年12月20日 16:07
  • 744

C语言: 结构体的赋值

结构体在 C 程序中使用的较为频繁,能对数据有一定的封装的作用。对一个结构体赋值时,经常采用的方式是,分别对其成员变量赋值。那么能否将一个结构体用赋值号(“=”)直接赋值给另一个结构体呢?网上的答案不...
  • imred
  • imred
  • 2015年05月09日 00:08
  • 2041
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言学习笔记:22_结构体
举报原因:
原因补充:

(最多只允许输入30个字)