一、为什么需要结构体?

为了表示一些复杂的事物,而普通类型无法满足实际需求

二、什么叫结构体?

把一些基本类型组合在一起形成的一个新的复合数据类型叫做结构体。

三、如何定义一个结构体?

第一种方式:

struct Student{
int age;
float score;
char sex;
};

第二种方式:

struct Student2{
int age;
float score;
char sex;
} str2;

第三种方式:

strut {
int age;
float score;
char sex;
} str3;

四、怎么去使用结构体变量

1、赋值和初始化

定义的同时可以整体赋初值,如果定义完成后,则只能单个的赋初值

# include <stdio.h>

struct Student
{
int age;
float score;
char sex;
}
int main(void){
struct Student st = {80, 66.6, 'F'}; //整体赋值
struct Student st2; //单个赋值
st2.age = 10;
st2.score = 88;
st2.sex = 'F'; printf("%d %f %c\n", st.age, st.score, st.sex); //第一种取值方式
printf("%d %f %c\n", st2.age, st2.score, st2.sex); return 0;
}

2、如何取出结构体变量中每一个成员

(1)结构体变量名.成员名

(2)指针变量->成员名

# include <stdio.h>

struct Student
{
int age;
float score;
char sex;
};
int main(void){
struct Student st = {40, 60, 'F'};
struct Student * pst = &st; pst->age = 68;
st.score = 66;
printf("%d %f\n", st.age, pst->score); return 0;
}

pst->age在计算机内部会被转化成(*pst).age

3、结构体变量的运算

结构体变量不能相加,不能相减,也不能相互乘除但结构体变量可以相互赋值

struct 	Student
{
int age;
char sex;
char name[100];
}; //分号不能省略
struct Student st1, st2;
st1+st2 st1*st2 st1/st2 都是错误的
st1 = st2 或者 st2 = st1 都是正确的

4.结构体变量和结构变量指针作为函数参数传递的问题

推荐使用结构体指针变量作为函数参数来传递

# include <stdio.h>

struct Student
{
int age;
float score;
char sex;
}; int main(void){
struct Student st; InputStudent(&st); //对结构体变量输入
OutputStudent(&st); //对结构体变量输出 return 0;
}
void OutputStream(struct Student * ss){
printf("%d %c %s\n", ss->age, ss->sex, ss->name);
}
void InputStudent(struct Student * pstu){ //pstu只占4个字节
(*pstu).age = 10;
strcpy(pstu->name, "zhangsan");
pstu->sex = 'F';
}

5.动态的构造存放学生信息的结构体数组

/*
2012年2月5日19:43:24
*/
# include <stdio.h>
# include <malloc.h> struct Student
{
int age;
float score;
char name[100];
};
int main(void){
int len;
struct Student * pArr;
int i; printf("请输入学生的个数:\n");
printf("len = ");
scanf("%d", &len);
pArr = (struct Student *)malloc(len * sizeof(struct Student)); for (i=0; i<len; ++i){
printf("请输入第%d个学生的信息\n", i+1);
printf("age = ");
scanf("%d", &pArr[i].age); printf("name =");
scanf("%s", pArr[i].name); printf("score = ");
scanf("%f", &pArr[i].score);
}
//输出
printf("\n\n\n");
for (i=0; i<len; ++i){
printf("第%d个学生的信息是\n", i+1);
printf("age = %d\n", pArr[i].age); printf("name = %s\n", pArr[i].name); printf("score = %f\n\n", pArr[i].score);
} return 0;
}

输出结果:
请输入学生的个数:
len = 3
请输入第1个学生的信息
age = 22
name =李小强
score = 99
请输入第2个学生的信息
age = 23
name =杨鹏
score = 89
请输入第3个学生的信息
age = 24
name =王海涛
score = 88

第1个学生的信息是
age = 22
name = 李小强
score = 99.000000
第2个学生的信息是
age = 23
name = 杨鹏
score = 89.000000
第3个学生的信息是
age = 24
name = 王海涛
score = 88.000000


忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(7)结构体的更多相关文章

  1. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(2)准备知识

    一.变量为什么必须初始化? 在回答这个问题之前,我们先来运行一段代码: #include <stdio.h> int main(){ int i; printf("i=%d\n& ...

  2. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(5)有趣的指针

    一.指针是C语言的灵魂 # include <stdio.h> int main(){ int *p; //p是变量名,int *表示p变量存放的是int类型变量的地址,p是一个指针变量 ...

  3. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(3)输入输出函数

    一.基本的输入和输出函数的用法 1.printf()  //屏幕输出 用法: (1)printf("字符串\n"); (2)printf("输出控制符", 输出 ...

  4. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(1)GCC介绍及C语言编译过程

    一.GCC基本介绍 GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器.它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU计划的关 ...

  5. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(9)链表

    我们至少可以通过两种结构来存储数据 数组 1.需要一整块连续的存储空间,内存中可能没有 2.插入元素,删除元素效率极低. 3.查找数据快 链表 1.查找效率低 2.不需要一块连续的内存空间 3.插入删 ...

  6. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(8)枚举、补码

    一.枚举 # include <stdio.h> enum WeekDay //定义了一个数据类型(值只能写以下值) { MonDay, TuesDay, WednesDay, Thurs ...

  7. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(6)动态内存分配

    一.传统数组的缺点: 1.数组的长度必须事先定制,且只能是常整数,不能是变量 int len = 5; int a[len]; //error 2.传统形式定义的数组,该程序的内存程序员无法手动释放 ...

  8. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(4)for == while ?

    一.for和while等价替换 int i = 1; for (i; i<=100; i++){ sum = sum + 1; } int i = 1; while(i<=100){ su ...

  9. 闲里偷忙的CPU-某个kwoker进程忙

    https://zhuanlan.zhihu.com/p/34311472 有一类比较特殊的CPU使用率问题,这类问题的特点是,系统平均CPU使用率很低,但是个别CPU的使用率非常高.今天借助这个真实 ...

随机推荐

  1. 不安装谷歌市场,下载谷歌市场中的APK

    不安装谷歌市场,下载谷歌市场中的APK GooglePlayStore 是谷歌官方的的应用市场,有的时候还是需要从谷歌市场下载APK文件.国内的安卓手机厂商都不自带GooglePlay,甚至一些手机& ...

  2. animation-list -帧动画

    帧动画实现起来比较简单,今天接触到使用xml来创建帧动画,记录下来. 它说白了,其实就是动态的展示图片而已 1.在xml中定义帧动画,如下 <?xml version="1.0&quo ...

  3. 日历控件input框默认显示当日日期

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...

  4. cocos2d-x 3.x游戏开发学习笔记(1)--mac下配置cocos2d-x 3.x开发环境

    打开用户文件夹下.bash_profile文件,配置环境 vim ~/.bash_profile //按键i,进行插入编辑(假设输错d进行删除一行) 环境配置过程例如以下: 1.首先配置下androi ...

  5. php字符串函数分类总结

    php字符串函数分类总结 一.总结 explode  str_split  str_word_count  strtolower 二.php字符串函数分类总结 php内置了98个字符串函数(除了基于正 ...

  6. 最新GitHub账号注册(详细图解)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.简介 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub. ...

  7. iCarousel——在iOS和Mac OS应用中实现3D CoverFlow旋转木马效果的开源类库

    前言 iCarousel一个简单.可高度定制的3D CoverFlow开源类库,旨在简化在 iPhone, iPad和Mac OS中生成各种类型的cover flow(视图切换)效果(分页.滚动视图) ...

  8. Nginx- 实现跨域访问

    https://blog.csdn.net/m_nanle_xiaobudiu/article/details/80688740

  9. Android(Lollipop/5.0) Material Design(四) 创建列表和卡片

    Material Design系列 Android(Lollipop/5.0)Material Design(一) 简单介绍 Android(Lollipop/5.0)Material Design( ...

  10. 自己写的关于生产者与消费者模式,还有定时任务的demo

    为了加深对生产者消费者模式的理解,特意写了这个demo,里面还包含了一个自己写的定时任务.代码下载地址:http://download.csdn.net/detail/li_yan_fei/98115 ...