C语言指针详解(1)

2023-05-16

.指针详解   

    之前我说过一篇关于指针在C语言中的基本使用,这次我再来细讲一下指针的其他内容。

目录

一.指针详解

1.指针定义

2.指针类型

3.野指针

4.如何规避野指针?


1.指针定义

指针理解的2个要点:

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

2. 平时我们所说的指针,通常指的是指针变量,是用来存放内存地址的变量。

int main(){
int a=10;
int* pa=&a;    //取出a的地址关联给指针变量
*pa=20;        //解引用操作,间接改变变量的值
printf("%d\n",a);//20
return 0;
}

        *pa-->0x0012FF40,指针指向的就是变量a的起始地址。 

         内存会被划分成一个个小小的存储单元,每个内存单元的大小都是固定为1字节(byte)大小。经过大量的计算和权衡,一个存储单元对应一个地址,对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电 平(低电压)就是(1或者0); 那么32根地址线产生的地址就会是:

00000000000000000000000000000000(32bit位全0)

................................................................        到

1111111111111111111111111111111111111(32bit全1)

共有2^32次方个地址,换算成大单位的话,一块内存大概有4GB的大小。而对于64位系统,则共有2^64次方个地址,约8GB内存。

        总结: 指针是用来存放地址的,地址是唯一标示一块地址空间的。

                    任何指针的大小在32位平台是4个字节,在64位平台是8个字节 。

 

2.指针类型

        C语言中,变量与数组有整数类型,浮点类型,字符类型等,指针也是一样的。

           char* 类型的指针是为了存放 char 类型变量的地址。

           short* 类型的指针是为了存放 short 类型变量的地址。

           int* 类型的指针是为了存放 int 类型变量的地址。 

                .....

        刚才讲到了 任何指针的大小都为4字节(32位中),指针不会因为类型的不同而改变其字节大小,那么指针类型到底有怎样的意义?

a.指针类型意义1:指针变量的解引用 

# include<stdio.h>
int main() {
	int a = 0x11223344;//地址都是用十六进制表示(0x为16进制表示形式)
	int* p = &a;
	*p = 0;
	printf("%p\n", a);
	return 0;
}

 

 

        在上面的代码中,我将a的地址设置为了0x11223344,使用指针变量关联了a的地址,通过解引用的操作,令指针p将a的值间接化为0,通过调试,可以发现下图中a的地址改为了0x00000000。

 

        十六进制地址中,每两位代表一个字节,所以地址共有4字节大小,而int类型的指针解引用后便可以访问到四字节的地址数,从而将变量a的地址全部换为0。

 

        而char型指针在关联整型变量地址的过程中,指针解引用为0, 也只是改变了变量a地址的一个字节,其他三个字节不变。

        我讲解的这两个例子是为了展示指针的访问权限作用:

         指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。

         比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

 

b.指针类型意义2.指针的加减操作 

int main(){
        int n = 10;
		char* pn = (char*)&n;
		int* pm = &n;

		printf("%p\n", &n);
		printf("%p\n", pn);
		printf("%p\n", pn + 1);
		printf("-----\n");
		printf("%p\n", pm);
		printf("%p\n", pm + 1);
	
	return 0;
}

        上图代码中, 创建了两种类型的指针变量去接收同一个变量的地址,通过对两种指针变量+1,产生的结果也是不同。如下图

 

 

总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。 

            以上两种方式展现出来的就是指针类型的真正意义所在!

 


3.野指针

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

        野指针用来做比喻的话,其实可以看作一只脾气暴躁的狗,无人管教驯服所以很危险,若不靠近则相安无事,若进行接触或者挑逗它,它就会咬伤我们。

        而在C语言中,指针也好比是这样,若不加以初始化给其赋值,它就会产生错误的程序乱码。

int main()
		{
			int* p;
			*p = 10;//非法访问内存了,这里的p就是野指针
			return 0;
		}

        如图代码中指针p没有初始化,就意味着没有明确的指向。一个局部变量不初始化的化,放的是随机值(默认):0xcccccccc
        

        例如在指针作数组遍历访问时,也会遇到野指针的情况

#include <stdio.h>
int main()
{
    int arr[10] = {0};
    int *p = arr;
    int i = 0;
    for(i=0; i<=11; i++)
   {
        *(p++) = i;
   }
    return 0;
}

        如图,数组大小为10,但循环却经历了11次,那么第十一次的循环中 ,当指针指向的范围超出数组arr的范围时,p就是野指针。

 

         注意小贴士:数组允许越界,但不允许使用

 

例2.指针指向的空间已释放。


int* test()
		{
			int a = 10;
			return &a;
		}
		
		int main()
		{
			int*p = test();
			*p = 20;
			return 0;
		}

       这段代码的意思是: 从主函数开始后,通过调用test函数,将a的地址传给指针p,将p解引用后修改a的值。

        但我们知道函数中的局部变量一出函数就会被销毁,所以一调用完函数指针P指向的那块空间就已经没了,指针虽然还保留着那块空间的地址,但已经不属于它了,要是继续访问就是非法的,从而指针P就成了野指针。

 

 

4.如何规避野指针?

1.创建指针的同时就顺带初始化操作

int a=10;

int*p=&a;

若不知道将指针*p指向谁,就先设成空指针

int *p=NULL; 

2.小心指针越界情况,务必注意循环次数 。

3.指针使用前检查其有效性。

4.若指针空间被释放,将指针置成NULL。

                                                                                                                打完收工!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言指针详解(1) 的相关文章

  • C++之完美转发、移动语义(forward、move函数)

    完美转发 1 在函数模板中 xff0c 可以将 自己的参数 完美 地转发 给其它函数 所谓完美 xff0c 即 不仅能准确地转发参数的值 xff0c 还能保证被转发参数的左 右值属性不变 2 C 43 43 11标准引入了右值引用和移动语义
  • C++之异常处理

    异常 异常是面向对象语言 处理错误的一种方式 当一个函数出现自己无法处理的错误时 xff0c 可以抛出异常 xff0c 然后输的直接或者间接调用者处理这个错误 语法 捕获全部的异常 try 可能抛出异常的代码 throw异常对象 catch
  • C++之原子操作(atomic)

    原子操作 所谓原子操作是指不会被线程调度机制打断的操作 xff1b 这种操作一旦开始 xff0c 就一直运行到结束 xff0c 中间不会有任何 context switch xff08 切换到另一个线程 xff09 原子操作是不可分割的 x
  • C++之RAII机制

    RAIIResource acquisition is initialization的缩写 xff0c 意思是 资源获取即初始化 xff0c 其核心思想是利用C 43 43 对象生命周期的概念来控制程序的资源 它的技术原理很简单 xff0c
  • VsCode反应较慢(vscode卡顿,反应慢)

    简述 xff1a 这几天敲代码的时候发现vscode反应好慢 xff0c 有时候更改个样式 xff0c 也是同样 xff0c 然后就开始找原因 xff0c 之前开的代码自动保存 xff0c Git Autorefresh Files Aut
  • 【C++教学】第一课——头文件,全局命名空间,主函数的介绍

    头文件 初学者肯定疑惑为什么每次打代码都要写一个所谓的头文件 xff08 如 xff1a iostream xff09 xff0c 因为你所用的 cout gt gt 34 hello world 34 就是这个 是在iostream里的东
  • JavaWeb02(js基本语法&表单提交方式)

    一 xff0c js基本语法 1 jsp是什么 xff1f 实际上jsp就是Servlet xff0c 是一种可以用来开发web资源的技术 2 jsp运行原理 xff1f jsp文件先翻译成 java xff0c 在将其编译成 class
  • JavaWeb(分页)

    1 分页显示的步骤 xff1a xff08 1 xff09 确定每页显示的数据量 xff08 2 xff09 计算显示的页码 xff08 3 xff09 编写SQL语句 当数据多起来的时候 xff0c 记得需要一个容器将它包装起来 xff0
  • HTTP代理

    HTTP代理 xff08 HTTP Proxy xff09 是一种在网络中经常使用的技术 xff0c 允许客户端计算机通过指定的代理服务器来进行HTTP请求 在本文中 xff0c 我将介绍HTTP代理的基本原理 实现方法以及相关的应用和安全
  • LayUI项目之我的会议(送审以及排座)

    目录 一 xff0c 会议排座 1 前台编码 调试后的jsp代码 2 后台编码 1 图片工具类 2 js代码 3 SQL语句编写 4 子控制器 5 dao方法 三 图片处理 图片处理类 前台代码 后台接收 三 xff0c 会议送审 1 前台
  • Docker-宿主机与容器之间的文件拷贝

    目录 一 xff0c Docker运行MySQL容器 二 xff0c 数据卷 三 xff0c 数据卷容器 四 xff0c Dockerfile制作增强版 五 xff0c Docker制作自定义Tomcat 一 xff0c Docker运行M
  • 小程序框架

    目录 一 xff0c 框架 二 xff0c 响应的数据绑定 三 xff0c 页面管理 四 xff0c 基础组件 逻辑层 App Service 五 xff0c 小程序的生命周期 六 xff0c 注册页面 1 使用 Page 构造器注册页面
  • 小程序后台数据交互-个人中心

    目录 一 xff0c 获取用户昵称和头像 登录过程 二 xff0c 登录 小程序 三 xff0c 后台 小程序服器配置 一 xff0c 获取用户昵称和头像 登录过程 小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身
  • 微服务框架及多模块开发

    目录 一 xff0c 项目模式 二 xff0c 项目架构图 三 xff0c 案例演示 主模块 公共子模块 子模块 添加页面公共资源 一 xff0c 项目模式 电商模式 xff1a 市面上有5种常见的电商模式 xff0c B2B B2C C2
  • Mybatis与微服务注册

    目录 一 xff0c Springboot整合MybatisPlus 创建商品微服务子模块 二 xff0c SpringBoot整合Freeamarker 三 SpringBoot整合微服务 amp gateway amp nginx 整合
  • 服务调用&分布式session

    目录 一 xff0c Nginx动静分离 二 xff0c 服务调用 创建配置zmall cart购物车模块 创建配置zmall order订单模块 服务调用 四 xff0c spring session实战 什么是Spring Sessio
  • C语言调试技巧(以vs编译器为例)

    实用调试技巧 什么是bug调试是什么 xff0c 调试有何重要调试是什么 xff1f 调试的基本步骤Debug和Release的介绍 Windows环境调试介绍调试快捷键调试的时候查看程序当前信息查看临时变量的值查看内存信息查看调用堆栈查看

随机推荐

  • (十三)STM32——串口通信(UART)

    目录 学习目标 内容 通信方法 并行通信 串行通信 通信方向 通信方式 UART 特点 串口参数 通信流程 寄存器 USART SR USART DR USART BRR 过程 代码 运行结果 运行结果 遇到的问题 总结 学习目标 本节我们
  • 关于VINS-MONO与VIO轨迹漂移问题定位的一些方向

    整个VINS MONO系统 xff0c 较容易在系统静止或外力给予较大冲击时产生轨迹漂移 xff0c 原因是imu的bias在预积分中持续发散 xff0c 视觉重投影误差产生的约束失效 如静止 xff0c 先验约束可能会在LM的线性求解器中
  • 爬虫的基本原理

    爬虫是一种自动化程序 xff0c 可以模拟人类在互联网上的行为 xff0c 从而获取网页上的信息 爬虫技术在互联网上的应用非常广泛 xff0c 例如搜索引擎 数据挖掘 网络爬虫等等 本文将从爬虫的基本原理 爬虫的分类 爬虫的应用 爬虫的优化
  • 通信接口五种主要的类型是什么?RS-232、485、CAN、USB

    笔者电子信息专业硕士毕业 xff0c 获得过多次电子设计大赛 大学生智能车 数学建模国奖 xff0c 现就职于南京某半导体芯片公司 xff0c 从事硬件研发 xff0c 电路设计研究 对于学电子的小伙伴 xff0c 深知入门的不易 xff0
  • 关于机器人状态估计/VIO/VSLAM中能观性/可观性/FEJ的一些直接解释

    知识来源是高翔博士与贺一家老师的VIO课程 xff0c 以及Barfoot教授的机器人学中的状态估计 可观性问题会直接带来多传感器融合融态中的关键手段 xff1a FEJ First Estimated Jacobian 即不同残差对同一状
  • 关于电子与电气自动化芯片侧的一些基础理解

    EEE Electrical and Electronics Engineering 电子与电气自动化工程 人类科技母行业 涉及的主要领域 xff1a 半导体元器件 芯片 xff0c 模组 PCBA xff0c 嵌入式系统 xff08 驱动
  • BA(后端)优化与卡尔曼滤波的一些区别

    今天这篇文章会写得深入一些 xff0c 主要知识来自于业内多位大佬的实际落地与自身的思考 主要涉及机器人状态估计与机器视觉 xff0c 多传感器结合时 xff0c BA优化与卡尔曼滤波的差异及如何选择 机器人状态估计中 xff0c 大家应该
  • 关于VIO零速更新(ZUPT)与控制三种约束的工程实践

    今天这篇是深度稍微高一些的 xff0c 尽量写细 xff0c 但是具体实践各家都有不同的方式与工程习惯 xff0c 就不多赘述了 小组工作比较忙 xff0c 代码还没来得及整理 xff0c 总体更新一下基础知识 VIO系统后端核心的三种约束
  • 关于DSO直接法与IMU预积分联合VIO/SLAM一些思路

    本文不适合初学者 xff1b 干货多没写具体方法 xff0c 目前还在数论分解和思考中 xff0c 估计得2个月后完成 必要性 xff1a 1 常规VIO系统如VINS MONO建立的地图质量太差 xff0c 稀疏且不便认知 2 假设并入D
  • 主流VIO/VSLAM系统改造与工程化落地

    今天主要写针对主流VIO和VSLAM如VINS MONO和DSO的工程改造思路 肯定是有相当价值的 xff0c 总体写得比较简单 xff0c 需要具备软件 硬件 算法等各方面综合能力才能掌握主要路径 xff0c 具体实现方面以后由其他同事来
  • VIO与全局快门及轮速计的一些应用小技巧

    封面就用一个可爱的小车车 之前各种针对VIO xff0c VSLAM和VINS的工程注意事项都讲过了 今天的内容主要是针对VSLAM xff0c VIO的实用性 比如Td xff0c 同步对时 xff0c 内参 xff0c 外参这一串 最近
  • 关于机器人状态估计(12)-VIO/VSLAM的稀疏与稠密

    VIO三相性与世界观室内ALL IN ONE 首先以此链接先对近期工作的视频做个正经的引流 xff0c 完成得这么好的效果 xff0c 仅仅是因为知乎限流1分钟以内的视频 xff0c 导致整个浏览量不到300 xff0c 让人非常不爽 这套
  • 关于机器人状态估计(13)-线性代数有多重要?18.06总结

    太久没更新主要是在忙开发和测试 xff0c 这几个月被很多同学提问 xff0c 同时接触了一些实习生 普遍发现动手能力不错 xff0c 数学基础却差异很大 从我身边电子 xff0c CV或者SLAM做得比较杰出的朋友来看 xff0c 大家普
  • postman的安装与使用

    目录 第一部分 xff1a 基础篇postman1 安装postman进入postman官网 如果是mac系统可以直接点击mac app安装 第二部分 xff1a 进阶篇1 使用自带的脚本对接口进行测试 第一部分 xff1a 基础篇 pos
  • DMA案例 外设到内存搬运

    DMA案例 外设到内存搬运 需求 使用DMA的方式将串口接收缓存寄存器的值搬运到内存中 xff0c 同时闪烁LED1 CubeMX配置 串口配置 DMA配置 串口中断配置 用到的库函数 HAL UART ENABLE span class
  • 用rs_lidar雷达跑lio_sam

    1 准备工作 imu绑定串口有线连接雷达并能用rviz显示雷达点云用两个imu标定包标定imu在完成第二步必要的工作后 xff0c 配置LIO SAM config 下的params yaml参数 xff0c 更改之前建议备份在旁边复制粘贴
  • ubuntu18.04安装ros及解决rosdep update失败问题

    1 安装ros 转自 https blog csdn net qq 44830040 article details 106049992 ops request misc 61 257B 2522request 255Fid 2522 25
  • 球机是枪机和云台机的结合体

    1 枪机是监控类CCD摄像机中一种 枪机外观长方体 xff0c 前面是C CS镜头接口 xff0c 枪机不包含镜头 所谓的枪机主要从外型 镜头安装接口上区分 2 监控类摄像机主要有 xff1a 枪机 小半球 大半球 一体机 球机几个类别 枪
  • ROS学习笔记-1

    一 ROS简介 ROS全称Robot Operating System 机器人操作系统 ROS是适用于机器人的开源元操作系统 ROS集成了大量的工具 xff0c 库 xff0c 协议 xff0c 提供类似OS所提供的功能 xff0c 简化对
  • C语言指针详解(1)

    指针详解 之前我说过一篇关于指针在C语言中的基本使用 xff0c 这次我再来细讲一下指针的其他内容 目录 一 指针详解 1 指针定义 2 指针类型 3 野指针 4 如何规避野指针 xff1f 1 指针定义 指针理解的2个要点 xff1a 1