C语言第十四回合:结构体大集合
【学习目标】
1. 结构体
2. 结构体数组
3. 结构体指针
结构体:是数据结构类型,把有内在联系的不同类型的数据统一成一个整体,使它们相互关联。是变量的集合,可以单独使用其的成员。
A:结构体的定义
使用关键字:struct
struct 结构体名
{
类型标识符 成员名1;
类型标识符 成员名2;
……
}; //分号一定不能省
PS:
(1)结构定义并不预留内存,结构体变量的定义才引起存储分配
(2) 结构体成员的数据类型可以是C语言的基本数据类型,也可以是数组和指针类型。还可以是自定义类型,成员的排列不分先后次序
(3)结构体名是合法命名的标识符
(4)结构定义仅描述了一个结构的形式。要在程序里使用结构,需要声明结构变量。
struct stu { int num; //编号 char name[ 15 ]; //姓名 char sex[ 10 ]; //性别 int age; //年龄 double score; //分数 }; //分号不可少
//使用typedef定义结构体的别名 typedef struct stu { int num; // 编号 char name[ 15 ]; //姓名 char sex[ 10 ]; //性别 int age ; //年龄 double score; //分数 } struct_name; //分号不可少 //struct_name是该结构体的别名, //可以使用此别名定义结构体变量,也可以使用struct stu定义
B: 结构体变量的初始化
//结构体的使用 #include <stdio.h> //结构体的定义 //定义学生的结构 struct students { char name[ 15 ]; //姓名 char sex[ 8 ]; //性别 int age; //年龄 double score; //成绩 } //定义变量stu1,并初始化 stu1= { "张三", "男", 23, 99.0 }; //注意:这个分号必须要!!! int main( void ) { //结构变量的定义 //定义结构体变量stu2,并初始化【两种初始化都可以】 struct students stu2={ "李四", "男", 22, 90 }; //打印结构体内容 printf ( "姓名 性别 年龄 成绩\n" ); printf( "%s%s %d %.1lf\n", stu1.name, stu1.sex, stu1.age, stu1.score ); printf( "%s%s %d %.1lf\n", stu2.name, stu2.sex, stu2.age, stu2.score ); return 0; }
C:结构体内容的输入和输出
//结构体的使用 #include <stdio.h> //结构体的定义 //定义学生的结构 struct students { char name[ 15 ]; //姓名 char sex[ 8 ]; //性别 int age; //年龄 double score; //成绩 }; //注意:这个分号必须要!!! int main( void ) { //结构变量的定义 //定义结构体变量stu structstudents stu; //结构体内容的输入 printf( "输入:\n姓名性别 年龄 成绩\n" ); //name和sex就是首元素首地址,所以不用取地址符,而age和score是变量 scanf("%s %s %d %lf", stu.name, stu.sex, &stu.age, &stu.score ); //打印结构体内容,%后跟数字,如果不懂,请看《C语言第一回合》 printf("\n%s %5s %5s %5s\n","姓名","性别","年龄", "成绩" ); printf("%s %5s %5d %5.1lf\n", stu.name, stu.sex, stu.age, stu.score ); return 0; }
运行结果:
D:结构体数组
结构体数组:就是结构体作为类型定义数组变量。这和结构体变量很相同,结构体数组不过是多个结构体变量的集合。
#include<stdio.h> // 定义结构体 typedefstruct st { int number; char name[ 15 ]; char sex[ 10 ]; int age; double score; }students; //students是整个结构体的别名 int main(void ) { int i= 0; //定义结构体数组,可以使用struct st定义,也可使用其的别名students struct st stu1[ 2 ]; //方式一 students stu[ 2 ]; //方式二 printf( "依次输入编号、姓名、性别、年龄、分数:\n" ); for( i= 0; i< 2; i++ ) { scanf( "%d %s %s %d %lf", &stu[ i ].number,stu[ i ].name,stu[ i ].sex, &stu[ i ].age, &stu[ i ].score ); } printf( "\n打印学生信息:\n" ); printf( "%s %5s %5s %5s%5s\n", "编号", "姓名", "性别", "年龄", "分数" ); for( i= 0; i< 2; i++ ) { printf( "%4d %5s %5s %5d%6.1lf", stu[ i ].number, stu[ i ].name, stu[ i ].sex, stu[ i ].age, stu[i ].score ); printf( "\n"); } return 0; }
运行结果:
E:结构体指针
跟上面的都一样,只不过结构体指针的访问除了用运算符“.”(点)访问,还可用指向运算符“->”访问(位置还是和用‘.’访问的位置一样)。
#include <stdio.h> // 定义结构体 typedef struct st { int number; char name[ 15 ]; char sex[ 10 ]; int age; double score; }students; //students是整个结构体的别名 int main( void ) { inti= 0; //定义结构体数组,可以使用struct st定义,也可使用其的别名students struct st stu[ 2 ]; //结构体数组 students *ptr= NULL; //结构体指针 ptr= stu; //指向数组首地址 printf( "依次输入编号、姓名、性别、年龄、分数:\n" ); for(i= 0; i< 2; i++ ) { //使用数组形式访问 scanf( "%d %s %s %d %lf",&ptr[ i].number, ptr[ i ].name, ptr[ i ].sex, &ptr[ i ].age, &ptr[i ].score ); } printf("\n打印学生信息:\n" ); printf("%s %5s %5s %5s %5s\n", "编号", "姓名","性别", "年龄", "分数" ); for(i= 0; i< 2; i++ ) { printf("%4d %5s %5s %5d %6.1lf", ptr ->number, ptr ->name,ptr->sex, ptr ->age, ptr->score ); ptr++; printf("\n" ); } return 0; }
运行结果:
F:结构体嵌套
结构体嵌套:就是在结构体中用另一个结构体(已经存在的结构体)去定义变量
//定义了两个结构体,birthday嵌套在stud中使用 #include <stdio.h> struct birthday //定义出生年月的结构体 { intday; intmonth; intyear; }; // 定义结构体 typedef struct stud { charname[ 15 ]; charsex[ 10 ]; structbirthday birth; //结构体嵌套 }students; //students是整个结构体的别名 int main( void ) { inti= 0; //定义结构体数组,可以使用structstud定义,也可使用其的别名students struct stud stu[ 2 ]; //结构体数组 printf( "依次输入姓名、性别、年月 日:\n" ); for(i= 0; i< 2; i++ ) { scanf( "%s %s %d %d %d", stu[ i].name, stu[ i ].sex, &stu[ i ].birth.year, &stu[ i ].birth.month,&stu[ i ].birth.day ); } printf("\n打印学生信息:\n" ); printf("%s %5s %5s %5s %5s\n", "姓名", "性别","年", "月", "日" ); for(i= 0; i< 2; i++ ) { printf("%s %5s %5d %5d %5d", stu[ i ].name, stu[ i ].sex, stu[ i].birth.year, stu[ i ].birth.month, stu[ i ].birth.day ); printf("\n" ); } return 0; }
运行结果:
【指尖的微笑】错误在所难免,希望得到大家的指正^-^
转载时保留原文的链接http://codingit.howbbs.com和http://blog.csdn.net/mirrorsbeyourself
时间: 2024-11-07 16:21:09