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://oursharingclub.joinbbs.net和http://blog.csdn.net/mirrorsbeyourself