指针与结构体

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

 

目录

1 啥是指针

1.1指针与指针变量

1.2总结

 2 指针和指针类型

2 .1指针+-整数

3 野指针

3.1 野指针的成因

3.2 如何避免野指针的出现

 4 二级指针

5 指针数组

6 结构体

 6.1 结构的声明

6.2 结构体变量的定义和初始化

 6.3 结构体的访问

6.4 结构体传参


前言

最近又重新学习了一下指针和结构体,感觉收获颇多,这不来把我那点所学分享该大家。

1 啥是指针

刚刚接触指针的同学肯定会很懵逼,指针是啥啊?指南针哈哈,不和大家开玩笑,我们进行正题吧,指针的本质就是地址,但我们要注意我们口头上常说的指针并非指针,而是指针变量。

1.1指针与指针变量

指针:内存中一个最小单元的编号,也就是地址。

指针变量:是用来存放内存地址的变量。

我们可以看下面的这张图。

为了唯一标识一块内存空间,在C语言中就用指针来标记,就像我们的寝室的门牌号一样,假设张三的寝室门排号是A602,A602就是地址也就是指针,为了让张三的寝室方便被人找到,我们肯定是要在系统是登记有怎么个寝室,下次来张三寝室也就方便,而在C语言中,就用指针变量来存放我们的地址通常用&地址操作符来取出地址在存放在指针变量

#include<stdio.h>int main()
{int a = 0;int* p = &a;*p = 1;return 0;
}

 从中我们可以看出,我们可以通过指针变量p解引用(*),来找到a从而更改a的值。

从上面图中我们知道在内存中的每一块空间的大小都是一个字节,那么对一个32平台的机器,就有32根地址线,地址线上能产生高电平(1)和低电平(0),这样的话就能产生2的32次方个地址。

2的32次方个地址

2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB),4G的空闲进行编址

 对于62位平台

便有2的62地址

2^64Byte == 2^64/1024KB == 2^64/1024/1024MB==2^64/1024/1024/1024GB ==17,179,869,184GB这样我们可以编码的空间就会很的多。

1.2总结

1指针本质是地址,指针变量是用来存放地址的。

2指针在32位平台的大小为,4个字节,在62位平台为8个字节

 2 指针和指针类型

指针的类型,其实,和变量的类型差不多,就是变量了类型多个*号

常见的指针类型

char  *pc = NULL;

int   *pi = NULL;

short *ps = NULL;

long  *pl = NULL;

float *pf = NULL;

double *pd = NULL;

2 .1指针+-整数

指针的+-整数其实反应的是指针跳过的字节,决定了指针的步长。

#include<stdio.h>int main()
{int arr[5] = { 1,2,3,4,5 };int* p = arr;printf("%d\n", *p);printf("%d\n", *(p + 1));printf("%d\n", *(p + 2));return 0;
}

arr指的是首元素的地址,存放在指针变量p上,我们*p就可以找到数组的第一个元素,那么*(p+1)指的又是上面呢,其实他指的是跳过一个4个字节,为什么是4个字节而不是一个字节呢,这就跟指针变量的类型有关系了,因为p是int*s是4个字节,如果是char*我们+1又会发生什么呢?

 这时我们观察到打印了0,我们*(p+4)才早的数组的第二个元素,这是因为数组arr中的每个元素都是4个字节的,而char*p类型的指针加1只能跳过1个字节,这时候找的首地址就不对了。

3 野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

3.1 野指针的成因

1 指针未初始化

 2 指针越界访问

 3  指针指向的空间释放

 这里虽然可以打印出6来,但这样的访问是非法的,因为形参在出函数就会销毁。

3.2 如何避免野指针的出现

1. 指针初始化

2. 小心指针越界

3. 指针指向空间释放即使置NULL

4. 避免返回局部变量的地址

5. 指针使用之前检查有效性

其中我们可以养成一个习惯,当我们不知道给指针初始化何值时,我们可以初始化指针为NULL(0),在对指针赋值的时候在判断一下,就可以一定程度上避免野指针。

 4 二级指针

简单的说就是存放一级指针的地址

 

 图中ppa便是二级指针变量,存的一级指针变量的地址。

5 指针数组

存放指针的数组,指针数组本质是数组。 

 其中的parr变是指针数组,其中parr[10]等价于*(parr+10);

指针数组可以模拟一个二维数组

6 结构体

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

 6.1 结构的声明

struct tag

{

member-list;

}variable-list;

struct:  是结构体类型的关键字

struct tag是用户定义的结构体类型

member-list:是结构体成员

variable-list:结构体类型变量

其中结构的成员可以是变量、数组、指针,甚至是其他结构体。

6.2 结构体变量的定义和初始化

结构体变量的定义就是给结构体类型取一个变量。

结构体的初始化

 6.3 结构体的访问

结构体变量成员用 .访问

结构体变量指针->访问

6.4 结构体传参

传参有二种,但对于结构体来说传址调用是最好的,

函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。 

所以:结构体传参的时候,要传结构体的地址

结束语

大家喜欢的话,来个三连吧。


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

相关文章

验证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;

Excel表格中建立树形结构

Excel表格中建立树形结构 2010-04-05 17:56:37| 分类&#xff1a; 开发笔记 |字号 订阅 有时在excel表格中需要建立树形结构&#xff0c;如下图所示。 对动物、植物进行分类。 动物、植物类中分别有子类&#xff0c;像动物中有鸟、猫、狗等。 每个子类又有自己的子类&#…

excel数据处理,表格数据处理成树形结构

excel数据模版如下&#xff1a;红色部分为一级菜单&#xff0c;绿色部分为二级菜单&#xff0c;绿色部分对应的是三级菜单 现在将数据转化为树形结构 名称&#xff0c;编码&#xff0c;上级编码&#xff0c;这种格式&#xff0c;首先将数据做转化导入到mysql mysql根据逗号将一…