C语言之结构体和共同体——结构体的定义和使用
2015-12-15 21:47
281 查看
在实际问题中,一组数据往往具有不同的数据类型;例如在学生信息登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实型。因为数据类型不同,显然不能用一个数组来存放。
在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。定义结构体的一般形式为:
struct 结构体名{
成员列表
};
每个成员都是结构体的组成部分,有名字,也有数据类型,形式为:
类型说明符 成员名;
例如用结构体来表示学生信息:
结构体是一种构造数据类型(也称复杂数据类型),由若干不同类型的变量(数据)组成。每个变量都是结构体的成员(member),每个成员可以是基本数据类型,也可以是构造类型。
相应的,int、char、float 这些数据类型被称为基本数据类型。
上面的代码定义了一个结构体,名字为stu。stu由4个成员组成,分别为 name、num、sex、score。
注意大括号后面的分号;不能少。
定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 4 个成员组成。注意关键字struct不能少。
stu 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。
结构体的各个成员在内存中是连续存储的。stu1、stu2 的内存如下图所示:
你也可以在定义结构体的同时定义结构体变量:
将变量放在结构体定义的最后即可。
如果只需要 stu1、stu2 两个变量,也可以不写结构体名字:
这样做书写简单,但是因为没有结构体名,后面就没法用该结构体定义新的变量。
也可以用宏定义使一个符号常量来表示一个结构类型,例如:
后面我们会学习Windows编程,大部分结构体都是这样定义的。
结构变量名.成员名
例如:
获取成员后,就可以对该成员进行赋值了,例如:
除了可以对成员进行逐一赋值,也可以像数组一样整体赋值,例如:
不过整体赋值仅限于上面这样的情况,也就是定义结构体的同时声明变量。下面的写法是错误的:
一个完整的示例:
运行结果:
Hello everyone! My name is James Bond, a naughty boy, but with good scores(99.00) and top No.(1)!
在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。定义结构体的一般形式为:
struct 结构体名{
成员列表
};
每个成员都是结构体的组成部分,有名字,也有数据类型,形式为:
类型说明符 成员名;
例如用结构体来表示学生信息:
struct stu{ char *name; //姓名 int num; //学号 char sex; //性别 float score; //成绩 };
结构体是一种构造数据类型(也称复杂数据类型),由若干不同类型的变量(数据)组成。每个变量都是结构体的成员(member),每个成员可以是基本数据类型,也可以是构造类型。
相应的,int、char、float 这些数据类型被称为基本数据类型。
上面的代码定义了一个结构体,名字为stu。stu由4个成员组成,分别为 name、num、sex、score。
注意大括号后面的分号;不能少。
结构体变量
结构体也是一种数据类型,可以用来说明变量。例如:struct stu stu1, stu2;
定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 4 个成员组成。注意关键字struct不能少。
stu 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。
结构体的各个成员在内存中是连续存储的。stu1、stu2 的内存如下图所示:
你也可以在定义结构体的同时定义结构体变量:
struct stu{ char *name; //姓名 int num; //学号 char sex; //性别 float score; //成绩 } stu1, stu2;
将变量放在结构体定义的最后即可。
如果只需要 stu1、stu2 两个变量,也可以不写结构体名字:
struct{ //没有写 stu char *name; //姓名 int num; //学号 char sex; //性别 float score; //成绩 } stu1, stu2;
这样做书写简单,但是因为没有结构体名,后面就没法用该结构体定义新的变量。
也可以用宏定义使一个符号常量来表示一个结构类型,例如:
#define STU struct stu STU{ char *name; //姓名 int num; //学号 char sex; //性别 float score; //成绩 }; STU stu1, stu2;
后面我们会学习Windows编程,大部分结构体都是这样定义的。
成员的获取和赋值
在C语言中,使用点号.来获取结构体中的一个成员,一般格式为:结构变量名.成员名
例如:
stu1.name; //第一个学生的姓名 stu2.score; //第二个学生的成绩
获取成员后,就可以对该成员进行赋值了,例如:
stu1.name = "Tom"; stu2.score = 90.5;
除了可以对成员进行逐一赋值,也可以像数组一样整体赋值,例如:
struct stu{ char *name; //姓名 int num; //学号 char sex; //性别 float score; //成绩 } stu1, stu2 = { "Tom", 10, 'M', 90 };
不过整体赋值仅限于上面这样的情况,也就是定义结构体的同时声明变量。下面的写法是错误的:
stu2 = { "Tom", 10, 'M', 90 };
一个完整的示例:
#include <stdio.h> #define STU struct stu int main(){ STU{ char *name; //姓名 int num; //学号 char sex; //性别 float score; //成绩 }; STU stu1; stu1.name = "James Bond"; stu1.num = 1; stu1.sex = 'M'; //用M表示男性,W表示女性 stu1.score = 99; printf("Hello everyone! My name is %s, a naughty boy, but with good scores(%.2f) and top No.(%d)!", stu1.name, stu1.score, stu1.num); return 0; }
运行结果:
Hello everyone! My name is James Bond, a naughty boy, but with good scores(99.00) and top No.(1)!
相关文章推荐
- 进制转换
- C++函数运算符重载
- 黑马程序员--C语言自学笔记---04分支结构
- 实战c++中的vector系列--将迭代器转换为索引
- 实战c++中的vector系列--将迭代器转换为索引
- 值得推荐的C/C++框架和库 (真的很强大)
- Ubuntu Android开发:缺少libstdc++.so.6和libz.so.1文件
- C++能设计实现一个不能被继承的类吗
- 实战c++中的vector系列--构造、operator=和assign区别
- 实战c++中的vector系列--构造、operator=和assign区别
- VC++获取当前系统时间日期 GetSystemTime()函数的用法
- 【POJ 2104】K-th Number 题意&题解&代码(c++)
- C语言: 桶排序
- 在c++代码中执行bat文件
- C++中指针与引用的关系
- 【先进的算法】Lasvegas算法3SAT问题(C++实现代码)
- C语言for语句用法详解
- 数组引用:C++ 数组做参数 深入分析
- C语言运算符的优先级和结合性一览表
- 第六篇 Java编译器与C/C++编译器的比较