指针乐园----上

大家好,我是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,当然我也有不足的地方。那么请大家把不足之处在评论区告诉我吧

我们一起加油!!!

                       

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

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

相关文章

css-解决Flex布局下居中溢出滚动截断问题

css-解决Flex布局下居中溢出滚动截断问题 1.出现的问题2.解决方法2.1 Flex 布局下关键字 safe、unsafe2.2 使用 margin: auto 替代 justify-content: center2.3 额外嵌套一层 1.出现的问题 在页面布局中&#xff0c;我们经常会遇到/使用列表内容水平居中于容器中&#xff0c;一…

linux系统上安装docker 并配置国内镜像

目录 1.安装docker 2.配置国内镜像源 1.安装docker 首先要安装一个yum工具 yum install -y yum-utils 安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo …

AI加速“应用现代化”,金融核心系统转型正当时

数字经济时代&#xff0c;金融机构需要快速感知客户需求&#xff0c;提升产品供给的敏捷度&#xff0c;才能在白热化的竞争环境中抢占先机&#xff0c;而无论是金融机构还是方案提供商&#xff0c;都需要深入思考核心系统现代化的内涵&#xff0c;携手迈出应用现代化的重要一步…

MySQL 核心模块揭秘 | 08 期 | 二阶段提交 (2) commit 阶段

这篇文章是二阶段提交的 commit 子阶段的前奏&#xff0c;聊聊 commit 子阶段相关的一些概念。 作者&#xff1a;操盛春&#xff0c;爱可生技术专家&#xff0c;公众号『一树一溪』作者&#xff0c;专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品&#xff0c;原创内…

几种电脑提示mfc140.dll丢失的解决方法,以及如何预防mfc140.dll丢失

mfc140.dll真是一个超级关键的动态链接库文件&#xff01;一旦这个文件不翼而飞&#xff0c;可能会导致一些程序无法顺利运行&#xff0c;甚至给系统带来麻烦。但别担心&#xff01;遇到mfc140.dll文件丢失的情况&#xff0c;我们有一堆应对措施可以立马施行&#xff0c;确保问…

掌握Pillow:Python图像处理的艺术

掌握Pillow&#xff1a;Python图像处理的艺术 引言Python与图像处理的概述Pillow库基础导入Pillow库基本概念图像的打开、保存和显示 图像操作基础图像的剪裁图像的旋转和缩放色彩转换和滤镜应用文字和图形的绘制 高级图像处理图像的合成与蒙版操作像素级操作与图像增强复杂图形…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第3章 开发板直连电脑配置方法(不能上外网)

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

python_读取txt文件绘制多条曲线III

先把文件中指定列&#xff0c;去重提取出来&#xff0c;然后根据指定列去匹配数据&#xff0c;最后完成多条数据的绘图&#xff1b; import matplotlib.pyplot as plt import re from datetime import datetime from pylab import mplmpl.rcParams["font.sans-serif"…

Rust入门:GCC或VS2019中的c或c++程序如何调用Rust静态库

首先创建一个rust的库&#xff0c;这里我假设命名为c-to-rust1 cargo new --lib c-to-rust1 其中&#xff0c;src/lib.rs的内容如下&#xff0c; #[no_mangle] pub extern "C" fn get_string() -> *const u8 {b"Hello C World\0".as_ptr() }注解 …

解决微信好友添加频繁问题

今天我们来聊一聊微信好友添加频繁的问题。在日常使用中&#xff0c;有时候我们会遇到一些添加好友受限的情况&#xff0c;那么究竟是什么原因导致了这一问题呢&#xff1f;接下来&#xff0c;让我们逐一来看一看。 1. 添加好友的频率太高 首先&#xff0c;如果我们在短时间内…

中小企业如何降低网络攻击和数据泄露的风险?

德迅云安全收集了Bleeping Computer 网站消息&#xff0c; Arctic Wolf 表示 Akira 勒索软件组织的攻击目标瞄准了中小型企业&#xff0c;自 2023 年 3 月以来&#xff0c;该团伙成功入侵了多家组织&#xff0c;索要的赎金从 20 万美元到 400 多万美元不等&#xff0c;如果受害…

猴子吃桃:玩转二分思维

前言 在计算机编程领域&#xff0c;算法是解决问题的有效途径之一。而算法题则是考察程序员解决问题能力的重要手段之一。在这篇文章中&#xff0c;我们将通过一个经典的算法题目——猴子吃桃&#xff0c;来探讨算法思维的重要性以及解题的方法。 题目描述 孙悟空喜欢吃蟠桃…

企业计算机服务器中了devos勒索病毒怎么解密,devos勒索病毒解密流程

现在&#xff0c;很多企业都依赖网络计算机的力量开展各项工作业务&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但网络也会搜集存储各个用户的信息便于统计分析&#xff0c;从而导致了企业的数据安全也会受到很大影响。近日&#xff0c;云天数据恢复中心接到多家企…

【阅读笔记】最通俗易懂的 transformer 笔记

这里写目录标题 前言第 1 节 N 元文法语言模型1.2、平滑&#xff08;Smoothing&#xff09;1.2.1、加 1 平滑 / 拉普拉斯平滑&#xff08;Add-One Smoothing / Laplace Smoothing&#xff09;1.2.2、 δ \delta δ 平滑&#xff08;Add-K Smoothing / Delta Smoothing&#xf…

Xilinx高级调试方法--远程调试

Xilinx高级调试方法--远程调试 1 虚拟电缆调试2 FPGA设计2.1 扩展配置接口 3 PCIe-XVC驱动3.1 PCIe-XVC驱动3.2 XVC-Server 4 Vivado Design Suite4.1 同一台主机4.2 不同主机 本文主要介绍Xilinx的一些高级调试方法&#xff0c;以及如何使用Xilinx的相关IP。 1 虚拟电缆调试 …

CAN通信篇 - CanSM模块配置(五)

文章目录 CanSMConfigurationCanSMManagerNetworkCanSMGeneralCanSMGeneration总结Can State Manager (CanSM)模块,是CAN网络的状态管理模块,所有对CAN网络状态的请求都是通过CanSM实现。这里我们介绍一下在Davinci Configurator中CanSM模块的配置。 在CanSM模块的总线管理…

游泳耳机哪个牌子好?四大热卖游泳耳机汇总,年度首选

在当今日益注重健康生活方式的时代&#xff0c;游泳作为一项全身性的有氧运动备受青睐。然而&#xff0c;对于许多游泳爱好者来说&#xff0c;水下世界的孤独可能会让他们感到无聊。而游泳耳机的出现不仅为游泳者带来了音乐的陪伴&#xff0c;还让他们能够在水下畅享各种声音&a…

【译】WordPress Bricks主题安全漏洞曝光,25,000个安装受影响

WordPress的Bricks主题存在一个严重的安全漏洞&#xff0c;恶意威胁行为者正在积极利用该漏洞在易受攻击的安装上运行任意PHP代码。 该漏洞被跟踪为CVE-2024-25600&#xff08;CVSS评分&#xff1a;9.8&#xff09;&#xff0c;使未经身份验证的攻击者能够实现远程代码执行。它…

【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制

目录 1.先理清一下概念 2.锁 2.1.分类 2.2.表锁 2.3.行锁&#xff08;MVCC&#xff09; 2.4.间隙锁 2.5.行锁变表锁 2.6.强制锁行 1.先理清一下概念 所谓并发控制指的是在对数据库进行并发操作时如何保证数据的一致性和正确性。在数据库中与并发控制相关的概念有如下几…

【企业动态】欢迎法国客户来访东胜物联,深入探讨智能化合作

本周&#xff0c;来自法国的客户莅临我司工厂进行实地参观考察。客户是一家历史悠久的设备供应商&#xff0c;其产品涵盖冷链、餐饮、农业等多个行业应用领域&#xff0c;正致力于从传统设备向智能设备转型&#xff0c;希望将设备接入物联网。在此次访问中&#xff0c;他们参观…