Linux C语言:指针和指针变量

news2024/11/24 5:39:52

一、指针的作用

  • 使程序简洁、紧凑、高效
  • 有效地表示复杂的数据结构
  • 动态分配内存
  • 能直接访问硬件
  • 能够方便的处理字符串
  • 得到多于一个的函数返回值

二、内存、地址和变量 

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.coloradmin.cn/o/1798199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dockershim 与 Containerd:两种容器运行时的故事

在不断发展的容器化世界中&#xff0c;两个关键组件经常被混淆&#xff1a;Dockershim 和 containerd。虽然它们在管理容器方面都发挥着重要作用&#xff0c;但它们的用途却截然不同。本文深入探讨了它们的功能&#xff0c;深入探讨了 Dockershim 和 containerd 之间的区别。 揭…

【前端】响应式布局笔记——自适应布局

自适应布局 自适应布局是不同设备对应不同的html(局部自适应)&#xff0c;通过判断设备的类型或控制局部的变化。 1、获取设备是移动端还是pc端 // 获取设备的信息let userAgent navigator.userAgent.toLowerCase();// 使用正则表达式来判断类型let device /ipad|iphone|m…

读书笔记分享

1.绝大多数父母都是爱孩子的&#xff0c;可他们却不是称职的父母。世界上任何职业都要培训、考核、竞争上岗&#xff0c;唯有“父母”这个职业是没有这些程序&#xff0c;只要生了小孩&#xff0c;就是天经地义的父母。 2.由于自身工作特点&#xff0c;“白领”们的部分器官和…

【Java数据结构】详解Stack与Queue(四)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.用队列实现栈 3.用栈实现队列 4.栈和队列存放null 5.总结 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友…

计算机网络-NAT配置与ACL

目录 一、ACL 1、ACL概述 2、ACL的作用 3、ACL的分类 4、ACL的配置格式 二、NAT 1、NAT概述 2、NAT分类 2.1 、 静态NAT 2.2 、 动态NAT 3、NAT的功能 4、NAT的工作原理 三、NAT配置 1、静态NAT配置 2、动态NAT配置 四、总结 一、ACL 1、ACL概述 ACL&#xff…

微服务框架下,因发送端与消费端的vhost不一致,导致rabbitmq出现严重的消息堆积

一、背景 在生产环境下&#xff0c;rabbitmq机器出现磁盘空间不足的报警&#xff0c;发现是某个队列的消息只有生产&#xff0c;迟迟没有消费。 可以得到的信息是&#xff1a; 队列queue是data_center_file_change_queue队列绑定的交换机是resourceChangeExchange&#xff0c…

基于深度学习的CT影像肺癌检测识别

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 肺癌是全球范围内导致癌症死亡的主要原因之一&#xff0c;早期检测和诊断对于提高患者生存率至关重要。随着深度学习技术的迅猛发展&#xff0c;基于CT影像的肺癌检测识别成为了研究热点。本文介绍…

水库安全监测系统:智慧水文动态监测系统

TH-SW2水库安全监测系统&#xff0c;作为一款智慧水文动态监测系统&#xff0c;其在现代水利管理中扮演着至关重要的角色。该系统通过集成先进的数据采集、传输、处理和分析技术&#xff0c;为水库的安全运行提供了强有力的技术支撑。 水库安全监测系统是一种用于实时监测和记…

【案例分享】印前制版工单系统:“鹿山科技”助力“铭匠数据”重塑业务流程

内容概要 本文介绍了鹿山信息科技通过明道云HAP平台的数字化解决方案提升了铭匠数据在印前制版行业的效率。周口铭匠数据科技有限公司位于河南省周口市沈丘县&#xff0c;是一家专注于印前制版设计服务的公司&#xff0c;成立于2023年。企业在销售业务、版材制作生产和美工设计…

springboot编写简述01

项目结构 Users.java package com.sust.entity;import java.io.Serializable;public class Users implements Serializable {private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name name;}publ…

探索Omega-3脂肪酸:健康益处与营养补充

谷禾健康 随着国家卫生健康委发布2024版食养指南&#xff0c;以及前几天在上海举办的临床医学与营养食品论坛&#xff0c;越来越多的人开始重视日常膳食的营养与健康。 而说到脂肪&#xff0c;很多人都会“谈脂色变”&#xff0c;想要避免脂肪的摄入&#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;宝兰德中间件核心产品「应用服务器软件 V9.5.5」&#xff08;以下简称&#xff1a;应用服务器软件&#xff09;顺利通过了保险业信息技术应用创新攻关实验室产品适配测试。标志着宝兰德应用服务器软件符合信息技术产品适配要求&#xff0c;能够全面支持金融保险…

小华半导体MCU方案选型和应用

小华半导体有限公司是中国电子信息产业集团有限公司旗下集成电路业务平台华大半导体有限公司的核心子公司&#xff0c;目前团队规模约300人&#xff0c;其中75%以上为研发人员&#xff0c;国内细分行业规模最大&#xff0c;核心骨干拥有国际MCU大厂25年以上从业经验。 小华半导…

“墨者杯”网络安全大赛wp

漏洞利用01 504错误修改为POST提交拿到php源码&#xff0c; 查看逻辑$_POST[roam1] ! $_POST[roam2] && sha1($_POST[roam1]) sha1($_POST[roam2]) 采用数组绕过 roam1[]1&roam2[]2 拿到phpinfo&#xff0c;观察发现 这里的意思是每个php页面都包含这个f14…

C++基类与派生类

1.派生类的定义 派生类语法如下&#xff1a; class <派生类名> : <继承方式> <基类名> { private:派生类新增成员&#xff1b; protected:派生类新增成员&#xff1b; public:派生类新增成员&#xff1b; }; 说明&#xff1a; &#xff08;1&#xff09;cla…

新手必看!场外期权交易的六大注意事项

场外期权交易的六大注意事项 对于初涉金融市场的投资者来说&#xff0c;场外期权交易无疑是一个既具吸引力又充满挑战的领域。为确保您在交易中能够稳健获利&#xff0c;以下六大注意事项值得每位新手仔细研读。 文章来源/&#xff1a;财智财经 一、深入理解期权基本概念 场…

QComboBox条目可选择状态

有时候下拉框需要根据情况&#xff0c;将某些条目设为不可点击状态&#xff0c;或者动态切换为可点击状态&#xff0c;可采用以下方法。 //item1可选ui->comboBox->setItemData(0, QVariant(-1), Qt::UserRole-1);//item2不可选ui->comboBox->setItemData(1, QVari…

kivy 百词斩项目 报错

AttributeError: FigureCanvasKivyAgg object has no attribute resize_event AttributeError: FigureCanvasKivyAgg object has no attribute resize_event 是一种常见的Python错误&#xff0c;当你试图访问一个对象&#xff08;在这个例子中是 FigureCanvasKivyAgg 对象&am…

华为鸿蒙开发-鸿蒙基于ARKTS开发之启动模式

前言 鸿蒙生态取得爆发式增长&#xff01; 截至3月底&#xff0c;已有超4000个应用加入鸿蒙生态。 而在今年1月中旬&#xff0c;华为刚宣布HarmonyOS NEXT鸿蒙星河版面向开发者开放申请&#xff0c;这一版本鸿蒙系统也被称为“纯血鸿蒙”。 当时&#xff0c;华为宣布首批200…