• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言结构体指针(指向结构体的指针)详解

C语言结构体指针(指向结构体的指针)详解

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2022-04-30

匿名通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
当一个指针变量指向结构体时,我们就称它为结构体指针。C语言结构体指针的定义形式一般为:
struct 结构体名 *变量名;
下面是一个定义结构体指针的实例:
//结构体struct stu{    char *name;  //姓名    int num;  //学号    int age;  //年龄    char group;  //所在小组    float score;  //成绩} stu1 = { "Tom", 12, 18, 'A', 136.5 };//结构体指针struct stu *pstu = &stu1;
也可以在定义结构体的同时定义结构体指针:
struct stu{    char *name;  //姓名    int num;  //学号    int age;  //年龄    char group;  //所在小组    float score;  //成绩} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,所以给 pstu 赋值只能写作:

struct stu *pstu = &stu1;

而不能写作:

struct stu *pstu = stu1;

还应该注意,结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。下面的写法是错误的,不可能去取一个结构体名的地址,也不能将它赋值给其他变量:

struct stu *pstu = &stu;
struct stu *pstu = stu;

获取结构体成员

通过结构体指针可以获取结构体成员,一般形式为:
(*pointer).memberName
或者:
pointer->memberName
第一种写法中,.的优先级高于*,(*pointer)两边的括号不能少。如果去掉括号写作*pointer.memberName,那么就等效于*(pointer.memberName),这样意义就完全不对了。

第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途。

上面的两种写法是等效的,我们通常采用后面的写法,这样更加直观。

【示例】结构体指针的使用。
#include <stdio.h>int main(){    struct{        char *name;  //姓名        int num;  //学号        int age;  //年龄        char group;  //所在小组        float score;  //成绩    } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;    //读取结构体成员的值    printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);    printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);    return 0;}
运行结果:
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!

【示例】结构体数组指针的使用。
#include <stdio.h>struct stu{    char *name;  //姓名    int num;  //学号    int age;  //年龄    char group;  //所在小组    float score;  //成绩}stus[] = {    {"Zhou ping", 5, 18, 'C', 145.0},    {"Zhang ping", 4, 19, 'A', 130.5},    {"Liu fang", 1, 18, 'A', 148.5},    {"Cheng ling", 2, 17, 'F', 139.0},    {"Wang ming", 3, 17, 'B', 144.5}}, *ps;int main(){    //求数组长度    int len = sizeof(stus) / sizeof(struct stu);    printf("Name\t\tNum\tAge\tGroup\tScore\t\n");    for(ps=stus; ps<stus+len; ps++){        printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);    }    return 0;}
运行结果:
Name            Num     Age     Group   ScoreZhou ping       5       18      C       145.0Zhang ping      4       19      A       130.5Liu fang        1       18      A       148.5Cheng ling      2       17      F       139.0Wang ming       3       17      B       144.5

结构体指针作为函数参数

结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。

【示例】计算全班学生的总成绩、平均成绩和以及 140 分以下的人数。
#include <stdio.h>struct stu{    char *name;  //姓名    int num;  //学号    int age;  //年龄    char group;  //所在小组    float score;  //成绩}stus[] = {    {"Li ping", 5, 18, 'C', 145.0},    {"Zhang ping", 4, 19, 'A', 130.5},    {"He fang", 1, 18, 'A', 148.5},    {"Cheng ling", 2, 17, 'F', 139.0},    {"Wang ming", 3, 17, 'B', 144.5}};void average(struct stu *ps, int len);int main(){    int len = sizeof(stus) / sizeof(struct stu);    average(stus, len);    return 0;}void average(struct stu *ps, int len){    int i, num_140 = 0;    float average, sum = 0;    for(i=0; i<len; i++){        sum += (ps + i) -> score;        if((ps + i)->score < 140) num_140++;    }    printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);}
运行结果:
sum=707.50
average=141.50
num_140=2
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28总结IOS中nil、Nil、NULL和NSNull区别
  • 2017-05-28C++中MFC Tab Control控件的使用详解
  • 2017-05-28浅析C语言中堆和栈的区别
  • 2017-05-28Cocos2d-x UI开发之文本类使用实例
  • 2017-05-28Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系
  • 2017-07-23《Objective-C高级编程》干货三部曲(一):引用计数篇
  • 2017-05-28C++中的单例模式介绍
  • 2017-05-28C语言数据结构 栈的基础操作
  • 2017-05-28关于memcpy和memmove的一点重要说明
  • 2017-05-28C语言实现红黑树的实例代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Mygui中文换行问题解决方案
    • C语言之实现控制台光标随意移动的实例代码
    • 用C语言获取文件的大小示例分享
    • 基于C中含有if的宏定义详解
    • 解析C++无锁队列的实现代码
    • 快速掌握VC6.0中各种宏注释应用(附图)
    • 分析第一个C语言程序
    • 用Visual Studio2017写C++静态库图文详解
    • 理解C++编程中的std::function函数封装
    • 使用WindowsAPI获取录音音频的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有