C语言学习笔记之指针(一)
目录
什么是指针?
指针和指针类型
指针的类型
指针类型的意义
指针+-整数
指针的解引用
指针 - 指针
指针的关系运算
野指针
什么是野指针?
野指针的成因
如何规避野指针?
二级指针
什么是指针?
在介绍指针之前,我们需要先对内存与地址有一个认识。
内存:内存是计算机重要且珍贵的硬件资源,计算机上所有的程序的都是运行在内存中的。为了能够合理有效的使用内存,就把内存划分为一个个小的内存单元。
那么这个内存单元应该多大呢?
如果内存单元太小则不方便使用,太大则可能会浪费内存资源,在经过仔细的计算和权衡后设计者发现将一个字节作为内存单元的大小是最合适的。
划分好内存后,如何有效的访问到每个内存单元呢?
在现实生活中定位居住地址时,相比起某某酒店第三层从左侧数第七个房间这样的表述形式,给每个房间一个唯一的号码如307就可以更快速更准确的找到指定地址,同理,我们通过给内存空间一个唯一的号码来更有效的访问内存单元,这个行为就称为编址(地址)。
那么应该如何编址,以及每个地址对应多大的空间?
众所周知,计算机只能识别0,1这样的二进制数。对于32位的计算机而言一共有32根地址线(物理电线),每根地址线可以产生两种电信号:高电平和低电平。两种电信号分别对应二进制的0和1,32根地址线一共可以产生2^32种电信号,如下:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
...
11111111 11111111 11111111 11111111经过仔细的计算和权衡后我们发现一个字节(一个内存单元)给一个号码是比较合适的,这些号码就被称为内存单元的地址。每一个地址可以维护一个内存单元,2^32个地址就可以维护2^32个内存单元(4GB),因此对于32位的机器而言,最大可以维护4GB的内存空间,同理可得64位机器最大可以维护2^64个字节的内存空间。
什么是指针?
指针是内存中一个最小单元的编号,即指针实际上就是地址。而我们平时口语中所说的指针,通常指的是指针变量,是用来存放内存地址的变量。

指针和指针类型
指针的定义和初始化:

指针的使用:

指针的应用场景:
1.有些时候我们无法直接使用变量名来操控想要控制的变量,从而使用指针来间接操控变量(传址调用)。


2.可以节省空间,提高运行效率。
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,就会会导致性能的下降,而指针大小只有4(32位)或8(64位)字节,因此在这种情景下传指针可以有效节省空间并提高运行效率。
指针的大小:
指针是用来存放地址的,在32位的机器上,地址是32个0或者1组成二进制序列,一个比特位(bit)可以存储一个二进制位,一个字节(byte)有8个比特位,因此需要4个字节才能存下地址,即指针变量的大小就应该是4个字节。同理可得在64位的机器上,指针变量的大小应该是8个字节。
指针的大小在32位平台是4个字节,在64位平台是8个字节。


指针的类型
众所周知,数值变量都是有类型的,如:char, int, float, double等,那么指针有类型吗?答案是有的。

指针类型的意义
众所周知,其他变量之所以有各种类型一是需要表示不同类型的数据如:整型,浮点型等,二是为了更合理的使用内存空间如:char,short,int等,而任何指针的大小都是4或8字节,那指针的类型有什么意义呢?难道仅仅是为了表示所指向的变量是什么类型?
指针的类型决定了指针的权限。
指针+-整数
指针的类型决定了指针 +n(-n)前进(后退)多大的距离(zieof(类型) * n)。


指针的解引用
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。


指针 - 指针
指针 - 指针的绝对值计算的是两个地址之间的元素个数。注:只有指向同一片空间且是同一类型的指针相减才有实际意义!

指针的关系运算
指针是可以进行关系运算的:

sp:
C语言标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

野指针
在有些场景下,我们并不会在创建指针后就立刻使用它,为了避免它成为一个野指针,我们需要将它初始化成 NULL(置空),NULL是一个为了避免未使用或不再使用的指针变量成为一个野指针而定义的宏。


什么是野指针?
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。通俗的讲,不知道明确指向的,指向非法空间的指针就是野指针。
野指针可能带来的危害:
1.指向不可访问的地址。危害:触发段错误。
2.指向一个可用的,但是没有明确意义的空间。危害:程序可以正确运行,但通常这种情况下,我们就会认为我们的程序是正确的没有问题的,然而事实上就是有问题存在,所以这样就掩盖了我们程序上的错误。
3.指向一个可用的,而且正在被使用的空间。危害:如果我们对这样一个指针进行解引用,对其所指向的空间内容进行了修改,但是实际上这块空间正在被使用,那么这个时候变量的内容突然被改变,当然就会对程序的运行产生影响,因为我们所使用的变量已经不是我们所想要使用的那个值了。通常这样的程序都会崩溃,或者数据被损坏。总而言之,野指针的危害极大!!!
野指针的成因
1.指针未初始化就直接使用

2.指针的越界访问

3.指针指向的空间已经释放


如何规避野指针?
1. 指针初始化。
2. 小心指针越界
3. 指针指向空间释放,及时置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

二级指针
众所周知,指针变量也是变量,而变量都是有地址的,所以指针变量也有地址。我们把指向普通类型(非指针类型)变量的指针变量称为一级指针,把指向一级指针的指针变量称为二级指针,即二级指针是用来存放一级指针的地址的。三级指针同理。


相关文章:
C语言学习笔记之指针(一)
目录 什么是指针? 指针和指针类型 指针的类型 指针类型的意义 指针-整数 指针的解引用 指针 - 指针 指针的关系运算 野指针 什么是野指针? 野指针的成因 如何规避野指针? 二级指针 什么是指针? 在介绍指针之前&#…...
化学中的不确定性。
化学中的不确定性TOC 基于元素分析的无机化学的理论大厦应该说早已落成了,但是却仍然存在着一些列的难解甚至是无解问题,这些大多是在使用理论解释现象时遇到的困难,有些则是在生产实践中生产工艺和生产工序设计和优化中发现的问题。于是&…...
AWS容器之Fargate
AWS Fargate是亚马逊提供的一种容器管理服务,它允许开发人员在AWS云中轻松运行容器化应用程序,而无需管理底层的服务器基础架构。Fargate可以自动管理容器的部署、扩展和负载平衡,并提供了与ECS和EKS等AWS容器服务集成的能力。适用于容器的无…...
C#面:DataReader与Dataset有什么区别
C#中的DataReader和DataSet都是用于处理数据的类,但它们有一些区别。 DataReader是一种轻量级的只进只读数据流,用于从数据库中检索数据。它是一种快速且高效的数据访问方式,适用于大量数据的读取。DataReader一次只能读取一行数据ÿ…...
操作系统课程实验1-进程调度模拟实验
操作系统课程实验1-进程调度模拟实验 一、实验介绍 1.1 实验目的 本实验模拟在单处理机环境下的处理机调度,帮助理解进程调度的概念,深入了解进程控制块的功能,以及进程的创建、撤销和进程各个状态间的转换过程。 1.2 实验内容 进程调度算…...
JVM CMS 在Full GC时针对跨代引用的优化
个人博客 JVM CMS 在Full GC时针对跨代引用的优化 | iwts’s blog 跨代引用问题 Full GC慢的一个很重要的问题:跨代引用。 简单描述就是: 现代JVM一般是根据对象存活的特性进行了分代,提高了垃圾收集的效率。但是像在回收新生代的时候&a…...
【Makefile】Makefile 编译 Keil 工程(Linux 环境)
本文使用的开发板为 stm32f103C8T6,使用的驱动库为stm32标准库。 目录 一、软件下载 1、stm32 标准库 2、arm-none-eabi 工具链 3、烧录器 二、Keil 工程改造 1、Keil 工程 2、基本 Makefile 工程 3、添加启动文件 4、添加链接脚本 5、去掉 core_cm3.c 三…...
Django的视图层——1HttpResponse对象详解
在django.http模块中定义了HttpResponse对象的APIHttpRequest对象由Django自动创建,HttpResponse对象由程序员创建在每一个视图函数中必须返回一个HttpResponse对象,当然也可以是HttpResponse子对象 1.不用模板,直接返回数据 from django.http import HttpRespons…...
企业活动想找媒体报道宣传怎样联系媒体?
在那遥远的公关江湖里,有一个传说,说的是一位勇士,手持鼠标和键盘,踏上了寻找媒体圣杯的征途。这位勇士,就是我们亲爱的市场部门小李,他的任务是为公司即将举行的一场盛大的企业活动找到媒体的聚光灯。 小李的故事,开始于一张空白的Excel表格,上面列着各大媒体的名称,旁边是一片…...
基于ChatGPT+RPA的融资融券业务担保资产风险评价
原载《会计之友》2024年第2期 作者简介 李闻一 男,湖北洪湖人,华中师范大学经济与工商管理学院教授、博士生导师,会计学科带头人,研究方向:财务共享、公司金融、风险管理 黄怡凡 女,湖北公安人…...
2. CSS选择器与伪类
2.1 基本选择器回顾 在开始介绍CSS3选择器之前,我们先回顾一下CSS的基本选择器。这些选择器是所有CSS开发的基础。 2.1.1 元素选择器 元素选择器用于选中指定类型的HTML元素。 /* 选中所有的<p>元素 */ p {color: blue; }2.1.2 类选择器 类选择器用于选中…...
tcpdump源码分析
进入tcpdump.c(函数入口)之前,先看一些头文件netdissect.h里定义了一个数据结构struct netdissect_options来描述tcdpump支持的所有参数动作,每一个参数有对应的flag, 在tcpdump 的main 里面, 会根据用户的传入的参数来…...
搭建Harbor镜像仓库
前言 1、系统版本:CentOS9 2、harbor版本:v2.9.4 3、提前安装好docker和docker-compose,参考地址。我这里安装的版本是docker:26.1.3 docker-compose:v2.27.1 安装步骤 下载安装包 1、下载地址:ha…...
【C/C++】Makefile文件的介绍与基本用法
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...
PHP生成二维码+二维码包含logo图片展示
composer require chillerlan/php-qrcode 用到的扩展自己安装(注:只生成二维码只要开gd扩展就行) 仅生成二维码看这个: use chillerlan\QRCode\QRCode;public function QRCode(){$qrcode new QRCode();$url "http://ww…...
vue项目打包教程
如果是用 vue-cli 创建的项目,则项目目录中没有 config 文件夹,所以我们需要自建一个配置文件;在vue项目目录下创建文件 vue.config.js,需注意文件名称必须是 vue.config.js,然后在文件中插入以下代码: 文件…...
制作电子画册速成攻略,快来试试
当今社会,数字媒体日益普及,电子画册作为一种崭新的展示方式,受到了越来越多人的青睐。它不仅形式新颖,互动性强,而且制作起来也并不复杂。想知道如何快速掌握制作电子画册的技巧吗?我来教你吧。 接下来&…...
【java程序设计期末复习】chapter7 内部类和异常类
内部类和异常类 内部类 ava支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。 注意 (1)内部类的类体中不可以声明类变量和类方法。 (2)外嵌类的类体中可以用内部类…...
Windows下安装配置深度学习环境
Windows下安装配置深度学习环境 1. 准备工作 1.1 环境准备 操作系统:win10 22H2 GPU:Nvidia GeForce RTX 3060 12G 1.2 安装Nvidia驱动、cuda、cuDNN 下载驱动需要注册并登录英伟达账号。我这里将下面用到的安装包放到了百度网盘,可以关注微信…...
如何使用ssh将vscode 连接到服务器上,手把手指导
一、背景 我们在开发时,经常是window上安装一个vscode编辑器,去连接一个虚拟机上的linux,这里常用的是SSH协议,了解其中的操作非常必要。 二、SSH协议 SSH(Secure Shell)是一种安全协议,用于…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
