零基础入门C语言——结构体指针

article/2025/8/21 19:16:38

文章目录

  • 结构体概述
  • 结构体指针
    • 动态存储分配
      • <1>.malloc函数
      • <2>.calloc函数
      • <3>.free函数

结构体概述

问题定义:有时需要将不同类型的数据组合成一个有机的整体,以便于使用,就类似于sql中的存储一样,随着语言层次的增高封装性是越来越大的。如:

int num;
char name[20];
char sex;
int age;
char addr[30];

在这里插入图片描述
定义结构的一般形式为:
struct 结构名{
成员列表
};

成员列表由若干个成员构成,每个成员都是该结构的组成部分,对每个成员必须做类型说明,其形式为:
类型说明符 成员名;
例如说

struct student{int num;char name[20];char sex;int age;float score;char addr[30];
}

可以采用以下三种方法定义结构体类型变量:

  • (1)先声明结构体类型再定义变量名
    例如:struct(类型名) student(结构体) student1(变量名),student2(变量名);
    定义了student1和student2为struct student类型的变量,即他们具有struct student类型的结构

  • (2)在声明类型的同时定义变量这种形式的定义的一般形式为:
    struct 结构体名{
    成员列表
    }变量名;
    例如:

struct student{int num;char name[20];char sex;int age;float score;char addr[30];
}student1,student2

在定义了结构体变量后,系统会为其分配内存单元。例如:
student1和student2在内存中各占几字节?
答(4+20+1+4+4+30 = 63)

  • (3)直接定义结构体类型变量其一般形式为:
    struct{
    成员列表
    }变量名

现在我们直到了怎么构造一个结构体了,下面要说一下在结构体内引用另一个结构体的方法,也就是在结构体内嵌套另一个结构体
在这里插入图片描述
首先我们定义一个结构体date,由month,day,year组成
在定义说明变量boy1和boy2时,其中的成员birthday被说明为date结构类型。成员名可与程序中其他变量同名,互不干扰。

struct date{int month;int day;int year;
};
struct {int num;char name[30];char sex;struct date birthday;float score;
}boy1,boy2;

引用变量法则:
(1)不能将一个结构体变量作为一个整体进行输入和输出。
应该这样引用:

int main() {boy1.num = 01;boy1.sex = 'M';printf("%d,%c", boy1.num, boy1.sex);
}

对于结构体的基础语法说完了,下面来说结构体指针

结构体指针

一个结构体变量的指针就是该结构体变量所占据内存段的起始地址。
可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。
同时指针变量也可以用来指向结构体数组中的元素。
结构体指针变量说明的一般形式为:
struct 结构名 *结构指针变量名
例如,在前面的例题中定义了stu这个结构,如果要说明一个指向stu的指针变量pstu,可写为

struct stu *pstu;

当然也可以在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构体指针变量也必须要先赋值才能使用
赋值就是把结构变量首地址赋予该指针变量,不能把结构名赋予该指针变量。
如果boy是被说明为stu类型的结构变量,则:
pstu = &boy;是正确的
pstu = &stu;是错误的
因为结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对他们分配内存空间,只有当某变量被说明为这种类型的结构时,才对该变量存储内存空间。
所以以上 pstu = &stu;是错误的,不可能去取一个结构名的首地址。有了结构指针变量,就更方便地访问结构变量的各个成员。
其访问的一般形式为:
(*结构指针变量).成员名
或为:
结构指针变量->成员名
例如:(*pstu).num
或者:pstu->num

小案例

struct stu{int num;char *name;char sex;float score;
}boy1 = {006,"zhangzhang",'1',69.6};int main() {struct stu *pstu;pstu = &boy1;printf("%d,%s\n", boy1.num, boy1.name);printf("%d,%s\n", (*pstu).num, (*pstu).name);printf("%d,%s\n", pstu->num, pstu->name);}

例题:有一个结构体变量stu,内含学生学号、姓名和三门学科的成绩,通过调用函数print使他们输出

struct student{int num;char *name;int score[3];
};
void print(struct student stu,struct student *pstu){printf("num:%d\n",stu.num);printf("name:%s\n", stu.name);printf("score[0]:%d\n", pstu->score[0]);printf("score[1]:%d\n", (*pstu).score[1]);printf("score[2]:%d\n", (*pstu).score[2]);
}
int main() {struct student *p;struct student stu;stu.num = 007;p->name = "zhangzhang";(*p).score[0] = 59;(*p).score[1] = 60;(*p).score[2] = 61;print(stu,p);//    struct stu *pstu;
//    pstu = &boy1;
//
//    printf("%d,%s\n", boy1.num, boy1.name);
//
//    printf("%d,%s\n", (*pstu).num, (*pstu).name);
//
//    printf("%d,%s\n", pstu->num, pstu->name);}

动态存储分配

在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。在C语言中不允许动态数组类型。例如:a[n]就是错误的,必须要用一个实际的数字表示数组长度,但是在实际开发中,往往会发生这种情况,即所需要的内存空间取决于实际输入的数据,而无法预先确定。对于以上问题,使用数组的办法很难解决,只能通过内存管理函数,动态分配内存空间。
常用的内存管理函数有以下三个:
1.分配内存空间函数malloc,calloc
2.释放内存空间函数free

<1>.malloc函数

函数原型为void *malloc(unsigned int size);
其作用是在内存的动态存储中分配一个长度为size的连续空间(size是一个无符号数)
此函数的返回值是一个指向分配域起始地址的指针(void)。
如果此函数未能成功地执行(例如内存空间不足),则返回Null.

<2>.calloc函数

函数原型是void *calloc (unsigned n,unsigned size)
其作用是在内存的存储区中分配n个长度为size的连续空间。
函数返回一个指向分配域起始地址的指针。
如果分配不成功,返回Null
用calloc函数可以为一维数组开辟动态存储空间,n为数组个数,每个元素长度为size

<3>.free函数

函数原型是void free(void *p)
其作用是释放由p指向的内存区,使这部分内存区能被其他区使用
p是最近一次调用calloc或者malloc函数的时候返回的值。


http://chatgpt.dhexx.cn/article/fskjZEGC.shtml

相关文章

C++死磕基础之指针篇(四)--结构体指针的定义以及使用

本篇文章主要讲解C指针中的另一种使用方法—结构体指针的使用 一.C结构体的定义及创建方式 1.结构体定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合&#xff0c;也叫结构&#xff0c;比如学生结构体&#xff0c;整合了学号&#xff0c;姓名等等信…

指针与结构体

目录 1 啥是指针 1.1指针与指针变量 1.2总结 2 指针和指针类型 2 .1指针-整数 3 野指针 3.1 野指针的成因 3.2 如何避免野指针的出现 4 二级指针 5 指针数组 6 结构体 6.1 结构的声明 6.2 结构体变量的定义和初始化 6.3 结构体的访问 6.4 结构体传参 前言 最近又重新…

验证JDK是否安装成功

1.打开命令提示符(打开方式如下) ①方式一&#xff1a;快捷键winR&#xff0c;输入cmd命令&#xff0c;点击确定即可打开 ②方式二&#xff1a;直接在开始导航栏里面搜索cmd 最终进入如下页面&#xff1a; 2.输入命令javac,若出现如下的提示表示JDK安装成功&#xff1b;如果提示…

ubuntu下pytorch验证安装成功程序

根据pytorch官网提供的程序 from __future__ import print_function import torch x torch.rand(5, 3) print(x)新建.py文件把以上代码复制进去 输入指令 python3 "文件名"可得到如下输出 另外也可以通过命令行验证pytorch是否安装成功&#xff0c;输入后不报错…

MongoDB权限验证开启与mongoose数据库配置

Express项目最常用的数据库是mongodb&#xff0c;并搭配模块mongoose完成对数据库的访问。 本文假设您已经正确的完成了mongodb数据库的安装&#xff0c;下面是针对mongodb的设置和项目配置工作。 一、为mongodb数据库设置权限验证 在mongodb安装完成之后&#xff0c;默认情况…

oracle安装成功验证

验证安装成功 打开sql命令黑窗口 输入命令 conn system 输入密码&#xff0c;密码是看不见的。 就连接好了。 接着要安装数据库管理系统&#xff08;一个&#xff09; 数据库&#xff08;多个&#xff09; SID&#xff1a; 数据库的唯一标识符&#xff0c;就是指数据库名 or…

python 密码验证

题目描述&#xff1a; (1)模拟登陆界面&#xff0c;判别用户名和密码&#xff0c;给出合适的提示&#xff0c;如果超过三次&#xff0c;锁定输入。用代替密码&#xff1b;或者最新输入显示&#xff0c;前面的变成&#xff1b;安全性措施。 (2)同时添加如下图的加强验证&#x…

MMDetection的安装及验证

参考&#xff1a;安装 — MMDetection 2.22.0 文档 进入openMMLab社区好久了&#xff0c;但是前面都是在学一些基础知识&#xff0c;最近看到了目标检测的部分&#xff0c;然后尝试配置了一下mmDet的环境&#xff0c;过程中踩了很多坑&#xff0c;也用了很长时间&#xff0c;在…

java环境变量配置验证_怎么验证Java环境变量配置成功

Java环境变量已经配置完了,不知道行不行,那么怎么验证Java环境变量配置成功呢?下面是学习啦小编收集整理的怎么验证Java环境变量配置成功&#xff0c;希望对大家有帮助~~ 验证Java环境变量配置成功的方法 方法/步骤 首先&#xff0c;在桌面右击&#xff0c;选择“文本文档”&a…

验证tomcat安装成功

安装之后: 1.到安装目录下找startup.bat不闪退,并出现以下图2为成功安装: 再打开谷歌浏览器输入: localhost:8080验证. Tomcat服务器介绍和使用: 服务器的概念和作用: 问题: 学习了java编程之后,java代码的一个很重要的作用就是进行数据的处理,但是目前来说我们运行编写的…

京东手势验证

先给大家看看京东的验证码有多变态 长这个样子&#xff0c;作者测试过程中在浏览器最多划了二十几次才通过&#xff0c;搞到我都开始怀疑根本就过不去。jd验证码花了我一周多时间才搞完&#xff0c;一直卡在这个轨迹上面&#xff0c;想用深度学习又不知道弄出来轨迹该怎么生成&…

[ant design vue] 表单验证成功,提示信息不显示

以上是原图以及源代码&#xff0c;input中带有表单验证&#xff0c;但是输入0以后却不显示报错信息&#xff0c;后来通过大哥指点&#xff0c;因为一个a-form-item只验证一个input,所以给每一个input加一个a-form-item问题解决。代码及效果如下&#xff1a;

怎么验证mysql安装成功_mysql如何验证是否安装成功

mysql验证是否安装成功的方法&#xff1a;1、打开DOS窗口&#xff0c;输入status命令查看MySQL版本信息&#xff1b;2、打开MySQL 5.7 Command Line Client程序&#xff0c;打开当前MySQL服务器状态&#xff0c;输入相关命令能显示当前的数据库列表即可。 相关学习推荐&#xf…

局域网内构建自己的ntp校时服务器并验证成功与否

局域网内构建自己的ntp校时服务器并验证成功与否 最近委座提了个要求&#xff0c;模拟客户那边的环境&#xff0c;局域内网搭建个ntp校时服务器&#xff0c;然后让其他服务器跟这个ntp服务器保持一致的时间。 开始干吧&#xff0c;分2步走&#xff1a;1.先找两台centos7.x的服…

Vue Element表单验证成功后,清空表单

this.$refs.ruleForm.resetFields() 这是用来清空表单的代码&#xff0c;实际使用可以放在显示操作成功的代码下面&#xff0c;在接口调用成功后执行。 出处是&#xff1a;

JWT的介绍与应用

目录 2.JWT的应用场景 3.JWT的应用详解 4.为什么要用JWT 2.1 传统Session认证的弊端 2.2 JWT认证的优势 5.JWT结构 1.Header 2.Payload 3.Signature 6.JWT的种类 JSON Web Token&#xff08;JWT&#xff09;是一个开放式标准&#xff08;RFC 7519&#xff09;&#xf…

判断MySQL安装是否成功的两种验证方法

如何判断MySQL是否安装成功&#xff1f; 一、命令提示符cmd窗口验证二、MySQL控制台验证 一、命令提示符cmd窗口验证 键盘winR打开命令提示符&#xff0c;输入cmd。 在电脑中找到安装好的MySQL的bin文件目录 。这是我的安装目录C:\Program Files\MySQL\MySQL Server 5.7\bin。…

Anaconda 安装及验证是否安装成功

关于安装&#xff1a; 1、打开准备好的安装包&#xff08;官网下载或者镜像网站下载都可以&#xff09;&#xff0c;点next 2、继续点I Agree 3、点All Users 4、安装位置&#xff0c;默认安装在C盘&#xff0c;点击更改&#xff0c;自定义路径&#xff0c;要确保这个路径下是…

如何将Excel数据转化成树状结构

数据如下图 请问怎么才能将以上数据转换成树状结构 因为数据较多&#xff0c;除去手动分组的方法请问还有什么方法呢&#xff1f;