c语言初阶指针

目录

何为指针

地址大小

野指针

成因 

 如何规避

 有效性

指针计算

+-整数

​编辑

 指针比较运算

指针-指针

​编辑 数组与指针关系

二级指针

指针数组

应用 


何为指针

指针就是指针变量,用来存放内存空间的一个编号,将指针比作我们宾馆的客人,内存空间就是一个个的房间,每一个指针变量对应一个地址空间。

int a = 0;
int *pa = &a;

 pa记录了a的地址int除了代表指向数据的类型,还可以表示访问字节的能力

内存单元的单位是字节,而每个内存单元都有自己唯一的编号,而指针指向的是首元素第一个字节的地址,当我们 对指针进行加减操作时,也是按照数据所占的字节数来向前向后偏移的。

也就是说char类型指针加一跳过一个字节,int类型指针加一跳过四个字节.......

地址大小

x86

x64 

野指针

定义:指向未定义的空间(随机的、不正确、没有明确限制的

成因 

1.指针未初始化 

	int* p;//p就是野指针*p = 20;

2.越界访问

	int arr[10] = {0};int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;for (i = 0; i <= sz; i++){*p = i;p++;}

对数组越界访问未初始化的空间,出现了野指针。 

3.指向空间释放

int* test()
{int num = 100;return &num;
}int main()
{int* p = test();*p = 200;return 0;
}

函数销毁后通过指针接收归还给内存空间的地址,并对其进行修改,这也是一种典型的野指针。

 如何规避

  • 指针初始化(可初始化为NULL)
  • 小心指针越界
  • 指向空间释放(free)时,及时置NULL
  • 避免返回局部变量(栈空间)的地址
  • 指针使用前检查有效性

 有效性

	int* p = NULL;if (p != NULL)//不为空再使用{printf("%d\n", *p);}

指针计算

+-整数

指针接收一个数组实际接收的是它首元素的地址,数组名等价于首元素地址,

指针接收一个数组实际接收的是它首元素的地址,数组名等价于首元素地址,通过+-整数来实现向前向后的一个偏移,偏移量为该类型所占内存大小。

 指针比较运算

    #define N_VALUES 5   float arr[N_VALUES];float* vp;for (vp = arr; vp < &arr[N_VALUES];)//从前往后{*vp++ = 0;//++优先级高}

修改(不推荐): 

#define N_VALUES 5   
float arr[N_VALUES];
float* vp;
for (vp = &arr[N_VALUES-1]; vp >= &arr[N_VALUES];vp--)//从后往前{*vp = 0;}

第一种方案是与数组后面的指针进行比较,然后依次赋值,第二种方案是从后往前比较,在完成首元素赋值后对前一个地址进行比较不符合条件退出循环。

 

规定:允许指向数组元素的指针与指向数组最后一个元素后面的内存空间比较大小,不允许与指向数组首元素前的内存空间比较。所以前者是规范写法。

指针-指针

两个指针的相减不是简单的内存编号相减,而是指向同一块连续空间同类型指针(地址)相减,所得结果为二者相差的元素个数(偏移量)

我们可以在模拟实现strlen函数的时候利用这点得到字符的个数: 

 数组与指针关系

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);/*for (i = 0; i < sz; i++){printf("%d ", *p);p++;}*/for (i = 0; i < sz; i++){printf("%d ", *(p + i));}return 0;
}

        观察上面的代码,发现数组和指针就是一个模子刻出来的一样,实际上它们是有区别的。

        不同:数组是一块连续的空间,用于存放各种数据,它的大小取决于元素个数,而指针是一个变量,用于存放地址,大小为4\8字节。

        联系:数组名是地址(指针),数组把首元素地址交给指针后,可以用指针来管理数组。

二级指针

和一级指针一样,二级指针也是用于存放地址,它存放的是一级指针的地址。 

 

蓝色圆圈代表指针存放地址的那个变量的数据类型,*p代表了指针。如果想通过它访问a的值,只需进行两次解引用即可。

指针数组

顾名思义,存放指针的数组就叫做指针数组。

int* arr3[5];//存放整型指针的数组
char* arr4[6];//存放字符指针的数组

应用 

 我们可以用多个一维数组模拟二维数组来使用指针数组。

这里我们成功模拟出了二维数组,但它和实际的二维数组还是有些差别,比如二维数组是连续的空间,而指针数组的每个元素是不连续的,但毕竟是模拟,目的是为了了解指针数组的具体功能。

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

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

相关文章

前端 JS 经典:上传文件

重点&#xff1a;multipart/form-data 后端识别上传类型必填 1. form 表单上传 <!-- enctype"multipart/form-data" 这个必填 --> <form action"http://127.0.0.1:8080/users/avatar" method"post" enctype"multipart/form-data…

软件工程课件

软件工程 考点概述软件工程概述能力成度模型能力成熟度模型集成软件过程模型逆向工程![ ](https://img-blog.csdnimg.cn/425cea8190fb4c5ab2bf7be5e2ad990e.png) 考点概述 重点章节 软件工程概述 之前老版教程的&#xff0c;之前考过 能力成度模型 记忆 能力等级 和 特点 能力…

最强的AI视频去码图片修复模型:CodeFormer

目录 1 CodeFormer介绍 1.1 CodeFormer解决的问题 1.2 人脸复原的挑战 1.3 方法动机 1.4 模型实现 1.5 实验结果 2 CodeFormer部署与运行 2.1 conda环境安装 2.2 运行环境构建 2.3 模型下载 2.4 运行 2.4.1 人脸复原 ​编辑​编辑 2.4.2 全图片增强 2.4.3 人脸颜色…

linux-进程-execl族函数

exec函数的作用&#xff1a; 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时&#xff0c;该进程被完全替换为新程序。因为调用exec函数并不创建新进程&#xff0c;所以前后进程的ID并没有改变。 简单来说就是&…

ESP32用作经典蓝牙串口透传模块与手机进行串口通信

ESP32用作经典蓝牙串口透传模块与手机进行串口通信 简介ESP32开发板Arduino程序手机与ESP32开发板进行蓝牙串口透传通信总结 简介 ESP32-WROOM-32模组集成了双模蓝牙包括传统蓝牙&#xff08;BR/EDR&#xff09;、低功耗蓝牙&#xff08;BLE&#xff09;和 Wi-Fi&#xff0c;具…

使用Caffeine实现帖子的缓存来优化网站的运行速度

导入依赖 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version>…

stride与padding对输出尺寸的计算

公式&#xff1a; 练习&#xff1a; 图1&#xff1a; input4&#xff0c;filter3&#xff0c;padding0&#xff0c;stride1 output2 图2&#xff1a; input5&#xff0c;filter3&#xff0c;padding0&#xff0c;stride2 output2 图3&#xff1a; input6&#xff0c;filter3&am…

二、创建个人首页页面

简介 改造 App.vue 创建一个展示页面,实现一个可以轮播的功能效果。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:style.css、App.vue、assets 一、 自定义全局样式 将 style.css 中的文件样式内容替换为如下代码 /* 初始化样式 --------------------------…

Postern配置HTTP和HTTPS的步骤

Postern是一款强大的Android代理工具&#xff0c;它允许您在设备上配置全局代理来实现安全、隐私保护和自由上网。本文将详细介绍如何使用Postern在Android设备上配置HTTP和HTTPS代理&#xff0c;为您提供更便捷的上网体验。 步骤1&#xff1a;下载和安装Postern应用 首先&am…

原生Js Canvas去除视频绿幕背景

Js去除视频背景 注&#xff1a; 这里的去除视频背景并不是对视频文件进行操作去除背景 如果需要对视频扣除背景并导出可以使用ffmpeg等库&#xff0c;这里仅作播放用所以采用这种方法 由于uniapp中的canvas经过封装&#xff0c;且 uniapp 的 drawImage 无法绘制视频帧画面&…

《基于区块链的数据资产评估实施指南》技术研讨会成功召开

2023年9月1日&#xff0c;《基于区块链的数据资产评估实施指南》&#xff08;以下简称《指南》&#xff09;技术研讨会在深圳召开&#xff0c;竹云科技作为主要参编单位出席此次研讨会。 中国科协决策咨询首席专家王春晖&#xff0c;中国社会科学院博士于小丽&#xff0c;中国…

无swing,高级javaSE毕业之贪吃蛇游戏(含模块构建,多线程监听服务)

JavaSE&#xff0c;无框架实现贪吃蛇 文章目录 JavaSE&#xff0c;无框架实现贪吃蛇1.整体思考2.可能的难点思考2.1 如何表示游戏界面2.2 如何渲染游戏界面2.3 如何让游戏动起来2.4 蛇如何移动 3.流程图制作4.模块划分5.模块完善5.0常量优化5.1监听键盘服务i.输入存储ii.键盘监…

Lumion 和 Enscape 应该选择怎样的笔记本电脑?

Lumion 和 Enscape实时渲染对配置要求高&#xff0c;本地配置不够&#xff0c;如何快速解决&#xff1a; 本地普通电脑可一键申请高性能工作站&#xff0c;资产安全保障&#xff0c;供软件中心&#xff0c;各种软件插件一键获取&#xff0c;且即开即用&#xff0c;使用灵活&am…

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测(风电功率预测)

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测&#xff08;风电功率预测&#xff09; 目录 时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测&#xff08;风电功率预测&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1…

知识蒸馏学习

知识蒸馏----教师和学生模型&#xff1a;将已训练完善的模型作为教师模型&#xff0c;通过控制“温度”从模型的输出结果中“蒸馏”出“知识”用于学生模型的训练&#xff0c;并希望轻量级的学生模型能够学到教师模型的“知识”&#xff0c;达到和教师模型相同的表现。 本质上属…

无需公网IP,实现外网远程访问管家婆ERP进销存系统的方法

文章目录 前言 1.管家婆服务2. 内网穿透2.1 安装cpolar内网穿透2.2 设置远程访问 3. 固定访问地址4. 配置固定公网访问地址 前言 管家婆辉煌系列产品是中小企业进销存、财务管理一体化的典范软件&#xff0c;历经十余年市场的洗礼&#xff0c;深受广大中小企业的欢迎&#xff…

【2023高教社杯数学建模国赛】ABCD题 问题分析、模型建立、参考文献及实现代码

【2023高教社杯数学建模国赛】ABCD题 问题分析、模型建立、参考文献及实现代码 1 比赛时间 北京时间&#xff1a;2023年9月7日 18:00-2023年9月10日20:00 2 思路内容 可以参考我提供的历史竞赛信息内容&#xff0c;最新更新我会发布在博客和知乎上&#xff0c;请关注我获得最…

1、Flutter移动端App实战教程【环境配置、模拟器配置】

一、概述 Flutter是Google用以帮助开发者在IOS和Android 两个平台开发高质量原生UI的移动SDK&#xff0c;一份代码可以同时生成IOS和Android两个高性能、高保真的应用程序。 二、渲染机制 之所以说Flutter能够达到可以媲美甚至超越原生的体验&#xff0c;主要在于其拥有高性…

GeoNet: Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose 论文阅读

论文信息 题目&#xff1a;GeoNet: Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose 作者&#xff1a;Zhichao Yin and Jianping Shi 来源&#xff1a;CVPR 时间&#xff1a;2018 Abstract 我们提出了 GeoNet&#xff0c;这是一种联合无监督学习框架&a…

WebGIS外包开发流程

WebGIS开发流程需要综合考虑前端和后端开发、地理信息数据处理、用户需求和安全性等多个方面。成功的WebGIS应用程序需要不断地进行更新和维护&#xff0c;以适应变化的需求和技术。WebGIS开发是一个复杂的过程&#xff0c;通常包括以下主要步骤。北京木奇移动技术有限公司&…