【C语言】初阶指针(指针及其类型以及野指针)

news2025/1/24 8:53:49

简单不先于复杂,而是在复杂之后。

89efcc89ac61428db4d5b6639b2bd948.jpeg

目录

1. 指针是什么?

2. 指针和指针类型 

2.1  指针+-整数

2.2 指针的解引用 

3. 野指针 

3.1 野指针成因 

3.2 如何规避野指针 


1. 指针是什么?

指针理解的两个要点:

1. 指针是内存中最小单元的编号,也就是地址。

2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。

总结:指针就是地址,口语中说的指针通常是指针变量。

 

int main()
{
int a = 10;//a是整型变量,占用4个字节的内存空间
int* pa = &a;//pa是一个指针变量,用来存放地址的
//取地址时取的是第一个字节的地址

return 0;
}

总结:

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理。)

  • 一个小的内存单元多大?

            ---1byte

  • 如何编址?

经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是1或者0;

那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

...

11111111 11111111 11111111 11111111

 总结:

1. 指针是用来存放地址的,地址是唯一标识一块地址空间的。

2. 指针的大小在32位平台是4个字节,在64位平台是8个字节。

 

C语言的%zu是用来格式化输出size_t类型数据的格式控制符。

size_t是C标准库中定义的一个无符号整型类型,用于表示内存空间大小和数组索引等非负整数值。在C语言中,sizeof操作符用于计算指定类型或表达式的大小(即占用的字节数),并返回一个size_t类型的值。

需要注意的是,%zu只能用于格式化输出size_t类型的值,不能用于其他类型的数据。

如果把一个非size_t类型的数据使用%zu格式控制符进行输出,可能会导致输出结果不正确,甚至导致程序崩溃。

2. 指针和指针类型 

变量有不同的类型,整型、浮点型等。

指针也有类型。

当有这样的代码: 

 

 

 

 

 

结论:指针类型决定了指针在被解引用的时候访问几个字节

1. 如果是int*的指针解引用访问4个字节

2. 如果是char*的指针,解引用访问1个字节

在这段代码中,整型指针变量pa和字符型指针变量pc所指向的地址是相同的,即它们都指向变量a的内存地址。

这是因为在C语言中,变量在内存中的存储方式是连续的,而不同类型的指针变量只是指向这些内存地址的方式不同。

在这段代码中,变量a在内存中的存储方式是以4个字节为一个单位进行存储,因此它的地址是一个整型地址。

当将变量a的地址赋给整型指针变量pa时,pa所指向的地址与a的地址是相同的,因为它们都是整型地址。

当将变量a的地址强制转换为字符型指针类型并赋给字符型指针变量pc时,pc所指向的地址也与a的地址相同,这是因为强制类型转换只改变了指针变量的解释方式,而并没有改变指针变量所指向的地址。

因此,虽然整型指针变量和字符型指针变量的类型不同,但它们所指向的地址是相同的。

2.1  指针+-整数

 

 

总结:指针的类型决定了指针向前或向后走一步(+1-1操作)有多大,也就是指针的步长。

2.2 指针的解引用 

 

 

 总结:

 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。

 比如:char* 的指针解引用就只能访问一个字节,而int* 的指针解引用就能访问四个字节。

3. 野指针 

概念:野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)。 

3.1 野指针成因 

1. 指针未初始化

int main()
{
int* p;//没有初始化,就意味着没有明确的指向
//一个局部变量不初始化的话,放的是随机值:0xcccccccc

*p = 10;//非法访问内存,这里的p就是野指针

return 0;
}

 2. 指针越界访问

int main()
{
int arr[10] = { 0 };
int* p = arr;//&arr[0]
int i = 0;
for (i = 0; i <= 10; i++)
{
*p = i;
p++;
}
//当指针指向的范围超出数组arr的范围时,p就是野指针
return 0;
}

3. 指针指向的空间释放(动态内存开辟时讲解)

int* test()
{
int a = 10;
return *a;
}
int main()
{
int*p = test();

return 0;
}

3.2 如何规避野指针 

  • 指针初始化
  • 小心指针越界
  • 指针指向空间释放时及时置NULL 
  • 避免返回局部变量的地址
  • 指针使用之前检查有效性

 

零地址禁止访问,指针没有指向有效空间。

这段代码有一个明显的问题,就是在函数test()中声明的变量a是一个局部变量,在函数执行完毕后将被销毁。

因此,返回该变量的地址是不安全的,因为该地址将指向一块已经被销毁的内存。

这将导致指针变量p所指向的地址变成了一个野指针,可能会引发不可预测的错误,这是一种非常危险的行为。

如果想要正确地使用返回指针,可以考虑使用动态内存分配函数malloc()来分配一块内存,并将变量的值存储在该内存块中,然后返回该内存块的地址。

动态内存分配在之后的博客会有所体现。

这样可以确保返回的地址始终有效,并且可以安全地使用指针变量。

 

int main()
{
int a = 0;
int* p = &a;
*p = 20;
//null -> 0

int* p2 = NULL;
*p2 = 100;//err

int* p3 = NULL;

if (p3 != NULL)
{
*p3 = 100;//ok
}

return 0;
}

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

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

相关文章

HCLE--虚拟机安装ntp等相关服务出现报错解决和通过SSH实现免密登录

.1 在服务端主机上安装ntp服务&#xff1a; yum install ntp 1.2 修改/etc/ntp.conf文件&#xff0c;将默认的ntp服务器地址替换为可用的ntp服务器地址。例如&#xff1a; server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst server ntp3.aliyun.com iburst 1…

JSP-JDBC-设计一个简单的网上名片管理系统

需求&#xff1a; 1&#xff0e;设计一个简单的网上名片管理系统&#xff0c;实现名片的增、删、改、查等操作。该名片管理系统包括如下功能&#xff1a; &#xff08;1&#xff09;用户登录与注册 用户登录&#xff1a;在登录时&#xff0c;如果用户名和密码正确&#xff0…

举一反三学python(11)—excel实例

一、乘法表写入EXCEL 想必大家对九九乘法表的代码记忆尤新&#xff1a;for i in range(1,10): # 9行 for j in range(1,i1): # 列数是动态变化的&#xff0c;是1-9列 print(f{j}x{i}{j*i},end\t) # 格式化输出并按制表位…

8脚语音芯片有什么特点?

一、8脚语音芯片指的是什么&#xff1f; 8脚语音芯片&#xff0c;顾名思义就是拥有8个脚的一颗芯片&#xff0c;8脚其实是指8引脚&#xff0c;而引脚又被叫做管脚。引脚就是指从集成电路&#xff08;芯片&#xff09;内部电路引出与外围电路的接线&#xff0c;引脚构成了这块芯…

如何使用YOLOv5的pycocotools进行coco指标评估

使用YOLOv5进行coco指标评估 1. 安装pycocotools2.重新排序并命名3. 将txt标签转换为json格式格式2. 生成json3. 测试是否正确4. 运行val.py完整版本&#xff08;一次运行所有&#xff09; 1. 安装pycocotools pip install pycocotools -i https:pypi.douban.com/simple2.重新…

HTML5 <meter> 标签、HTML5 <mark> 标签

HTML5 <meter> 标签 实例 使用 meter 元素展示给定的数据范围&#xff1a; <meter value"2" min"0" max"10">2 out of 10</meter><br> <meter value"0.6">60%</meter>尝试一下 浏览器支持 Fir…

【Python知识】2个特别好用的python模块(请收藏!)

文章目录 前言一、介绍二、FuzzyWuzzy库介绍2.1 fuzz模块2.2 简单匹配&#xff08;Ratio&#xff09;2.3 非完全匹配&#xff08;Partial Ratio&#xff09;2.3 忽略顺序匹配&#xff08;Token Sort Ratio&#xff09;2.4 去重子集匹配&#xff08;Token Set Ratio&#xff09;…

matlab数据归一化与反归一化处理

假如数据实际取值范围为 X i ∈ [ − π π ] , i 1 , 2 , 3 X_i \in [-\pi \ \ \pi], i1,2,3 Xi​∈[−π π],i1,2,3&#xff0c;变量服从正态分布 示例如下&#xff1a; %% 数据归一化处理及其概率密度函数 clear clc Mu [0 0 0]; % 均值 Sigma [1 1 1]; % 标准差 C…

EA使用教程

文章目录 创建新工程属性设置导出图片到剪切板时序图中取消消息后面自动生成的括号在文本框中回车取消流程图的背景渐变导出更清晰图片 创建新工程 1. 点击 FILE -> New Project 开始创建新工程 2. 为新工程命名 3. 选择模型 以下为常用设计模型&#xff1a; Business …

Java并发工具合集JUC大爆发

1. CountDownLatch CountDownLatch是一个同步计数器&#xff0c;初始化的时候 传入需要计数的线程等待数&#xff0c;可以是需要等待执行完成的线程数&#xff0c;或者大于 &#xff0c;一般称为发令枪。\ ​ countdownlatch 是一个同步类工具&#xff0c;不涉及锁定&#xff0…

我实现了一个乞丐版的评论功能

文章目录 设计评论功能0 设计初衷1 前端组建设计**设计原则****设计代码**组件核心代码**调用组建并给出mock数据****效果** 2 后端数据库设计3 后端接口设计4 前后端联调5 后端评论保存接口设计6 前端评论填写流程设计7 联调8 验证码美化 设计评论功能 0 设计初衷 经过长达八…

三百左右的蓝牙耳机哪个音质好?三百左右音质最好的蓝牙耳机推荐

在外出携带的数码产品中&#xff0c;蓝牙耳机的出现频率居高不下&#xff0c;一部手机&#xff0c;一副耳机已经成为不少人外出的标配。蓝牙耳机无外乎是用来听的&#xff0c;下面&#xff0c;我来给大家推荐几款三百左右音质好的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡…

LabVIEW-字符串与路径控件

在前面板中字符串与路径控件位于下图所示位置&#xff1a; 字符串输入和显示功能&#xff0c;是用户最常用的基本操作功能单击字符串控件&#xff0c;鼠标右键&#xff0c;选择“属性”可以对字符串控件的外观进行设置。显示样式有四种方式&#xff0c;即正常、反斜杠符号、密码…

家用洗地机好用吗?好用的洗地机分享

洗地机是一种高效、节能、环保的清洁设备&#xff0c;广泛应用于各种场所的地面清洁工作。它不仅可以快速清洁地面&#xff0c;还可以有效去除污渍、油渍等难以清洁的污染物&#xff0c;让地面恢复光洁如新的状态。同时&#xff0c;洗地机还可以减少清洁人员的劳动强度&#xf…

研读Rust圣经解析——Rust learn-10(泛型,trait,生命周期)

研读Rust圣经解析——Rust learn-10&#xff08;泛型&#xff0c;trait&#xff0c;生命周期&#xff09; 泛型应用泛型方法泛型结构体枚举泛型方法定义中的泛型 trait定义一个trait默认trait方法实现为结构体实现trait调用trait中实现的方法将trait作为参数trait bound多实现入…

2023年6月CDGP数据治理专家认证考试火热报名中

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

数据结构—单链表

目录 1.前言 2.了解单链表 3.单链表代码实现 3.1 单链表结构体实现 3.2 创建节点 3.3 打印单链表 3.4 尾插 3.5 头插 3. 6 头删 3.7 尾删 3.8 查找 3.9 插入 3.9.1 在pos位置之前插入 3.9.2 在pos位置之后插入&#xff08;主要使用这种功能&#xff09;---不需要找…

家用洗地机到底好不好用?家用洗地机分享

在当今社会&#xff0c;人们越来越关注卫生和清洁&#xff0c;这也促进了家庭和工作场所对清洁设备的需求。洗地机就是其中之一&#xff0c;它的高效和便捷性为我们提供了清洁和保洁的重要帮助。使用洗地机不仅能够卫生地保持地面清洁&#xff0c;而且可以节省时间和人力成本。…

拼多多的天天618,如何掀开电商营销的“皇帝新衣”?

电商价格战如火如荼&#xff0c;拼多多也在2023年4月正式启动“数码家电消费季”百亿补贴。 首季将在百亿补贴的基础上加码10亿&#xff0c;对手机、平板等各种数码家电&#xff0c;提供全品类补贴&#xff0c;苹果、华为、小米、美的等国内外各大品牌均会参与。拼多多相关负责…

安装虚拟机VMshare

前言&#xff1a;虚拟机必须在开机的状态下&#xff0c;而且互相需ping通&#xff0c;mobax才可以连接成功 一、下载VMsharePro软件 1、双击 安装程序&#xff1b; 2、按照步骤 点击一个个的“下一步” 3、安装完成之后&#xff0c;会要求你 输入许可证&#xff0c;这个可以…