【C语言】结构体指针

news2024/11/18 13:46:57

结构体指针

  • 结构体
    • 基础知识
    • 注意对于成员的赋值
  • 结构体指针
    • 指向结构体变量的指针
    • 结构体指针与结构体成员指针
    • 用结构体指针引用结构体成员

结构体

基础知识

初识结构体,可以先看这篇浅显易懂的文章结构体–基础篇
所谓结构体,是一组类型可以不同的相关变量(或数组)的集合。
构成结构体的变量(或数组)称为结构体的成员
C语言要求,在定义结构体变量时,需要明确给定每个成员的名字类型
声明一种·结构体类型,需要定义一个标识符,这种标识符称为结构体类型标识符。

struct student
{
    char name[20];
    char num[11];
    int age;
    float score;
};//student 是结构体类型的标识符    
//struct student 是一种结构体类型

对于结构体变量的成员可以进行哪些操作,取决于结构体变量的成员是哪种类型的。因为结构体变量的成员在本质上也是变量(或数组),所以对于结构体变量成员的操作,与同类型变量(或数组)的操作是相同的。

注意对于成员的赋值

我们先来看一个错误的程序:

#include <stdio.h>
struct student 
{
	char name[20];
	char num[20];
	int score;
};
int main (void)
{
	struct student stu;
	stu.score=99;
	stu.name="Lin hui";
	stu.num="S2208017";
	printf("%d,%s,%s\n",stu.score,stu.name,stu.num);
	return 0;
}

编译系统会报错,这是为什么呢?
该程序编译时,将会产生“给数组名赋值”的错误。
这是因为结构体变量stu的两个成员num和name均为字符数组
而数组名属于指针常量,因而不能对数组名进行赋值。
那么,如何才能将字符串存放如字符数组成员中呢?我们可以利用strcpy函数。
正确的程序:

#include <stdio.h>
#include <string.h>
struct student 
{
	char name[20];
	char num[20];
	int score;
};
int main (void)
{
	struct student stu;
	stu.score=99;
	strcpy(stu.name,"Linhui");
	strcpy(stu.num,"S2208017");
	printf("%d,%s,%s\n",stu.score,stu.name,stu.num);
	return 0;
}

结构体指针

指针的基本功能就是间接引用,也就是通过指针变量间接地引用另一个变量。

为什么要使用指针呢?
指针的独特优势在于,在C语言中的某些功能只能借助于间接引用才能实现。
例如,局部变量的跨函数改写,就只能通过间接引用才能实现。

同样地,结构体指针的功能就是间接地引用结构体变量。
而C语言中的某些功能(例如动态链表)就必须借助于结构体指针才能实现。

指向结构体变量的指针

struct student    //声明结构体类型
{
    char name[20];
    char num[20];
    int age;
    int score;
};
struct student stu;//定义结构体类型的变量stu
struct *p;//定义指向结构体变量的指针变量p
p=&stu;//赋初值

结构体指针与结构体成员指针

一旦定义了指向结构体变量的指针,就可以通过该指针间接引用所指向的结构体变量。

p=&stu;

那么,就可以用*p来间接引用结构体变量stu;
上述是把结构体变量的首地址赋值给指针变量p,所以结构体指针变量p指向了结构体变量stu。
例:
在这里插入图片描述
虽然结构体指针和结构体第一个成员的地址值相同,但结构体指针结构体成员指针的含义是不同的。

struct student *p;*p=stu;
int *p1=stu.num;

虽然p和p1的值是相同的,都是2000H。但是p是指向结构体类型变量的指针,而p1是指向int型变量的指针。若执行p++,则p的值为2043H,而执行p1++,p1的值为2002H。

用结构体指针引用结构体成员

既然可以利用结构体指针引用结构体变量,当然也可以引用结构体变量的成员
其一般形式为:

(*结构体指针变量).成员名

需要注意,这里的括号必不可少。如果去掉括号后:

*结构体指针变量.成员名

由于成员运算符“.”的优先级高于间接引用运算符"*",所以上式即为:

*(结构体指针变量.成员名)

而指针变量不可能有成员,从而导致语法错误。
例:
从键盘输入一个学生的学号、姓名、年龄和成绩,并存入一个结构体变量中,然后依次输出各项数据。要求通过结构体指针``间接引用该结构体变量的成员`。

#include <stdio.h>
struct student   //定义结构体类型说明符 student
{
    char num[20];
    char name[20];
    int age;
    float score;
};
int main (void)
{
    struct student stu,*p=&stu;
    gets((*p).num);//输入学号
    gets((*p).name);//输入姓名
    scanf("%d",&(*p).age);//输入年龄
    scanf("%f",&(*p).score);//输入成绩
    printf("学号\t姓名\t年龄\t成绩\n");
    printf("%s\t%s\t%d\t%.2f\n",(*p).num,(*p).name,(*p).age,(*p).score);
    return 0;
}

上述间接引用形式比较直观,但略显繁琐,故C语言提供了另一种更加简洁的·引用形式。
其一般形式为:

结构体指针变量->成员名

此处的“- >”称为指向运算符。
其功能等价于:

(*结构体指针变量).成员名

让我们再来以这种方式做一下上面的题目:
从键盘输入一个学生的学号、姓名、年龄和成绩,并存入一个结构体变量中,然后依次输出各项数据。要求通过结构体指针``间接引用该结构体变量的成员`。

#include <stdio.h>
struct student //定义结构体类型说明符
{
    char num[20];
    char name[20];
    int age;
    float score;
};
int main (void)
{
    struct student stu,*p=&stu;
    gets(p->num);
    gets(p->name);
    scanf("%d",&p->age);
    scanf("%f",&p->score);
    printf("学号\t姓名\t年龄\t成绩\n");
    printf("%s\t%s\t%d\t%.2f\n",p->num,p->name,p->age,p->score);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署输配电线路火灾隐患排查治理

输电线路防山火在线监测装置 一、产品描述&#xff1a; 电力设施为了远离人们的生活区域选择部分扎根在森林里面&#xff0c;减少发生触电事故的发生。但是提到森林就不得不说其中一个山火问题&#xff0c;山火灾害对建设在森林的电力设施造成的损害不可预估&#xff0c;为保障…

CodeForces.1806A .平面移动.[简单][判断可达范围][找步数规律]

题目描述&#xff1a; 题目解读&#xff1a; 给定移动规则以及起始点&#xff0c;终点&#xff1b;分析终点是否可达&#xff0c;可达则输出最小步数。 解题思路&#xff1a; 首先要判定是否可达。画图可知&#xff0c;对于题目给定的移动规则&#xff0c;只能到达起始点(a,b…

Go 开发实践:手把手教你搭建一个登录功能

本文首发自「慕课网」 &#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"及“慕课网公众号”&#xff01; 作者&#xff1a;Codey|慕课网讲师 用 Go 语言搭建简易登录功能 如果你最近刚学习Go 语言基础特性&#xff0c;对 …

《深入理解BigDecimal:揭秘钱财计算的核心技术》

文章目录 《深入理解BigDecimal:揭秘钱财计算的核心技术》***\*一、BigDecimal概述\*******\*二、BigDecimal常用构造函数\****2.1、常用构造函数2.2、使用问题分析***\*三、BigDecimal常用方法详解\****3.1、常用方法3.2、BigDecimal大小比较***\*四、BigDecimal格式化\*****…

【正点原子STM32连载】 第二十章 基本定时器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十…

字符串匹配算法--KMP算法--BM算法

该算法解决的是字符串匹配问题&#xff0c;即查看字符串中是否含有完整的匹配字符串。如在java的string的contains方法匹配问题最简单的就是暴力破解了。在java的contains也是这么实现的&#xff0c;效率是低一点的。如果想要更快的速度可以自己写KMP算法。 代码实现体验 还未…

chatgpt赋能Python-python_numpy怎么用

Python与Numpy&#xff1a;简介 Python是一种高级编程语言&#xff0c;它具有简洁的语法和广泛的应用领域。Numpy是一个为Python提供高效数学库的开源库&#xff0c;它允许进行高速数值计算和数据处理。 对于那些正在开始使用Python和Numpy的初学者&#xff0c;这篇文章将向您…

CANoe使用教程

目录 1.CAN IG使用 2.Visual Sequence 自动发送报文序列&#xff0c;可以设置多个visual sequence&#xff0c;可用于重复的网络模拟和write窗口输出&#xff0c;比IG灵活&#xff0c;比CAPL简单 3.CANoe中的系统变量和环境变量都是一种用于存储和传递数据的变量&#xff0c;…

linux部署yolov5

Linux配置 LibTorch 和 OpenCV LibTorch 下载地址&#xff1a;https://pytorch.org/get-started/locally/ 直接解压即可 OpenCV 下载地址&#xff1a;https://opencv.org/releases/ 需要配置ffmpeg环境 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/workspace/dengzr/li…

嵌入式Linux应用开发笔记:GPIO编程

文章目录 目的基础说明代码示例数字输出数字输入外部中断 总结 目的 GPIO嵌入式设备中最基础的外设&#xff0c;使用上也是非常频繁的。这篇文章将记录下应用程序中GPIO操作相关内容。 这篇文章中内容均在下面的开发板上进行测试&#xff1a; 《新唐NUC980使用记录&#xff1…

15、STM32驱动sht35温湿度传感器

本文使用模拟IIC驱动sht35温湿度传感器 踩坑点&#xff1a;购买的模块IIC上拉电阻为10KΩ&#xff0c;会导致IIC不稳定&#xff0c;抗干扰差&#xff0c;容易导致时序错误&#xff1b;建议更换为4.7KΩ 一、CubeMx配置 其余默认&#xff0c;生成工程 1、us精确延时 Delay_Dr…

2023年电子、通信与控制工程国际会议(SECCE 2023)

会议简介 Brief Introduction 2023年电子、通信与控制工程国际会议(SECCE 2023) 会议时间&#xff1a;2023年8月11日-13日 召开地点&#xff1a;韩国济州岛 大会官网&#xff1a;www.isecce.org 2023年电子、通信与控制工程国际会议(SECCE 2023)将围绕“电子、通信与控制工程”…

Spring Boot 整合流程引擎 Flowable(附源码地址)

一、导入依赖 flowable依赖&#xff1a; <dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.7.2</version> </dependency>pom.xml: <?xml version"1…

驱动页面性能优化的3个有效策略

目录 引言 背景 前端性能优化 测试视角的解法 性能问题的发现 性能数据的采集 性能指标的确定 性能问题的分析 如何衡量性能问题严重性 分析性能瓶颈-分析思路 分析结论关键思路 引言 测试通过发现、分析、验证三板斧&#xff0c;驱动推进页面性能优化快速有效&…

关注 | 蛙色元宇宙,正式成为XRMA联盟成员单位

中国虚拟现实与元宇宙产业峰会&#xff0c;2023年3月22日于杭州圆满结束&#xff0c;在杭州市人民政府、浙江省经济和信息化厅指导&#xff0c;由杭州市经济和信息化局、杭州市西湖区人民政府主办&#xff0c;中国信息通信研究院承办。 蛙色元宇宙作为元宇宙的领先企业之一&…

【AI面试】CrossEntropy Loss 、Balanced Cross Entropy、 Dice Loss 和 Focal Loss 横评对比

样本不均衡问题一直是深度学习领域一个不可忽略的问题&#xff0c;常说的长尾效应&#xff0c;说的就是这个问题。一类占据了主导地位&#xff0c;导致其他类无论怎么优化&#xff0c;都不能好转。 无论是纯纯的分类任务&#xff0c;还是稍微复杂一些的目标检测任务和分割任务…

关于java在成员/全局变量上不同类型赋值遇到的问题(值传递)

一个疑惑 文件简介回答参考文献 文件简介 class ss{static class Student{int id;String name; /*public Student(int id, String name) {this.id id;this.name name;}*/public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {…

数字人入门文章速览

语音驱动三维人脸方法 OPPO 数字人语音驱动面部技术实践 【万字长文】虚拟人漫谈 Blendshape学习笔记 人脸重建速览&#xff0c;从3DMM到表情驱动动画 功能强大的python包&#xff08;四&#xff09;&#xff1a;OpenCV 从Blendshapes到Animoji 3D人脸重建算法汇总 一、3D人脸重…

windows 10 安装k8s环境 Kubernetes

主要命令有 1. iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex 2. choco install minikube 3. minikube start 4. minikube dashboard 使用管理员运行 PowerShell 执行下面这条命令 iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex choc…

开源赋能 普惠未来|铜锁/Tongsuo诚邀您参与2023开放原子全球开源峰会

铜锁/Tongsuo是一个提供现代密码学算法和安全通信协议的开源基础密码库&#xff0c;为存储、网络、密钥管理、隐私计算、区块链等诸多业务场景提供底层的密码学基础能力&#xff0c;实现数据在传输、使用、存储等过程中的私密性、完整性和可认证性&#xff0c;为数据生命周期中…