指针乐园----上

大家好,我是Beilef,许久未见还请多多关照。

      

文章目录

  • 目录

    文章目录

    前言

    一、指针是什么

    二、指针的运用

    1.指针变量和地址

    2.指针变量和解引⽤操作符(*)

    解引用操作符

     3.指针变量类型及意义

     3.2指针的+-整数

     3.3 void* 指针 在指针类型中有⼀种特殊的类型是 void* 类型的,可以理解为⽆具体类型的指针(或者叫泛型指 针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进 ⾏指针的+-整数和解引⽤的运算。

     

     如图所示​编辑

     虽然使用void可以保存别的指针类型,但是不能进行直接运算

     4.指针的运算

     6. 野指针

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

     如何规避野指针

    总结



前言

今天带给大家的是指针的第一篇。后续还会有下或者还会有中。

指针嘛,对于新手还是不容易接受的。指针就是一把双刃剑,用的好了指哪打哪,用的不好打哪哪不中。

我会尽可能讲的通透一点。O(∩_∩)O。


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针是什么

简单一句话:指针就是保存地址的。

说一个关于我们生活的例子:就像你去一个新的单身公寓,,有那么多房间,如果没有标号你的朋友过来找你他只能一个一个找。但是如果这个公寓的所有房间都有编号那么你的朋友就能很轻松找到你。

如果把上⾯的例⼦对照到计算中,⼜是怎么样呢? 我们知道计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数 据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何⾼ 效的管理呢? 其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。 计算机中常⻅的单位(补充): ⼀个⽐特位可以存储⼀个2进制的位1或者0

 bit - ⽐特位    byte - 字节    KB   MB   GB   TB   PB

1 byte = 8bit   1KB = 1024byte    1MB = 1024KB      1GB = 1024MB     1TB = 1024GB     1PB = 1024TB

每个内存单元也都有⼀个编号(这个编号就相当 于你的房间的编号),有了这个内存单元的编 号,CPU就可以快速找到⼀个内存空间。在生活中我们把⻔牌号也叫地址,在计算机中我们 把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫:指针。 所以我们可以理解为: 内存单元的编号 == 地址 == 指针 

二、指针的运用

1.指针变量和地址

理解了内存和地址的关系,我们再回到C语⾔,在C语⾔中创建变量其实就是向内存申请空间,⽐如:

                        

⽐如,上述的代码就是创建了整型变量a,内存中 申请4个字节,⽤于存放整数0,其中每个字节都 有地址.

那我们如何能得到a的地址呢? 这⾥就得学习⼀个操作符(&)-取地址操作符

2.指针变量和解引⽤操作符(*)

指针变量       那我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如:0x006FFD70,这个数值有时候也是需要 存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。 ⽐如:

                                              

指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。

2.2 如何拆解指针类型

我们看见p的左边是  int *。这里*就说明他是指针变量。int 是他指向的类型。


解引用操作符

我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢? 在现实⽣活中,我们使⽤地址要找到⼀个房间,在房间⾥可以拿去或者存放物品。 C语⾔中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针) 指向的对象,这⾥必须学习⼀个操作符叫解引⽤操作符(*)。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int a = 10;int* p = &a;printf("a=%d\n", a);printf("*p=%d\n", *p);*p = 0;printf("*p=%d\n", *p);return 0;
}

代码运行如下:

​​​​​​

 上⾯代码中第7⾏就使⽤了解引⽤操作符, *pa 的意思就是通过pa中存放的地址,找到指向的空间, *pa其实就是a变量了;所以*pa = 0,这个操作符是把a改成了0. 有同学肯定在想,这⾥如果⽬的就是把a改成0的话,写成 a = 0; 不就完了,为啥⾮要使⽤指针呢? 其实这⾥是把a的修改交给了pa来操作,这样对a的修改,就多了⼀种的途径,写代码就会更加灵活, 后期慢慢就能理解了。

 3.指针变量类型及意义

 3.1指针大小

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{//指针变量的⼤⼩取决于地址的⼤⼩//32位平台下地址是32个bit位(即4个字节)//64位平台下地址是64个bit位(即8个字节)printf("%zd\n", sizeof(char*));printf("%zd\n", sizeof(short*));printf("%zd\n", sizeof(int*));printf("%zd\n", sizeof(double*));return 0;
}

                        

 指针变量类型的意义 指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的,为什么还要有各 种各样的指针类型呢? 其实指针类型是有特殊意义的,我们接下来继续学习

#include <stdio.h>
int main()
{int n = 0x11223344;
//char *pc = (char *)&n;int *pi = &n; *pi = 0; return 0;
}

 调试我们可以看到,代码会将int* 中n的4个字节全部改为0,但是char*中只是将n的第⼀个字节改为0。 结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。 ⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。


 3.2指针的+-整数

 先看一段代码

 我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。 这就是指针变量的类型差异带来的变化。 结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。


 3.3 void* 指针 在指针类型中有⼀种特殊的类型是 void* 类型的,可以理解为⽆具体类型的指针(或者叫泛型指 针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进 ⾏指针的+-整数和解引⽤的运算。

 当我们使用char*接受int类型时会显示不兼容,但是使用viod就不会出现这种现象。

 如图所示

 虽然使用void可以保存别的指针类型,但是不能进行直接运算

 4.指针的运算

 指针的基本运算有三种,分别是

: • 指针+- 整数

• 指针-指针

• 指针的关系运算

 指针+- 整数 因为数组在内存中是连续存放的,只要知道第⼀个元素的地址,顺藤摸⽠就能找到后⾯的所有元素。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", *(p + i));//p+i 这⾥就是指针+整数}return 0;}	

 指针减去指针得到的是他们之间的个数

 

 指针的关系运算

 


 6. 野指针

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

 野指针形成的原因主要有这几个

1.没有初始化。

2.越界访问.

3.指向的内容被释放。

 只要我们注意野指针的问题那么我们在使用的时候就大概不会有问题。

 如何规避野指针

1. 指针初始化 如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL. NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错。

 2.⼩⼼指针越界 ⼀个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是 越界访问。

3.指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性 当指针变量指向⼀块区域的时候,我们可以通过指针访问该区域,后期不再使⽤这个指针访问空间的 时候,我们可以把该指针置为NULL。因为约定俗成的⼀个规则就是:只要是NULL指针就不去访问, 同时使⽤指针之前可以判断指针是否为NULL。 我们可以把野指针想象成野狗,野狗放任不管是⾮常危险的,所以我们可以找⼀棵树把野狗拴起来, 就相对安全了,给指针变量及时赋值为NULL,其实就类似把野狗栓前来,就是把野指针暂时管理起 来。 不过野狗即使拴起来我们也要绕着⾛,不能去挑逗野狗,有点危险;对于指针也是,在使⽤之前,我 们也要判断是否为NULL,看看是不是被拴起来起来的野狗,如果是不能直接使⽤,如果不是我们再去 使⽤。

4.避免返回局部变量的地址 如造成野指针的第3个例⼦,不要返回局部变量的地址


总结

指针是新手的第一个boss,当然我也有不足的地方。那么请大家把不足之处在评论区告诉我吧

我们一起加油!!!

                       

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

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

相关文章

docker-compose Install Dockge

Dockge Dockge 是一个精美的、易于使用的、反应式的自托管 docker compose.yaml 面向堆栈的管理器。 主要特性: 通过Web页面管理compose.yaml文件。 创建/编辑/启动/停止/重新启动/删除容器。更新Docker镜像。交互式Web终端。响应式设计,实时更新进度(Pull/Up/Down)和Web…

Win11桌面出现的这个图标“了解此图片”怎么关闭?

&#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ …

Java开发手册,java高并发高可用面试题

前言 今年我也33了&#xff0c;离传说中不好找工作的35岁又更近了。说没有焦虑是对自己撒谎&#xff0c;于是我采访了一些人&#xff0c;自己思考了下&#xff0c;写下了这篇文章&#xff0c;希望能有些共鸣。 先看看大家的态度&#xff1a; 色老力衰&#xff0c;不好忽悠&a…

rt-thread uart驱动

uart驱动描述基于GD32F470芯片。 rt-thread提供了一套I/O设备模型&#xff0c;如果想要使用操作系统的驱动去进行操作&#xff0c;就得将具体芯片的硬件驱动注册到设备驱动框架上。 关于rt-thread的I/O设备模型相关内容可以参考 rt-thread I/O设备模型-CSDN博客文章浏览阅读55…

vue命令行

书接上回&#xff0c;一直没能将vue-shop-master项目启动&#xff0c;还是停留在命令行&#xff0c;现参考链接如下&#xff0c; https://blog.csdn.net/jieyucx/article/details/127915699 止步不前了&#xff0c;晚上再摸索吧&#xff0c;搞电商去。。。。溜了溜了&#x…

MySQL进阶之(四)InnoDB数据存储结构之行格式

四、InnoDB数据存储结构之行格式 4.1 行格式的语法4.2 COMPACT 行格式4.2.1 记录的额外信息01、变长字段长度列表02、NULL 值列表03、记录头信息 4.2.2 记录的真实数据 4.3 Dynamic 和 Compressed 行格式4.3.1 字段的长度限制4.3.2 行溢出4.3.3 Dynamic 和 Compressed 行格式 4…

【Flutter 】get-cli init报错处理

报错内容 get init 命令跳出,报错内如下 Select which type of project you want to creat Synchronous waiting using dart:cli waitFor Unhandled exceotion . Dart WaitforEvent is deprecated and disabled by default. This feature will be fully removed in Dart 3.4 …

【定岗定编】某度假村酒店客房部定岗定编管理咨询项目纪实

该度假村酒店由于地域广阔&#xff0c;将客服部分为了四个不同区域&#xff0c;这样就导致了在不同的区域员工的接待量不均衡的状况&#xff0c;引起了员工的强烈不满。如何合理地配置客户部人员以及如何合理地鉴定员工的工作量成为该酒店所面临的两大难题。让我们来看看在人力…

vulhub中ThinkPHP5 SQL注入漏洞 敏感信息泄露

漏洞原理 传入的某参数在绑定编译指令的时候又没有安全处理&#xff0c;预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式&#xff0c;在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码 启动后&#xff0c;访问http://your-ip/index.php?ids[]1&ids[]2…

即插即用篇 | YOLOv8 引入 NAM 注意力机制 | 《NAM: Normalization-based Attention Module》

论文名称:《NAM: Normalization-based Attention Module》 论文地址:https://arxiv.org/pdf/2111.12419.pdf 代码地址:https://github.com/Christian-lyc/NAM 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large…

C++之类型转换

C语言中的类型转换 在C语言中, 如果赋值运算符左右两侧类型不同, 或者形参与实参类型不匹配, 或者返回值类型与 接收返回值类型不一致时, 就需要发生类型转化, C语言中总共有两种形式的类型转换: 隐式类型转换和显式类型转换 1. 隐式类型转化是关联度很强, 意义相近的类型之间…

【CSP试题回顾】201512-2-消除类游戏

CSP-201512-2-消除类游戏 解题思路 输入棋盘大小和颜色: 首先&#xff0c;程序从标准输入读取两个整数n和m&#xff0c;分别代表棋盘的行数和列数。然后&#xff0c;程序读取接下来的n行输入&#xff0c;每行包含m个整数&#xff0c;代表棋盘上每个方格中的棋子颜色。 初始化…

[蓝桥杯 2017 省 A] 油漆面积 Java代码及一些个人理解

[蓝桥杯 2017 省 A] 油漆面积 题目描述 X 星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便&#xff0c;建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量&#xff0c;每个…

【论文速读】 | AI驱动修复:漏洞自动化修复的未来

本次分享论文为&#xff1a;AI-powered patching: the future of automated vulnerability fixes 基本信息 原文作者&#xff1a;Jan Nowakowski, Jan Keller 作者单位&#xff1a;Google Security Engineering 关键词&#xff1a;AI, 安全性漏洞, 自动化修复, LLM, sanitiz…

Objective-C blocks 概要

1.block的使用 1.1什么是block&#xff1f; Blocks是C语言的扩充功能&#xff1a;带有自动变量&#xff08;局部变量&#xff09;的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块&#xff0c;封装了函数调用及调用…

全方位碾压chatGPT4的全球最强模型Claude 3发布!速通指南在此!保姆级教学拿脚都能学会!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

Android开发岗还不会这些问题,温故而知新

前言 前前后后经历过大项目、小项目&#xff0c;跨平台&#xff0c;小程序&#xff0c;Nodejs服务等等&#xff0c;目前在做的Rom开发&#xff0c;定制各种手机中的奇葩需求&#xff0c;从应用层到Framework层&#xff0c;再到C层&#xff0c;再到驱动&#xff0c;最终到Linux&…

MybatisPlus入门详解

一、MyBatisPlus 简介 1.1 创建新模块 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency> 由于mp并未被收录到idea的系统内置配置,无法…

Solidity Uniswap V2 Pair中添加流动性

添加流动性的功能的用户入口&#xff0c;UniswapV2在UniswapV2Router中实现&#xff0c;它用来计算新的流动性并发行LP-Token&#xff0c;流动性管理简单地视为LP-Token管理。当你为一个pair增加流动性时&#xff0c;合约会创造LP Token;当你移除流动性时&#xff0c;LP-Token就…

【debug】element-ui时间控件回显后不可编辑且显示为空

问题&#xff1a;使用element-ui的时间控件回显数据&#xff0c;编辑数据没有反应&#xff1a;点时间和“确认”按钮都没反应。 输入框中会显示数据&#xff0c;但提交时的校验显示为空。 <el-form-item label"开始时间" prop"limitStartTime"><…