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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenFeign --学习笔记

什么是OpenFeign&#xff1f; OpenFeign可以想象成一座连接客户端&#xff08;服务器&#xff09;和服务器之间的桥梁。在微服务架构中&#xff0c;各个服务之间像小岛屿一样分布在网络上&#xff0c;它们需要相互通信才能协同工作。但是&#xff0c;这些岛屿之间并没有现成的…

技术对比:eMMC、SD NAND与NOR Flash存储特性详解

在电子技术迅猛前进的今天&#xff0c;存储技术成为了整个行业发展的基石。SD NAND、eMMC和NOR Flash&#xff0c;这三种存储技术各自以其独特的架构和特性&#xff0c;满足了多样化的存储需求。让我们来看看它们之间的一些关键对比&#xff1a; 1. 存储单元架构&#xff1a; S…

科普|大数据风险检测对申贷人有哪些好处?

大数据风险检测可以极大地提高金融机构在用户肖像、反欺诈和信用评级等方面的效率和风险控制能力&#xff0c;这是金融企业发展过程中必须结合的一种科技技术。大数据风险检测覆盖信贷领域的所有流程&#xff0c;从客户获取到身份验证&#xff0c;再到信贷中和信贷后。因此&…

推荐系统三十六式学习笔记:原理篇.近邻推荐07|人以群分,你是什么人就看到什么世界

目录 协同过滤基于用户的协同过滤背后的思想原理实践1、构造矩阵2、相似度计算3、推荐计算4、一些改进 应用场景&#xff1a;总结 谈及推荐系统&#xff0c;不得不说大名鼎鼎的协同过滤。协同过滤的重点在于协同&#xff0c;所谓协同&#xff0c;也就是群体互帮互助&#xff0c…

微信小程序制作宝典:手把手教学指南

微信小程序开启了互联网软件的新使用模式。在各种各样的微信小程序竞相抢占流量的头部&#xff0c;我们应该如何设计微信微信小程序&#xff1f;让用户感到舒适是设计师在设计产品的早期阶段应该考虑的问题。那么如何设计微信小程序呢&#xff1f;即时设计总结了以下设计指南&a…

什么是输入偏置电流?

输入偏置电流&#xff08;input bias current&#xff09;&#xff1a;运放同相与反相端流入和流出的电流。理想的运放同相和反相端的阻抗是无穷大的&#xff0c;所以是无法流进和流出电流。 第一种定义&#xff1a;同相与反相端电流和的平均值 以AD8031运放举例&#xff0c;…

冯喜运:6.7晚间黄金原油行情分析及操作建议

【黄金消息面分析】&#xff1a;周四(6月6日)纽市尾盘&#xff0c;现货黄金盘中报2373.15美元/盎司&#xff0c;涨18.16美元或0.77%。如果金价反弹至上周高点2364上方&#xff0c;将引发一周看涨反转。日收盘价高于该价格水平将确认突破。一旦突破得到确认&#xff0c;金价进一…

推荐收藏!帮你轻松写好Midjourney提示词的10个结构框架

最近经常有同学问我&#xff0c;Midjourney的提示词看上去很复杂&#xff0c;不知道如何下手。以下我总结了10个常用的Midjourney提示词结构&#xff0c;希望能帮助你轻松上手提示词。 基础知识 开始前&#xff0c;有几件关键的提示词知识需要了解&#xff1a; 要有描述性&…

外汇天眼:Monex 将开始提供使用 d CARD 的定期购买共同基金计划

NTT Docomo 公司和 Monex 公司今天宣布&#xff0c;从2024年7月5日星期五开始&#xff0c;推出使用 Docomo 信用卡 d CARD 的定期购买共同基金计划。从同一天起&#xff0c;2024年8月的购买申请也将被接受。 通过这项新服务&#xff0c;客户可以使用信用卡通过 Monex 定期购买共…

idea如何使用git reset进行回退以及如何使用git stash将暂存区文件储藏,打包后重新恢复暂存区文件

最近遇到一个棘手的问题&#xff0c;本来按照计划表开发&#xff0c;但是项目经理突然让你改一个小bug&#xff0c;改完需要马上部署到线上&#xff0c;但是你手上的活做到一半还没做完&#xff0c;提交上去那肯定是不可行的。这时就可以使用git stash命令先把当前进度&#xf…

工程力学 - 课程导论

工程力学是工程学科中的核心基础课程&#xff0c;专注于研究物体在外力作用下的运动规律和受力情况。它涵盖了静力学、运动学、动力学和材料力学等关键领域&#xff0c;为工程结构的安全性、稳定性和功能性提供理论支撑。通过理论分析、实验测定和计算机模拟等方法&#xff0c;…

在虚拟机上搭建 Docker Kafka 宿主机器程序无法访问解决方法

1、问题描述 在虚拟机CentOS-7上搭建的Docker Kafka ,docker内部可以创建Topic、可以生产者数据、可以消费数据&#xff0c;而在宿主机开发程序无法消费Docker Kafka的数据。 1.1、运行情况 [dockerlocalhost ~]$ docker ps -a CONTAINER ID IMAGE COMMAND…

海外网站搭建:企业数字化出海的基石

在全球化的浪潮下&#xff0c;越来越多中国企业开始寻求海外市场的拓展机会。然而&#xff0c;要想成功进入海外市场&#xff0c;一个符合国际标准的、具备吸引力的海外网站是必不可少的。在这个过程中&#xff0c;NetFarmer凭借其专业的服务和丰富的经验&#xff0c;为企业海外…

神经网络 torch.nn---Pooling layers(nn.MaxPool2d)

torch.nn — PyTorch 2.3 documentation torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) nn.MaxPool2d class torch.nn.MaxPool2d(kernel_size, strideNone, padding0, dilation1, return_indicesFalse, ceil_modeFalse) 参数介绍 kernel_size(int or tuple) - …

智慧互联网医院系统的技术架构与实现

随着信息技术的迅猛发展&#xff0c;智慧互联网医院系统成为现代医疗服务的重要组成部分。该系统融合了多种先进技术&#xff0c;旨在提升医疗服务的效率和质量&#xff0c;优化患者体验。本文将深入探讨智慧互联网医院系统的技术架构及其实现方法&#xff0c;并提供相关代码示…

鸢尾花分类和手写数字识别(K近邻)

鸢尾花分类 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import pandas as pd import mglearn# 加载鸢尾花数据集 iris load_iris() X_train, X_test, y_train, y_test train_test_split(iris.data,iris.target,test_siz…

Xsens动作捕捉系统:角色动画制作与运动分析领域的先进工具

随着传感器技术的不断进步&#xff0c;动作捕捉技术现在更加趋向于民用化&#xff0c;拥有价格优势的惯性动作捕捉系统现在更多的出现在独立动画工作室与国内外多所高校的实际项目应用中。 凭借无场地限制、价格优惠、校准使用方便、数据采集精确等多项优势&#xff0c;Xsens惯…

特征交叉系列:DCN-Mix 混合低秩交叉网络理论和实践

DCN-Mix和DCN-V2的关系 DCN-Mix(a mixture of low-rank DCN)是基于DCN-V2的改进版&#xff0c;它提出使用矩阵分解来降低DCN-V2的时间空间复杂度&#xff0c;又引入多次矩阵分解来达到类似混合专家网络MOE的效果从而提升交叉层的表征能力&#xff0c;若读者对DCN-V2不甚了解可…

Faiss assertion ‘err == cudaSuccess‘ failed in void faiss::gpu:runL2Norm()

Faiss assertion ‘err cudaSuccess’ failed in void faiss::gpu:runL2Norm(). details:CUA error 209 no kernel image is available for execution on the device 本人使用的ubuntu 22.04系统&#xff0c;conda的环境。使用pip安装faiss-gpu出现的问题。 pip install fai…

38页 | 工商银行大数据平台助力全行数字化转型之路(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 工商银行大数据平台 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&a…