C语言学习(7)---结构体

一、为什么需要结构体?

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

二、什么叫结构体?

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

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

第一种方式:

  1. struct Student{    
  2.     int age;  
  3.     float score;  
  4.     char sex;  
  5. };  
第二种方式:
  1. struct Student2{  
  2.     int age;  
  3.     float score;  
  4.     char sex;  
  5. } str2;  
第三种方式:
  1. strut {  
  2.     int age;  
  3.     float score;  
  4.     char sex;  
  5. } str3;  

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

1、赋值和初始化

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

  1. # include <stdio.h>  
  2.   
  3. struct Student  
  4. {  
  5.     int age;  
  6.     float score;  
  7.     char sex;  
  8. }  
  9. int main(void){  
  10.     struct Student st = {80, 66.6, 'F'};  //整体赋值  
  11.     struct Student st2;  //单个赋值  
  12.     st2.age = 10;  
  13.     st2.score = 88;  
  14.     st2.sex = 'F';  
  15.       
  16.     printf("%d %f %c\n", st.age, st.score, st.sex);  //第一种取值方式  
  17.     printf("%d %f %c\n", st2.age, st2.score, st2.sex);  
  18.       
  19.     return 0;  
  20. }  
2、如何取出结构体变量中每一个成员

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

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

  1. # include <stdio.h>  
  2.   
  3. struct Student  
  4. {  
  5.     int age;  
  6.     float score;  
  7.     char sex;  
  8. };  
  9. int main(void){  
  10.     struct Student st = {40, 60, 'F'};  
  11.     struct Student * pst = &st;  
  12.   
  13.     pst->age = 68;  
  14.     st.score = 66;  
  15.     printf("%d %f\n", st.age, pst->score);  
  16.       
  17.     return 0;  
  18. }  
pst->age在计算机内部会被转化成(*pst).age

3、结构体变量的运算

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

  1. struct  Student  
  2. {  
  3.     int age;  
  4.     char sex;  
  5.     char name[100];  
  6. };  //分号不能省略  
  7. struct Student st1, st2;  
  8. st1+st2  st1*st2  st1/st2 都是错误的  
  9. st1 = st2  或者 st2 = st1 都是正确的  
4.结构体变量和结构变量指针作为函数参数传递的问题

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

  1. # include <stdio.h>  
  2.   
  3. struct Student  
  4. {  
  5.     int age;  
  6.     float score;  
  7.     char sex;  
  8. };  
  9.   
  10. int main(void){  
  11.     struct Student st;  
  12.       
  13.     InputStudent(&st);  //对结构体变量输入  
  14.     OutputStudent(&st);  //对结构体变量输出  
  15.       
  16.     return 0;  
  17. }  
  18. void OutputStream(struct Student * ss){  
  19.     printf("%d %c %s\n", ss->age, ss->sex, ss->name);  
  20. }  
  21. void InputStudent(struct Student * pstu){ //pstu只占4个字节  
  22.     (*pstu).age  = 10;  
  23.     strcpy(pstu->name, "zhangsan");  
  24.     pstu->sex = 'F';  
  25. }  
5.动态的构造存放学生信息的结构体数组

  1. /* 
  2.     2012年2月5日19:43:24 
  3. */  
  4. # include <stdio.h>  
  5. # include <malloc.h>  
  6.   
  7. struct Student  
  8. {  
  9.     int age;  
  10.     float score;  
  11.     char name[100];  
  12. };  
  13. int main(void){  
  14.     int len;  
  15.     struct Student * pArr;  
  16.     int i;  
  17.       
  18.     printf("请输入学生的个数:\n");  
  19.     printf("len = ");  
  20.     scanf("%d", &len);  
  21.     pArr = (struct Student *)malloc(len * sizeof(struct Student));  
  22.   
  23.     for (i=0; i<len; ++i){  
  24.         printf("请输入第%d个学生的信息\n", i+1);  
  25.         printf("age = ");  
  26.         scanf("%d", &pArr[i].age);  
  27.   
  28.         printf("name =");  
  29.         scanf("%s", pArr[i].name);  
  30.   
  31.         printf("score = ");  
  32.         scanf("%f", &pArr[i].score);  
  33.     }  
  34.     //输出  
  35.     printf("\n\n\n");  
  36.         for (i=0; i<len; ++i){  
  37.         printf("第%d个学生的信息是\n", i+1);  
  38.         printf("age = %d\n", pArr[i].age);  
  39.   
  40.         printf("name = %s\n", pArr[i].name);  
  41.   
  42.         printf("score = %f\n\n", pArr[i].score);  
  43.     }  
  44.       
  45.     return 0;  
  46. }  
输出结果:
请输入学生的个数:
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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值