结构体数组指针
指针变量可以指向一个结构体数组,这时指针变量的值是整个数组的首地址。
设 ps 为指向结构体数组的指针变量,则 ps 也指向该结构体数组的第 0个元素,ps+1
指向第一个元素,ps+i 则指向第 i 元素,这与普通数组的情况是一样的。
【示例】用指针变量输出结构体数组。

#include <stdio.h>

struct stu{
         int num;
         char *name;
         char sex;
         float score;
         } *ps, boy[5]={
                    {101, "Zhou ping", 'M', 45},
                    {102, "Zhang ping", 'M', 62.5},
                    {103, "Liou fang", 'F', 92.5},
                    {104, "Cheng ling", 'F', 87},
                    {105, "Wang ming", 'M', 58}
        };

int main(){
             printf("No\tName\t\tSex\tScore\t\n");
             for(ps=boy; ps<boy+5; ps++)
             printf("%d\t%s\t%c\t%f\t\n", ps->num, ps->name, ps->sex,
             ps->score);

return 0;
}
运行结果:
No     Name    Sex Score
101 Zhou ping   M 45.000000
102 Zhang ping  M 62.500000
103 Liou fang   F 92.500000
104 Cheng ling  F 87.000000
105 Wang ming   M 58.000000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
应该注意的是,一个结构体指针变量虽然可以用来访问结构体变量或结构体数组元素的
成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。所以,
下面的赋值是错误的:
ps=&boy[1].sex;
而只能是:
ps=boy; // 赋予数组首地址
或者是:
ps=&boy[0]; //赋予 0 号元素首地址
结构体指针变量作函数参数
结构体变量代表的是结构体本身这个整体,而不是首地址,作为函数参数时传递的整个
结构体,也就是所有成员。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间
开销会很大,严重降低程序的效率。所以最好的办法就是使用指针,也就是用指针变量作为
函数参数。这时由实参传向形参的只是地址,非常快速。

【示例】计算一组学生的平均成绩和不及格人数。

#include <stdio.h>

#define STU struct stu
 STU{
     int num;
     char *name;
     char sex;
     float score;
     }boy[5]={
     {101,"Li ping",'M',45},
     {102,"Zhang ping",'M',62.5},
     {103,"He fang",'F',92.5},
     {104,"Cheng ling",'F',87},
     {105,"Wang ming",'M',58}
};

void average(STU *ps);

int main(){
     STU *ps = boy;
     average(ps);
     return 0;
}

void average(struct stu *ps){
     int flunk=0, i;
     float sum=0;
         for(i=0; i<5; i++,ps++){
                 sum += ps->score;
                 if(ps->score < 60) flunk += 1;
         }
     printf("sum=%.2f, average=%.2f, flunk=%d\n", sum, sum/5, flunk);
}
运行结果:
sum=345.00, average=69.00, flunk=2

————————————————
版权声明:本文为CSDN博主「洛铭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42528287/article/details/86617841

C 语言结构体数组指针以及函数相关推荐

  1. C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)

    文章目录 C语言项目实战:24点游戏计算器(基于结构体.指针.函数.数组.循环等知识点) 前言:24点游戏计算器的规则如下 一.项目的创建标 1.选择项目 2.输入项目名称和路径 3.创建头文件Mai ...

  2. c语言结构体函数排序,(为什么不能给分?)结构体数组插入排序的函数有关问题,...

    当前位置:我的异常网» C语言 » (为什么不能给分?)结构体数组插入排序的函数有关 (为什么不能给分?)结构体数组插入排序的函数有关问题, www.myexceptions.net  网友分享于:2 ...

  3. c语言的结构体能存放函数吗,在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  4. c语言 结构体数组的赋值

    c语言 结构体数组的赋值 //**创建结构体** #include<stdio.h> struct Class{int id;char name[10]; }; //******结构体数组 ...

  5. C语言 | 结构体数组

    C语言结构体数组概述 一个结构体变量中可以存放一组有关联的数据,如一个学生的学号.姓名.成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组. 结构体数组与之前介绍的数值型 ...

  6. c语言字符结构数组初始化,C语言结构体数组初始化问题

    C语言结构体数组指定初始化器时,下面的三种方法,只有第三种可以,但是第一,二种,我看不出语法上哪错了,编译器DEVc++会报错 [Error] C99 designator 'num_insur' o ...

  7. c语言如何为结构数组赋值,C语言结构体数组同时赋值的另类用法

    说到C语言结构体数组的同时赋值,许多人一想就会想到用以下的这种方法,咱们来写一个例子: #include struct student { int a; int b ; int c ; }; stru ...

  8. 关于C语言结构体数组如何作为参数传入函数

    1.不多说上代码 #include<stdio.h> typedef enum {female,male }Sextype; typedef struct {Sextype sextype ...

  9. C语言结构体中指针指向数组,指向结构体类型数组的指针的使用

    指向结构体类型数组的指针的使用 定义一个结构体类型数组,其数组名是数组的首地址,下面是关于指向结构体类型数组的指针的使用具体介绍,欢迎阅读! 定义结构体类型的指针,既可以指向数组的元素,也可以指向数组 ...

最新文章

  1. DDD理论学习系列(6)-- 实体
  2. 千万级到10亿+的疯涨,搜狗商业平台服务化体系实践之路
  3. 统一指令集架构的思考
  4. EPROCESS ETHREAD简介
  5. hexo不渲染html文件,解决hexo渲染的页面中有br的问题
  6. php导出excel时间错误(同一个时间戳,用date得到不同的时间)
  7. GCC9.2/Python3.8/Libvirt6.0/QEMU4.2 编译/配置/安装
  8. 数据库连接池之_c3p0
  9. 【转】Mobile Tutorial: Using Layout to Adjust Different Form Sizes or Orientations (iOS and Android)...
  10. 华为s5700交换机使用配置
  11. 前后端通吃,vue大全Mark一下
  12. gg修改器偏移量修改_GG修改器正版
  13. 产品经理简历简历怎么写_完美的简历
  14. 卫星影像的RPC参数
  15. Android游戏破解练习-大圣降魔录
  16. 计算机整个文稿应用回顾主题,计算机应用基础(MS Office高级应用)
  17. c#配合c++调节屏幕亮度,非伽马以及RGB方案
  18. 计算机如何删除已连接的打印机驱动程序,打印机驱动程序不见了,如何自行删除...
  19. 修改joplin默认笔记存储位置
  20. pringboot冬奥会竞赛项目知识网站的设计与实现 毕业设计-附源码152337

热门文章

  1. 使用flv.js实现flv格式的监控视频流播放
  2. 1256 加密数字
  3. 【MySQL:Use Of MySQL】使用记录
  4. android数据库三个方法有哪些,如何将Android数据库操作通用化(二)
  5. 下落的树叶(UVa699紫书p159)
  6. Arduino ESP32 第三方库读取SD卡信息(三)
  7. DSA算法实现数字签名--java实现
  8. 2873-36-1,Gancidin W,CYCLO(L-LEU-L-PRO),cyclo-L-Leu-L-Pro,环(L-脯氨酰-L-亮氨酰)
  9. 反驳生命的起点是rna_生命起源之谜:RNA世界假说将迎来终结?
  10. flutter 微信登录 包名不对,请检查包名是否与开放平台填写一致