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

news2024/9/23 1:33:57

示例

#include <stdio.h> 

    void main(){

        struct student{
            char name[10];
            int age;
            char *xiaoming;
        }stu1={"豪哥",23,"zz"},*p;

        p = &stu1;
        //struct student stu2= {"豪哥",23};

        printf("结构体指针变量p的姓名是:%s,年龄是:%d,小名是:%s\n",p->name,p->age,p->xiaoming);
    }

结构体的成员名的访问可以通过:
结构体变量名.成员名

指针结构体的成员名的访问可以通过:
(1)、 (*结构体指针变量名).成员名
(2)、 结构体指针变量名 -> 成员名 //最常用的方式

关于第一种,由于(*p)表示指向结构体的变量,相当于stu1,因此,(*p).name相当于stu1.name,表示p指向结构体变量中成员name。
另外(*p)加一个括号的原因,是因为成员运算符“ . ” 的优先级高于取内容运算符 “ * ” ,不加括号的话就相当于是 * (p.name),这种方法是错误的。

7.2.2、返回指针的函数

定义返回指针的函数很简单,只需要定义时在函数名前加一个指针运算符 " * "即可。定义如下:
类型名 * 函数名(参数列表)
{…}

定义一个返回char* 的函数,返回字符串s 从n1- n2 下标的字符:
(1)、形参s 使用只读限定符const,表示该变量为只读变量,其值不允许被修改。通常采用这种方式对程序中用到的一些固定参数加以限定,防止误修改。
const 省略也能编译通过,只是编程时对确定不能修改的量最好设置为只读(const),这样如果程序中对其进行了修改,编译的时候就会发现。
(2)、substr函数中定义数组a时,static不能省略,因为省略后,数组a默认的存储属性为auto类型,存放在动态存储区,其生命周期仅限于本函数,返回主函数后,数组a所占用的存储空间就释放了。将其存储属性设为静态(static)后,数组a存放在静态存储区中,在整个程序运行期间始终存在。
(3)、下列函数定义的时候也可以不返回指针变量p,可以直接返回数组名a;

#include <stdio.h> 

    char* substr(const char*,int,int);
    void main(){
        printf("结构体指针变量p的姓名是:%s,年龄是:%d,小名是:%s\n",p->name,p->age,p->xiaoming);
        char *pa = "haogexueCyuyan";
        char *sub;
        sub = substr(pa,2,4);
        printf("返回指针的函数:%s\n",sub);
    }

    char* substr(const char * s,int n1,int n2){
        static char a[80];
        char *p =a;
        int j=0;
        for(int i =n1;i<=n2;i++,j++){
            a[j] = s[i];
            printf("substr********,a[j]=%c\n",a[j]);
        }
        a[j] = '\0';
        return p;
    }
    
substr********,a[j]=o
substr********,a[j]=g
substr********,a[j]=e
返回指针的函数:oge

7.5、动态内存分配

之前在函数部分讲解时提到过变量的存储属性,其中全局变量和静态局部变量都存放在静态存储区,自动变量存放在动态存储区,还有一部分自由存储区没有讲到,这里C语言中中提供的一组内存管理函数,可以根据用户的需要动态分配内存空间,用完之后也可以随时释放这些空间,此时所分配的内存空间就位于自由存储区。
C语言编程时定义数组必须明确的说明其大小,实际编程的时候经常最初的时候数组的大小不能预料,太大了浪费内存空间,太小了系统无法处理,所以最好就是使用动态内存分配的方式。

在这里插入图片描述
这里注意上述函数中返回void *类型并不是函数调用之后无返回值,而是返回一个基类型为void 的指针,它指向所分配存储区的首地址。使用时需要根据实际情况,采用强制类型转化方法将其转换为所赋值指针的类型。

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

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

相关文章

『手撕 Mybatis 源码』08 - 动态代理 invoke 方法

动态代理 invoke 方法 问题 mapperProxy.findByCondition(1); 是怎么完成的增删改查操作&#xff1f; 当通过 JDK 代理方式生成代理对象后&#xff0c;可以通过代理对象执行代理方法 public class MybatisTest {/*** 问题3&#xff1a;mapperProxy.findByCondition(1); 是怎…

Linux学习之rpm安装软件

包管理器是方便软件安装、卸载&#xff0c;解决软件依赖关系的重要工具。 CentOS、RedHat使用yum包管理器&#xff0c;软件安装包格式为rpm。 Debian、Ubuntu使用apt包管理器&#xff0c;软件安装包格式为deb。 rpm包格式&#xff1a;vim-common-7.4.629-8.el7_9.x86_64.rpm vi…

移植微雪例程-1.54寸双色水墨屏

微雪官网&#xff1a;E-Paper ESP32 Driver Board - Waveshare Wiki 去微雪官网&#xff0c;把墨水屏的例程下下来。 我这个使用的是1.54寸的双色墨水屏。 下载下来之后&#xff0c;然后移植到IDF上面。 移植epd1in54c-demo这个例程。 一.移植前的准备工作: 复制以下内容到…

扩展卡尔曼滤波在目标跟踪中的应用(1)

前面几节相继介绍的不同维度的卡尔曼滤波算法&#xff0c;在线性高斯模型的条件下&#xff0c;具有很好的跟踪效果&#xff0c;当时在实际生活中&#xff0c;不可能所有的运动都呈现一种线性关系&#xff0c;也存在着非线性关系&#xff0c;比如说&#xff1a;飞机的飞行状态&a…

DBA 从业者在行业的变革下 --- 可行性出路

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

玩转ChatGPT:基于Mucloud建立本地知识库

一、写在前面 人们普遍认为GPT有潜力颠覆教育行业&#xff0c;然而这种颠覆会以何种方式呈现呢&#xff1f; 在刘慈欣的科幻世界中&#xff0c;三体人拥有知识遗传的能力&#xff0c;这使得他们的技术迭代成本降至最低。然而&#xff0c;我们人类并未具备这样的特性&#xff…

mysql数据库学习日记第一天

一、简介 数据库&#xff08;DB&#xff09;&#xff1a;存储数据的仓库 数据库管理系统&#xff08;DBMS&#xff09;&#xff1a;数据库管理系统 SQL&#xff1a;操纵关系数据库的一种编程语言&#xff0c;定义一套关于操作关系数据库的一套标准 二、安装教程 到MYSQL官…

拼多多攻势凌厉,中小电商崛起,京东和阿里更换掌门人

日前阿里董事会主席兼CEO都由新的人士担任&#xff0c;此前京东也更换了CEO&#xff0c;两大电商掌门人更换&#xff0c;电商行业引发震动&#xff0c;这不免让人想起另一家正快速崛起的电商拼多多&#xff0c;业界人士指出拼多多的崛起让两大电商闪了腰。 一、拼多多和众多中小…

第十章 ShuffleNetv2网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

RISCV-semi host原理以及实践

嵌入式裸机调试需要在有限资源的目标硬件上尽可能挖掘更多的信息&#xff0c;比如打印寄存器等等&#xff0c;但是即便看似很简单的串口打印&#xff0c;在有的情况下也是奢望&#xff0c;针对这种情况&#xff0c;能够有效利用主机资源协同调试的semi-host&#xff08;半主机&…

基于YOLACT的目标跟踪算法移植与测试

基于YOLACT的目标跟踪算法移植与测试 一、初始化开发环境&#xff08;基于x86架构CPU的开发环境中完成&#xff09; 1.1 初始化开发环境 1.下载SOPHON SDK开发包 #下载SOPHON SDK wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/06/15/16/Release_230501-pub…

大数据就业路线

✨博文作者&#xff1a;烟雨孤舟 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介&#xff1a;作为大数据爱好者&#xff0c;以下是个人总结的学习笔记&#xff0c;如有错误&#xff0c;请多多指教&#xff01; 数仓&#x…

English Learning - L3 作业打卡 Lesson7 Day46 2023.6.19 周一

English Learning - L3 作业打卡 Lesson7 Day46 2023.6.19 周一 引言&#x1f349;句1: If your life were a book and you were the author, how would you want your story to go?成分划分弱读连读语调 &#x1f349;句2: That’s the question that changed my life foreve…

ps beta爱国版下载全过程

​前言&#xff1a; 前段时间也是写了一篇ps beta版本下载的全过程呀&#xff0c;当时那篇文章还没有将软件变成永久免费试用&#xff0c;所以ps beta只能进行7天的免费使用&#xff0c;很多朋友可能意犹未尽呀&#xff0c;所以现在继续&#xff0c;将软件变成永久免费使用​。…

步长(stride) | 填充(padding) | 扩长(dilation)

这几个名词中文真的好难翻译&#xff0c;不是大佬就不要造名词了&#xff0c;后面还是老老实实用英文吧&#xff01;&#xff08;标题是机翻的 。&#xff09; stride stride 很好理解&#xff0c;stride 就是卷积核移动的步长。 如下图&#xff1a; stride1 stride2 paddi…

【嘉立创EDA】复合焊盘的引线居中对齐,typc接口引线对齐方法

文章路标👉 文章解决问题主题内容小结文章解决问题 1️⃣ 嘉立创EDA中对齐工具越发完善,但一些特殊的器件引线中,由于对齐属性设置等原因,部分引线无法与焊盘完全居中对齐,影响了线路的表象美观度与里内信号铺面。本文主要讲述如何应用嘉立创EDA的其他技巧将器件引线与…

基於Hadoop HA 在kerberos中配置datax

概要 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 概要 前言一、基於HADOOP HA 搭建datax二、基於HADOOP HA 配置好的datax去配置kerberos1.在datax的配置文件中進行配置2.在shell腳本中加入認證語句 总结 前言…

detrex | 面向detr系列的目标检测开源框架

DETR作为Transformer应用于目标检测领域的开山之作&#xff0c;后续有大量的算法都是在其基础上改进而来&#xff0c;如Deformable-DETR&#xff0c;DAB-DETR&#xff0c;DN-DETR&#xff0c;DINO等。这些模型尽管都是采用DETR的基本架构&#xff0c;但其改进创新却各有千秋&am…

人工智能时代,你知道ai绘画如何使用吗?

在数字时代的今天&#xff0c;人工智能正逐渐渗透到我们生活的方方面面&#xff0c;艺术创作也不例外。ai绘画软件作为一种创新的工具&#xff0c;为艺术爱好者、设计师和创作者提供了崭新的创作方式。但是&#xff0c;对于初次接触这类软件的人来说&#xff0c;可能会感到一些…

EMC学习笔记(四)地的设计

地的设计 1.接地的含义2.接地目的3.基本的接地方式3.1 单点接地3.2 多点接地3.3 浮地3.4 以上各种方式组成的混合接地方式 4.关于接地方式的一般选取原则4.1 单板接地方式 接地是抑制电磁干扰、提高电子设备EMC性能的重要手段之一。正确的接地既能提高产品抑制电磁干扰的能力&a…