c语言初阶指针

news2024/9/23 9:27:54

目录

何为指针

地址大小

野指针

成因 

 如何规避

 有效性

指针计算

+-整数

​编辑

 指针比较运算

指针-指针

​编辑 数组与指针关系

二级指针

指针数组

应用 


何为指针

指针就是指针变量,用来存放内存空间的一个编号,将指针比作我们宾馆的客人,内存空间就是一个个的房间,每一个指针变量对应一个地址空间。

int a = 0;
int *pa = &a;

 pa记录了a的地址int除了代表指向数据的类型,还可以表示访问字节的能力

内存单元的单位是字节,而每个内存单元都有自己唯一的编号,而指针指向的是首元素第一个字节的地址,当我们 对指针进行加减操作时,也是按照数据所占的字节数来向前向后偏移的。

也就是说char类型指针加一跳过一个字节,int类型指针加一跳过四个字节.......

地址大小

x86

x64 

野指针

定义:指向未定义的空间(随机的、不正确、没有明确限制的

成因 

1.指针未初始化 

	int* p;//p就是野指针
	*p = 20;

2.越界访问

	int arr[10] = {0};
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (i = 0; i <= sz; i++)
	{
		*p = i;
		p++;
	}

对数组越界访问未初始化的空间,出现了野指针。 

3.指向空间释放

int* test()
{
	int num = 100;
	return &num;
}

int main()
{
	int* p = test();
	*p = 200;

	return 0;
}

函数销毁后通过指针接收归还给内存空间的地址,并对其进行修改,这也是一种典型的野指针。

 如何规避

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

 有效性

	int* p = NULL;

	if (p != NULL)//不为空再使用
	{
		printf("%d\n", *p);
	}

指针计算

+-整数

指针接收一个数组实际接收的是它首元素的地址,数组名等价于首元素地址,

指针接收一个数组实际接收的是它首元素的地址,数组名等价于首元素地址,通过+-整数来实现向前向后的一个偏移,偏移量为该类型所占内存大小。

 指针比较运算

    #define N_VALUES 5   
    float arr[N_VALUES];
	float* vp;
	for (vp = arr; vp < &arr[N_VALUES];)//从前往后
	{
		*vp++ = 0;//++优先级高
	}
	

修改(不推荐): 

#define N_VALUES 5   
float arr[N_VALUES];
float* vp;
for (vp = &arr[N_VALUES-1]; vp >= &arr[N_VALUES];vp--)//从后往前
	{
		*vp = 0;
	}

第一种方案是与数组后面的指针进行比较,然后依次赋值,第二种方案是从后往前比较,在完成首元素赋值后对前一个地址进行比较不符合条件退出循环。

 

规定:允许指向数组元素的指针与指向数组最后一个元素后面的内存空间比较大小,不允许与指向数组首元素前的内存空间比较。所以前者是规范写法。

指针-指针

两个指针的相减不是简单的内存编号相减,而是指向同一块连续空间同类型指针(地址)相减,所得结果为二者相差的元素个数(偏移量)

我们可以在模拟实现strlen函数的时候利用这点得到字符的个数: 

 数组与指针关系

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	/*for (i = 0; i < sz; i++)
	{
		printf("%d ", *p);
		p++;
	}*/

	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}

	return 0;
}

        观察上面的代码,发现数组和指针就是一个模子刻出来的一样,实际上它们是有区别的。

        不同:数组是一块连续的空间,用于存放各种数据,它的大小取决于元素个数,而指针是一个变量,用于存放地址,大小为4\8字节。

        联系:数组名是地址(指针),数组把首元素地址交给指针后,可以用指针来管理数组。

二级指针

和一级指针一样,二级指针也是用于存放地址,它存放的是一级指针的地址。 

 

蓝色圆圈代表指针存放地址的那个变量的数据类型,*p代表了指针。如果想通过它访问a的值,只需进行两次解引用即可。

指针数组

顾名思义,存放指针的数组就叫做指针数组。

int* arr3[5];//存放整型指针的数组
char* arr4[6];//存放字符指针的数组

应用 

 我们可以用多个一维数组模拟二维数组来使用指针数组。

这里我们成功模拟出了二维数组,但它和实际的二维数组还是有些差别,比如二维数组是连续的空间,而指针数组的每个元素是不连续的,但毕竟是模拟,目的是为了了解指针数组的具体功能。

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

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

相关文章

Web存储

目录 什么是 HTML5 Web 存储? 方法 cookie webStorage 会话存储 sessionStorage 本地存储localStorage 什么是 HTML5 Web 存储? 使用HTML5可以在本地存储用户的浏览数据。 早些时候,本地存储使用的是 cookie。但是Web 存储需要更加的安全与快速. 这些数据不会被保存在服…

Go 接口和多态

在讲解具体的接口之前&#xff0c;先看如下问题。 使用面向对象的方式&#xff0c;设计一个加减的计算器 代码如下&#xff1a; package mainimport "fmt"//父类&#xff0c;这是结构体 type Operate struct {num1 intnum2 int }//加法子类&#xff0c;这是结构体…

线性空间和线性变化

目录 考点一、线性空间的基与维数 1、线性空间 2、基底 3、子空间&#xff08;线性子空间&#xff09; ​编辑4、生成子空间 &#xff08;1&#xff09;、v1 n v2 &#xff08;2&#xff09;、v1 v2 5、求和子空间的方法 6、维数定理 7、例题 &#xff08;1&#xf…

解锁前端Vue3宝藏级资料 第四章 VUE常用 UI 库 2 ( ailwind 后台框架)

4.5 ailwind 上面介绍的都是国内比较优秀的UI框架&#xff0c;现在我们在介绍一款国外比较流行的CSS UI框架ailwind 。官方网站https://tailwindcss.com/docs/guides/vite#vue CSShttps://flowbite.com/docs/getting-started/introduction/ 。这个ailwind 架构需要自己去写一些…

《基于区块链的数据资产评估实施指南》技术研讨会成功召开

2023年9月1日&#xff0c;《基于区块链的数据资产评估实施指南》&#xff08;以下简称《指南》&#xff09;技术研讨会在深圳召开&#xff0c;竹云科技作为主要参编单位出席此次研讨会。 中国科协决策咨询首席专家王春晖&#xff0c;中国社会科学院博士于小丽&#xff0c;中国…

Leetcode 易错题整理(三)73. 77. 78. 81. 90. 95.105. 130.

73. 矩阵置零 给定一个 *m* x *n* 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。** 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]笨方法&…

在很多公司里面会使用打tag的方式保留版本

&#xff1a;git tag|grep "xxx-dev“等分支来查看 2&#xff1a;git cherry-pick XXXXX 然后就是查看有冲突这些 git status 会出现相关的异常 然后解决相关的冲突 git add . git cherry-pick --continue git push XXX HEAD:refs/for/XXX 第一&#xff1a;git ta…

Excel自学三部曲_Part3:Excel工作场景分析实战

文章目录 一、Excel工作场景与知识点总结1. 学哪个Excel?&#xff08;1&#xff09;学习哪个版本的Excel?&#xff08;2&#xff09;Excel和WPS到底学哪个&#xff1f; 2. 怎么用Excel?&#xff08;1&#xff09;低量级数据的存储&#xff08;2&#xff09;一次性的数据处理…

解决使用torchstat时报错“AttributeError: module ‘numpy‘ has no attribute ‘long‘”等问题

背景 首先直接使用pip install torchstat安装。 使用torchstat查看模型参数和flops&#xff1a; from torchstat import stat stat(model.to(cpu), (2, 32, 32)) # 这里第二个参数取决于自己的模型输入大小报错1 运行报错如下&#xff1a; 核心错误为&#xff1a; “Attri…

uniapp分包 解决分多个包的问题

1. 分包可以分很多个, 但是在"optimization": { "subPackages": true } 里面只能写一个, 2. 想分多个包 , 在 pages.json 里面 的 subPackages 里面继续加 第三个 第四个即可 3. 保存之后 创建页面就可以看见多个包了

异常的顶级理解

目录 1.异常的概念与体系结构 1.1异常的体系结构 1.2异常的举例 1.3错误的举例 2.异常的分类 2.1编译时异常 2.2运行时异常 3.异常的处理 3.1异常的抛出throw 3.2try-catch捕获并处理 3.3finally 3.4 异常声明throws 4.自定义异常类 1.异常的概念与体系结构 1.1异常的…

BMS电池管理系统——什么是BMS(一)

BMS电池管理系统 文章目录 BMS电池管理系统前言一、BMS是什么&#xff1f;二、BMS的主要功能模块1.采样及测量功能2.状态估计及预测功能3.控制及管理功能4.通讯和诊断功能 总结 前言 作为一名电气专业的学生&#xff0c;大学里学了很多嵌入式相关的知识&#xff0c;首先要明确…

便捷高效的一键发布成绩

今天我要给大家推荐一个非常实用的教育工具——易查分。作为一名教育工作者&#xff0c;我深知每次发布成绩都是一项繁琐而重要的任务。然而&#xff0c;有了易查分&#xff0c;这一切都变得轻松高效起来。让我来告诉各位老师&#xff0c;易查分是如何实现一键发布成绩的&#…

Xilinx IDDR与ODDR原语的使用

文章目录 ODDR原语1. OPPOSITE_EDGE 模式2. SAME_EDGE 模式 ODDR原语 例化模板&#xff1a; ODDR #(.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" .INIT(1b0), // Initial value of Q: 1b0 or 1b1.SRTYPE("SYNC…

Scrapy的基本介绍、安装及工作流程

一.Scrapy介绍 Scrapy是什么&#xff1f; Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架(异步爬虫框架) 通常我们可以很简单的通过 Scrapy 框架实现一个爬虫&#xff0c;抓取指定网站的内容或图片。 Scrapy使用了Twisted异步网络框架&…

【LeetCode题目详解】第九章 动态规划 part05 1049. 最后一块石头的重量 II 494. 目标和 474.一和零(day43补)

本文章代码以c为例&#xff01; 一、力扣第1049题&#xff1a;最后一块石头的重量 II 题目&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎…

C++学习记录——삼십삽 STL空间配置器

文章目录 1、概念2、使用3、容器上的体现 1、概念 我们先看malloc&#xff0c;malloc是创建在堆上的&#xff0c;虽然malloc可以申请内存&#xff0c;但也有限制&#xff0c;windows下用VirtualAlloc可以直接向堆申请内存&#xff0c;Linux中则是brk&#xff0c;不过这两个效率…

HCIA自学笔记01-传输介质

通信网络除了包含通信设备本身之外&#xff0c;还包含连接这些设备的传输介质&#xff0c;如同轴电缆、双绞线和光纤等。不同的传输介质具有不同的特性&#xff0c;这些特性直接影响到通信的诸多方面&#xff0c;如线路编码方式、传输速度和传输距离等。 简单网络&#xff1a;…

✔ ★算法基础笔记(Acwing)(一)—— 基础算法(20道题)【java版本】

基础算法 一、快速排序1. 快速排序例题2. 第k个数( 快速选择 ) ✔ ✔1.31★快排二刷总结( 4点 ) 二、归并排序1. 归并排序模板题 ✔ ✔1.31★二刷总结 ★2. 逆序对的数量 ✔ ✔1.31★二刷总结 三、二分1. 数的范围 ✔1.31★二刷总结(mid > x 则是 输出最左边一个)第一个大于…

【操作系统】聊聊Linux内存工作机制

内存主要是用来存储系统和应用程序的指令、数据、缓存等 内存映射 内存是需要安全机制保护的&#xff0c;所以只有内核才可以直接访问物理内存。进程如果要访问内存需要通过独立的虚拟地址空间。 虚拟地址空间其实包含两部分。一部分是内核空间&#xff0c;另一部分就是用户…