Linux C语言:指针和指针变量
一、指针的作用
- 使程序简洁、紧凑、高效
- 有效地表示复杂的数据结构
- 动态分配内存
- 能直接访问硬件
- 能够方便的处理字符串
- 得到多于一个的函数返回值
二、内存、地址和变量
1、内存地址
2、变量和地址
1)变量用来在程序中保存数据
比如: int k = 58; //声明一个int变量k,CPU为k分配4个字节,
可以存储数值58
2)关于变量
- 输入变量的值
- 打印变量的地址
- 打印变量占用的内存空间
三、指针
- 指针变量一般形式如下:
<数据类型> * <指针变量名> ;
char * p ;
1. *,指针运算符,表示定义的是一个指针类型的变量
2. 数据类型,指针变量要保存地址,数据类型要和这个地址中保存的数据的数据类型保持一致。
1、指针的初始化
指针在说明的同时, 也可以被赋予初值,称为指针的初始化
一般形式:
<数据类型> *<指针变量名> = <地址量> ;
int main() {
int a = 10; //在内存中开辟一块内存空间
int *p =&a; //使用&(取地址操作符),取出变量a的起始地址
//a变量占4个字节,将a的第一个字节的地址放在p
变量中,p就是一个指针变量
}
2、指针和变量
四、指针的目标和“解引用”
1、指针的目标
- 指针指向的内存区域中的数据称为指针的目标
int a = 126; int *p = &a;
2、指针的解引用
3、关于指针的三种写法
设p为一个指针,则:
- p — 指针变量, 它的内容是地址量
- *p — 指针的目标,它的内容是数据
- &p — 指针变量占用的存储区域的地址,是个常量
五、指针的赋值
- 指针的赋值运算指的是通过赋值运算符向指针变量送一个地址值
- 向一个指针变量赋值时,送的值必须是地址常量或指针变量,不能是普通的整数(除了赋零以外)
- 指针赋值运算常见的有以下几种形式:
① 把一个普通变量的地址赋给一个具有相同数据类型的指针
double x=15, *px;
px=&x;
② 把一个已有地址值的指针变量赋给具有相同数据类型的另一个指针变量
float a, *px, *py;
px = &a;
py = px;
③ 把一个数组的地址赋给具有相同数据类型的指针。
int a[20], *pa;
pa = a; //等价 pa = &a[0]
六、指针的大小
对于32位的系统,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平和低电平。那么32根地址线产生的地址就是32个(1或者0)
总结:
- 32位的系统,地址是32个0或者1组成二进制序列,地址需要4个字节的空间来存储,一个指针变量的大小就是4个字节。
- 64位系统,有64个地址线,一个指针变量的大小就是8个字节
- uname -m命令,查看系统是多少位
七、空指针
- 不同于没有初始化的指针
- 在C语言中,NULL本质是0
#define NULL (void *)0 // 在C中NULL是强制类型转换为void *的0
- 为什么指向0地址处?2个原因。
① 指针如果没有给定初始值,值是不确定的
② 0地址是一个特殊地址,在一般的操作系统中都是不可被访问的,如果C语言程序员不按规矩(不检查是否等于NULL就去解引用)写代码直接去解引用就会触发段错误
八、野指针及成因
1、什么是野指针
- 指针指向的位置是不可知的(随机的、不正确的、没有明确指向的)
- 指向被释放的内存或者没有访问权限的内存的指针(非法访问)。
2、野指针是怎么造成的
- 野指针的错误来源就是指针定义了以后没有初始化,也没有赋值(总之就是指针没有明确的指向一个可用的内存空间),然后去解引用。
① 指针没有初始化
② 指针越界访问
③ 指针指向的空间释放了
3、野指针的危害
- 野指针指向别的变量(指针所指向的那个变量)的地址
- 即指向了一个地址是不确定的变量,去解引用,结果是不可知的。
① 段错误
指向不可访问(操作系统不允许访问的敏感地址,譬如内核空间)的地址,结果是触发段错误
② 程序错误被掩盖
指向一个可用的、而且没什么特别意义的空间(譬如我们曾经使用过但是已经不用的空间),这时候程序运行不会出错,也不会对当前程序造成损害这种情况下会掩盖你的程序错误,让你以为程序没问题,其实问题是非常严重的
③ 程序出现离奇错误
指向了一个可用的空间,而且这个空间其实在程序中正在被使用(譬如说是程序的一个变量x),那么野指针的解引用就会刚好修改这个变量x的值,导致这个变量莫名其妙的被改变,程序出现离奇的错误。一般最终都会导致程序崩溃,或者数据被损害。
4、如何避免野指针
野指针的错误来源就是指针定义了以后没有初始化,也没有赋值(总之就是指针没有明确的指向一个可用的内存空间),然后去解引用。
① 定义指针时,同时初始化为NULL
② 在指针使用之前,将其赋值绑定给一个可用地址空间
③ 在指针解引用之前,先去判断这个指针是不是NULL
④ 小心指针越界
⑤ 指针使用完之后,将其赋值为NULL
⑥ 避免返回局部变量的地址
int a = 10;
int *p = &a;
int *q = NULL;
if (a > 0){
int b = 20;
q = &b;
a += *q;
}
(*q)++;
*p = *q;
相关文章:

Linux C语言:指针和指针变量
一、指针的作用 使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存能直接访问硬件能够方便的处理字符串得到多于一个的函数返回值 二、内存、地址和变量 1、内存地址 2、变量和地址 1)变量用来在程序中保存数据 比如: int k 58; //声明一个int变…...

Llama模型家族之Stanford NLP ReFT源代码探索 (二)Intervention Layers层
LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...
MATLAB神经网络---序列输入层sequenceInputLayer
序列输入层sequenceInputLayer 描述一: sequenceinputlayer是Matlab深度学习工具箱中的一个层,用于处理序列数据输入。它可以将输入数据转换为序列格式,并将其传递给下一层进行处理。该层通常用于处理文本、语音、时间序列等类型的数据。在使用该层时&…...

使用CSS、JavaScript、jQuery三种方式实现手风琴效果
手风琴效果有不少,王者荣耀官网(源网址 https://pvp.qq.com/raiders/ )有一处周免英雄,使用的就是手风琴效果,如图所示。 我试着用css、js、jQuery三种方式实现了这种效果,最终效果差不多,美中不…...

什么是无头浏览器以及其工作原理?
如果您对这个概念还不熟悉,那么使用无头网络浏览器的想法可能会让您感到不知所措。无头浏览器本质上与您熟悉的网络浏览器相同,但有一个关键区别:它们没有图形用户界面 (GUI)。这意味着没有按钮、选项卡、地址栏或视觉显示。 相反,…...

计算机网络 —— 应用层(DNS域名系统)
计算机网络 —— 应用层(DNS域名系统) 什么是DNS域名的层次结构域名分类 域名服务器的分类域名解析方式递归查询(Recursive Query)迭代查询(Iterative Query)域名的高速缓存 我们今天来看DNS域名系统 什么…...

Linux--MQTT简介
一、简介 MQTT ( Message Queuing Telemetry Transport,消息队列遥测传输), 是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。 与 HTTP 协议一样, MQTT 协议也是应用层协议,工作在 TCP/IP 四…...

VMware Workerstation开启虚拟机后,产生乱码名称日志文件
问题情况 如下图所示,我的虚拟机版本是16.1.2版本,每次在启动虚拟机之后,D盘目录下都会产生一个如图下所示的乱码名称文件。同时,虚拟机文件目录也是杂乱不堪,没有按照一台虚拟机对应一个文件夹的形式存在。 问题处理…...

Unity射击游戏开发教程:(27)创建带有百分比的状态栏
创建带有弹药数和推进器百分比的状态栏 在本文中,我将介绍如何创建带有分数和百分比文本的常规状态栏。 由于 Ammo Bar 将成为 UI 的一部分,因此我们需要向 Canvas 添加一个空的 GameObject 并将其重命名为 AmmoBar。我们需要一个文本和两个图像对象,它们是 AmmoBar 的父级。…...
Linux内存从0到1学习笔记(8.16 SMMU详解)---更新中
写在前面 前面博客已经了解过。SMMU是IOMMU在ARM架构上的实现。主要为了解决虚拟化环境中,GuestOS无法直接将连续的物理地址分配给硬件的问题。对于Hypervisor/GuestOS的虚拟化系统来说,所有的VM都运行在Hypervisor上,每一个VM独立运行一个O…...
标准盒模型和怪异盒模型的区别
CSS盒模型: 内容区(content)内边距(padding)边框(border)外边距(margin) 分为标准盒模型和IE盒模型/怪异盒模型 为了正确设置元素在所有浏览器中的宽度和高度…...
【第8章】如何利用ControlNet生成“可控画面”?(配置要求/一键安装/快速上手/生成第一张图)ComfyUI基础入门教程
这节我们来讲AI绘画领域中一个很重要的概念:ControlNet,看下如何让生成的画面更可控。 🎅什么是ControlNet? Stable Diffusion中的ControlNet是一种神经网络结构,它允许将额外的条件输入添加到预训练的图像扩散模型中,通过这种方式,ControlNet可以控制图像生成过程,…...

[qt] qt程序打包以及docker镜像打包
目录 一 环境准备: 1.1 qt环境 1.2 linuxdeplouqt打包工具 二 qt包发布: 2.1 搜索链接库 2.2 应用程序APP打包 2.3 发布 三 docker镜像包发布 3.1 环境准备 3.2 镜像生产脚本 3.3 加载镜像并运行docker容器 四 补充 4.1 时间不同步问题解决 一 环境准备: qt环境l…...

电脑屏幕监控软件有哪些?2025年监控软件排行榜
电脑屏幕监控软件有哪些?2025年监控软件排行榜 虽然现在还是2024年,但是有一些被广泛讨论和推荐的电脑屏幕监控软件,它们将在2025年异军突起,成为行业的引领者。 1.安企神软件: 功能全面的电脑屏幕监控软件…...
音视频主要概念
文章目录 常用的一些概念主要概念1主要概念2I帧P帧B帧 常用视频压缩算法 小结 常用的一些概念 主要概念1 视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数…...
AIGC全面介绍
AIGC(Artificial Intelligence and General Competitions)是一个专注于人工智能和综合能力竞赛的组织。AIGC的目标是促进人工智能和综合能力的发展,并为相关领域的学术研究和应用创新提供支持和平台。 AIGC主要致力于人工智能竞赛的组织、举…...

vscode中模糊搜索和替换
文章目录 调出搜索(快捷键)使用正则(快捷键)替换(快捷键)案例假设给定文本如下目标1:查找所有函数名目标2:替换所有函数名为hello目标3:给url增加查询字符串参数 调出搜索…...

人工智能入门学习教程分享
目录 1.首先安装python,官网地址:Download Python | Python.org,进入网址,点击Windows链接 2.下载完成之后,进行傻瓜式安装,如果不选安装路径,默认会安装到C:\Users\Administrator\AppData\Local\Programs\Python\Python38目录下。 3.配置python环境变量,即把python的…...

Django序列化器详解:普通序列化器与模型序列化器的选择与运用
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...

Commons-io工具包与Hutool工具包
Commons-io Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包 作用:提高I0流的开发效率。 FileUtils类(文件/文件夹相关) static void copyFile(File srcFile,File destFile) 复制文件 static void copyDirectory(File srcDir,File destDir) 复…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...