【C语言】结构体指针

结构体指针

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

结构体

基础知识

初识结构体,可以先看这篇浅显易懂的文章结构体–基础篇
所谓结构体,是一组类型可以不同的相关变量(或数组)的集合。
构成结构体的变量(或数组)称为结构体的成员
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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么把录音转文字?推荐你这三款工具

随着科技不断发展&#xff0c;录音转文字的技术也逐渐被广泛应用于各种场景中。其中最常见的一种就是会议记录。在日常工作中&#xff0c;会议是企业和组织中必不可少的一个环节&#xff0c;但在会议过程中的录音和记录往往需要花费大量的时间和精力。这个时候&#xff0c;我们…

基于MAC地址的ACL配置

基于MAC地址的ACL配置 【实验目的】 掌握基于MAC地址的标准ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 S1 e0/0 N/A N/A N/A e0/1 N/A N/A N/A PC1 N/…

架构-软件工程模块-2

系统分析 数据流图可能出案例题&#xff0c;状态转换图了解作用即可 用例图、类图选择题多&#xff0c;暴徒了解即可 #mermaid-svg-lGozbtkYJPEQF1eo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lGozbtkYJPEQF1e…

c++学习——c与c++const修饰的变量的区别

c语言下const修饰的变量 1、c语言下const修饰的变量都有空间 2. c语言的const修饰的全局变量具有外部链接属性 07 const修饰的变量.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h>const int a 10;//常…

解析使用FPGA逻辑实现FIR滤波器的几种架构

有限脉冲响应(finite impulse response&#xff0c;FIR)数字滤波器 一、FIR数字滤波器理论介绍 FIR滤波器的实质就是输入序列与系统脉冲响应的卷积&#xff0c;即&#xff1a; 其中&#xff0c;N为滤波器的阶数&#xff0c;也即抽头数&#xff1b;x(n)为第n个输入序列&#xff…

AI人工智能标记数据的技术:类型、方法、质量控制、应用

AI人工智能 标记数据 在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;标记数据是非常重要的一环。它是指对原始数据进行标记和注释&#xff0c;以便机器学习算法可以理解和利用这些数据。标记数据可以提高机器学习模型的准确…

研发项目工时统计工具哪个好?9大工时管理系统盘点

工时管理是项目型企业的重要需求&#xff0c;特别是在人力成本占比较高的行业&#xff0c;如软件开发、设计咨询、会计律师等。工时管理可以帮助企业核算项目人工成本&#xff0c;控制成本投入&#xff0c;提高项目利润&#xff0c;客观考核员工绩效&#xff0c;优化资源分配等…

HackTheBox-关卡Fawn

1. 连接靶场&#xff0c;打开FAWN实例场景&#xff0c;检查是否互通 TASK1 3 个字母的首字母缩写词 FTP 代表什么&#xff1f; 答案是&#xff1a;File Transfer Protocol TASK2 问题是&#xff1a;FTP服务通常监听哪个端口&#xff1f; FTP监听的TCP端口号为21,监听的数据端…

计算机操作系统(慕课版)第二章课后题答案

一、简答题 (1)什么是前趋图&#xff1f;试画出下面四条语句的前趋图. S1&#xff1a;axy&#xff1b; S2&#xff1a;bz1&#xff1b; S3&#xff1a;ca-b&#xff1b; S4&#xff1a;wc1&#xff1b; 答&#xff1a;前趋图(Precedence Graph)是一个有向无循环图&#xff0c;…

进程控制--进程的等待

回顾 之前我们已经学习了进程的状态和进程的退出如果你没有这些基础知识&#xff0c;应先去了解进程的相关基础知识。 这次我们主要来学习如何让进程等待子进程的退出。 为什么要等待子进程&#xff1f; 之前我们在学习进程的状态的时候&#xff0c;我们知道了进程有一种状态…

spring boot +Sa-Token优雅的实现项目鉴权!

1. 技术选型 最近在做登录、授权的功能&#xff0c;一开始考虑到的是spring boot spring security&#xff0c;但spring security太重&#xff0c;而我们是轻量级的项目&#xff0c;所以&#xff0c;spring security不适合我们。 而后考虑spring boot shiro&#xff0c;但s…

ChatGPT ✖️ 前端 = 有点er意思

HOT! HOT! HOT! &#x1f525; &#x1f525; &#x1f525; ChatGPT登上了国内各大平台的热搜榜&#xff0c;应该在去年11月末的时候就有不少同学了解并使用过&#xff0c;那个时候它刚刚问世&#xff0c;在互联网圈子里有了很大的热度&#xff0c;但是对于大众来说&#xff…

fastapi基础篇

文章目录 简介环境搭建安装基础文件自动文档 基础使用POST请求传递参数返回定制信息jinja2返回html 简介 FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Python 3.6 并基于标准的 Python 类型提示。 关键特性 快速&#…

「 计算机网络 」TCP的粘包拆包问题

「 计算机网络 」TCP的粘包/拆包问题 参考&鸣谢 大病初愈&#xff0c;一分钟看懂TCP粘包拆包 雷小帅 TCP 的粘包拆包以及解决方案 一乐说 文章目录 「 计算机网络 」TCP的粘包/拆包问题一、前言二、为什么UDP没有粘包三、粘包拆包发生场景四、常见的解决方案五、Netty对粘包…

内卷把同事逼成了“扫地僧”,把Git上所有面试题整理成足足24W字测试八股文

互联网大厂更多的是看重学历还是技术&#xff1f; 毫无疑问&#xff0c;是技术&#xff0c;技术水平相近的情况下&#xff0c;肯定学历高/好的会优先一点&#xff0c;这点大家肯定都理解。 说实话&#xff0c;学弟学妹们找工作难&#xff0c;作为面试官招人也难呀&#xff01…

【PCIE732】基于 Kintex UltraScale 系列FPGA 的2 路40G 光纤通道适配器(5GByte/s 带宽)/XCKU060

板卡概述 PCIE732 是一款基于PCIE 总线架构的高性能数据传输卡&#xff0c;板卡具有1 个PCIex8 主机接口、2 个QSFP40G 光纤接口&#xff0c;可以实现2路QSFP 40G 光纤的数据实时采集、传输。板卡采用Xilinx 的高性能Kintex UltraScale 系列FPGA 作为实时处理器&#xff0c;板…

9. Linux下实现简单的socket通讯

本文简单介绍了UDP传输层协议&#xff0c;并在Linux下实现简单的socket通讯 一、UDP UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的传输层协议&#xff0c;它不保证数据包的可靠性和顺序。UDP在IP协议的基础上增加了简单的差错…

TCP是面向字节流的协议

TCP字节流 之所以会说 TCP 是面向字节流的协议&#xff0c;UDP 是面向报文的协议&#xff0c;是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同&#xff0c;也就是问题原因在发送方。 为什么 UDP 是面向报文的协议&#xff1f; 当用户消息通过 UDP 协议传输时&#xff0c;…

《Java 核心技术面试》课程笔记(十)

如何保证集合是线程安全的? 典型回答 Java 提供了不同层⾯的线程安全支持。 在传统集合框架内部&#xff0c;除了 Hashtable 等同步容器&#xff0c;还提供了所谓的同步包装器&#xff08;Synchronized Wrapper&#xff09;&#xff0c;我们可以调用 Collections 工具类提供…

Android java层hook------xposed框架的使用

xposed曾经是android平台上最好的java层hook和调试工具&#xff0c;由于已经不再更新&#xff0c;当前支持的android系统版本比较老旧&#xff0c;目前只能支持到android6.0&#xff0c;故已经逐渐落伍&#xff0c;目前android上最广泛使用的hook工具是frida&#xff0c;这是另…