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;

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

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

相关文章

jupyter notebook默认工作目录修改

jupyter notebook默认工作目录修改 1、问题2、如何修改jupyter notebook默认工作目录 1、问题 anaconda安装好之后&#xff0c;我们启动jupyter notebook会发现其默认工作目录是在C盘&#xff0c;将工作目录放在C盘会让C盘很快被撑爆&#xff0c;我们应该将jupyter notebook默…

QT系列教程(8) QT 布局学习

简介 Qt 中的布局有三种方式&#xff0c;水平布局&#xff0c;垂直布局&#xff0c;栅格布局。 通过ui设置布局 我们先创建一个窗口应用程序&#xff0c;程序名叫layout&#xff0c;基类选择QMainWindow。但我们不使用这个mainwindow&#xff0c;我们创建一个Qt应用程序类Log…

MYTED | TED100篇打卡总结 辅助学习网站使用说明

文章目录 &#x1f4da;背景&#x1f407;timeline&#x1f407;版本记录&#x1f407;产出小结 &#x1f4da;功能说明&#x1f407;左侧&#x1f407;中间&#x1f407;右侧 &#x1f4da;背景 &#x1f407;timeline 在一个平常的下午&#xff0c;一次平常的桌面整理&#…

Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明

Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明 目录 Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明 一、简单介绍 二、处理文本数据 三、用…

ts类型声明文件、内置声明文件

1. ts类型声明文件 在ts中以d.ts为后缀的文件就是类型声明文件&#xff0c;主要作用是为js模块提供类型信息支持&#xff0c;从而获得类型提示 1.1 第三方包用ts编写的&#xff0c;会自动生成一个 .d.ts文件&#xff0c;进行类型声明 1.2 有些包不是用ts编写的&#xff0c;在…

图的相关种类

目录 数据类型 存储结构 邻接矩阵表示法 无向图 邻接矩阵表示 有向图 网 实现 邻接矩阵表示 存储结构 创建无向图 优点 缺点 邻接表法表示 表示无向图 表示有向图 存储结构 无向网 特点 十字链表与多重表 十字链表 存储结构 多重表 存储结构 数据类型 存…

【Unity3D小功能】Unity3D中UGUI-Text实现打字机效果

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 需求要实现Text的打字机效果&#xff0c;一看居然…

关于stm32的复用和重映射问题

目录 需求IO口的复用和重映射使用复用复用加重映射 总结参考资料 需求 一开始使用stm32c8t6&#xff0c;想实现pwm输出&#xff0c;但是原电路固定在芯片的引脚PB10和PB11上&#xff0c;查看了下引脚的功能&#xff0c;需要使用到复用功能。让改引脚作为定时器PWM的输出IO口。…

golang 中的复合类型

前言 所有的api文档都可以使用bash命令 go doc 查看文档的帮助信息 从 Go 1.13 开始&#xff0c;godoc 不再随 Go 发行版一起安装&#xff0c;你需要单独安装它。 需要单独安装 1. go install golang.org/x/tools/cmd/godoclatest 2执行命令 godoc -http:1111 打开浏览器 http:…

开源代码分享(33)-基于储能电站服务的冷热电多微网系统双层优化配置

参考文献&#xff1a; [1]吴盛军,李群,刘建坤,等.基于储能电站服务的冷热电多微网系统双层优化配置[J].电网技术,2021,45(10):3822-3832.DOI:10.13335/j.1000-3673.pst.2020.1838. 1.基本原理 随着储能技术的进步和共享经济的发展&#xff0c;共享储能电 站服务模式将成为未来…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

&#x1f680;时空传送门 &#x1f50d;引言&#x1f4d5;GPT-4概述&#x1f339;机器学习在GPT-4中的应用&#x1f686;文本生成与摘要&#x1f388;文献综述与知识图谱构建&#x1f6b2;情感分析与文本分类&#x1f680;搜索引擎优化&#x1f4b4;智能客服与虚拟助手&#x1…

微信小程序 npm构建+vant-weaap安装

微信小程序&#xff1a;工具-npm构建 报错 解决&#xff1a; 1、新建miniprogram文件后&#xff0c;直接进入到miniprogram目录&#xff0c;再次执行下面两个命令&#xff0c;然后再构建npm成功 npm init -y npm install express&#xff08;Node js后端Express开发&#xff…

jenkins插件之Jdepend

JDepend插件是一个为构建生成JDepend报告的插件。 安装插件 JDepend Dashboard -->> 系统管理 -->> 插件管理 -->> Available plugins 搜索 Jdepend, 点击安装构建步骤新增执行shell #执行pdepend if docker exec phpfpm82 /tmp/composer/vendor/bin/pdepe…

用C语言实现扫雷

本篇适用于C语言初学者&#xff0c;主要涉及对于函数&#xff0c;数组&#xff0c;分支循环的运用。 目录 设计思想&#xff1a; 总代码&#xff08;改进后&#xff09;&#xff1a; 运行结果展示&#xff1a; 分布介绍&#xff1a; 声明&#xff1a; 代码主体部分&#…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮几何对象

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮对象 核心代码完整代码&#xff1a;在线示例 在研究 ArcGIS JSAPI RenderNode 高亮&#xff08;highlights&#xff09;FBO 的时候&#xff0c;实现了一下框选高亮几何对象&#xff0c;这里分享一下。 …

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:隧道和矿井绘图设备

RockMass 正在努力打入采矿业和隧道工程利基市场。 这家位于多伦多的初创公司正在利用 NVIDIA AI 开发一款绘图平台&#xff0c;帮助工程师评估矿井和施工中的隧道稳定性。 目前&#xff0c;作为安全预防措施&#xff0c;地质学家和工程师会站在离岩石五米远的地方&#xff0…

chrome调试手机网页

前期准备 1、 PC端安装好chrmoe浏览器 2、 安卓手机安装好chrmoe浏览器 3、 数据线 原文地址&#xff1a;https://lengmo714.top/343880cb.html 手机打开调试模式 进入手机设置&#xff0c;找到开发者模式&#xff0c;然后启用USB调试 打开PC端chrome调试功能 1、点击chr…

聚焦Cayman 环二核苷酸(CDNs)

环二核苷酸CDNs 环二核苷酸&#xff08;cyclic dinucleotides&#xff0c;CDNs&#xff09;是一类天然的环状RNA分子&#xff0c;细菌衍生的CDNs分子包括c-di-GMP、c-di-AMP和3,3-cGAMP&#xff0c;它们介导对恶性、病毒性和细菌性疾病的先天免疫的保护作用&#xff0c;并在自…

springboot古诗文学习系统的设计与实现-计算机毕业设计源码91747

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;古诗文学习系统当然也不能排除在外。古诗文学习系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&am…

跨境反向海淘系统:业务流程解析与未来发展展望

随着全球化的深入发展和互联网技术的飞速进步&#xff0c;跨境购物已经成为越来越多消费者日常生活中的一部分。在这个过程中&#xff0c;反向海淘系统以其独特的优势&#xff0c;逐渐崭露头角&#xff0c;成为跨境电商领域的新星。作为一名在跨境反向海淘系统业务中耕耘了10年…