C语言指针相关知识(初阶)

目录

指针是什么

指针变量的大小

指针和指针类型

指针类型的意义

野指针

指针运算

指针+-整数

指针-指针

指针的关系运算

指针和数组

二级指针

二级指针定义

指针数组

指针数组的定义


指针是什么

如下图所示(右侧编号为内存地址):

	int a = 10;//a占四个字节
	int* pa = &a;//拿到的是a的四个字节中第一个字节的地址
	             //将a的地址存放在pa变量中,pa是一个指针变量

指针变量的大小


指针和指针类型

指针类型的意义

1.指针类型决定了:指针解引用的权限有多大(如下例)

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

上述代码中,原先a地址的值在内存中显示为:

执行后面两句代码后,内存中四个字节的值被改变了:

而在下述定义char指针类型的代码中:

只改变了一个字节的地址

2.指针类型决定了:指针每走一步的步长(如下例)

	int arr[10] = {0};
	int* pa = arr;
	char* pc = arr;
	printf("%p\n",pa);
	printf("%p\n", pa+1);

	printf("%p\n", pc);
	printf("%p\n", pc+1);

同样加一,但是int类型和char类型指针的步长不同


野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的) ,造成原因为:

1.指针未初始化

	int* p;//p是一个局部的指针变量,未初始化默认为随机值
	*p = 20;//非法访问内存

2.指针越界访问

	int arr[10] = { 0 };//数组大小为10
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 10; i++) {//循环11次
		*p = i;
		p++;           //第11次越界,产生非法访问
	}

3.指针指向的空间释放

int* test() {
	int a = 10;
	return &a;
}
int main() {
	int* p = test();//局部变量a申请的内存空间已经销毁
	*p = 10;        //此时指针p再把10存入a的内存空间中,为非法访问内存
	return 0;
}

如何规避野指针:

1.指针初始化(不知初始化为何地址时,初始化为NULL)

2.小心越界指针

3.指针指向空间释放即放置NULL

4.指针使用之前检查有效性(if p!= NULL)


指针运算

指针+-整数

 

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int* pend = arr + 9;
	while (p<=pend)        //指针的关系运算(地址大小在比较)
	{
		printf("%d\n", *p);//依次打印1 2 3 4 5 6 7 8 9 10
		p++;             //指针+-整数
	}

指针-指针

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	printf("%d\n", &arr[9] - &arr[0]);//结果为9
	//指针减去指针得到的是两个指针之间元素的个数

指针的关系运算

	#define N_VALUES 5
	float values[N_VALUES];
	float* vp;
	for (vp = &values[N_VALUES]; vp >&values[0];) {//关系运算
		*--vp = 0;//数组所有元素置为0
	}

上方这段代码与下方图片中的代码执行结果是相同的:

但是,下方这段代码是存在一些问题的:


指针和数组

数组名是数组首元素的地址:

	int arr[10] = { 0 };
	printf("%p\n", arr);//数组名是数组首元素的地址
	printf("%p\n", &arr[0]);
	//打印结果都为00EFF920

通过指针访问数组:

	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (int i = 0; i < 10; i++) {
		printf("%d", *(p + i) = i);
		//成功打印数组各元素
	}


二级指针

二级指针定义

int a = 10;
	int* pa = &a;//pa是指针变量,一级指针

	//ppa是一个二级指针变量
	int** ppa = &pa;//pa也是个变量,&pa取出pa在内存中起始地址

	//a的值为10,地址为0x0012ff40
	//pa的值为0x0012ff40,地址为0x0012ff48
	//pa的值为0x0012ff48,地址为0x0012ff52

如何通过上述代码通过ppa找到a?

	 *ppa == pa
     *pa == a
     * *ppa == a

存在三级、四级等指针,但一般很少使用


指针数组

指针数组的定义

	//指针数组 - 数组
	int arr[10];//整型数组 - 存放整型量
	char ch[5];//字符数组 - 存放的是字符
	//指针数组 - 存放指针的数组
	int* parr[5];
    char* parr[5];

以上为C语言中指针初阶知识的相关内容,感谢您花费宝贵的时间阅读本文章!

之后博主会撰写关于指针高阶相关内容的博客。

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

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

相关文章

修改Echarts图表的标题和副标题的内容

直接上代码 var graphicConfig [ { type: "text", left: "center", top: "center", style: { text: "包日", // 初始化为空字符串 textAlign: "center", fill: "#000", fontSize: 14, fontWeight: "bold&qu…

Casper Labs 与 IBM Consulting 合作,AI透明度、审计能力的新方案

​ “全新解决方案&#xff0c;旨在帮助企业更有效地管理训练数据&#xff0c;这些数据由不同的组织通过生成式人工智能系统产生” 企业区块链软件和服务提供商 Casper Labs 与 IBM Consulting 共同宣布&#xff0c;它们将联手推出新的解决方案&#xff0c;以帮助客户在其人工…

day-07 统计出现过一次的公共字符串

思路 用哈希表统计words1和words2中各个字符串的出现次数&#xff0c;次数皆为1的字符串符合题意 解题方法 //用于存储words1中各个字符串的出现次数 HashMap<String,Integer> hashMap1new HashMap<>(); //用于存储words2中各个字符串的出现次数 HashMap<Stri…

活动 | Mint Blockchain 将于 2024 年 1 月 17 号启动 MintID 限量发行活动

MintID 是 Mint Blockchain 生态的超级权益卡&#xff0c;用于探索 NFT PASS 在未来各种应用场景下的可能性。MintID 将通过限时限量有价发售的方式对外释放&#xff0c;持有人将成为 Mint Blockchain 的核心权益用户。 MintID 总量&#xff1a;10,000 枚 铸造价格&#xff1a…

方波 离散傅里叶级数 MATLAB

%方波 离散时间傅里叶变换 L 5; N 10; k [-N/2:1:N/2]; %占空比 基本周期 离散时间的参数 xn [ones(1,L),zeros(1,N-L)]; %生成方波序列 XK dfs(xn,N); magXK abs([XK(N/21:N),XK(1:N/21)]); subplot(2,2,3); stem(k,magXK); axis([-N/2,N/2,-0.5,5.5]); xlabel(k); y…

【Linux】 nohup命令使用

nohup命令 nohup是Linux和Unix系统中的一个命令&#xff0c;其作用是在终端退出时&#xff0c;让进程在后台继续运行。它的全称为“no hang up”&#xff0c;意为“不挂起”。nohup命令可以让你在退出终端或关闭SSH连接后继续运行命令。 nohup 命令&#xff0c;在默认情况下&…

python两种办法对二叉树判断是否对称

对于给定的一颗二叉树&#xff0c;需要判断其是否是对称二叉树&#xff0c;可以使用两种办法来对这个进行实现&#xff0c;分别使用深度优先搜索算法和广度优先搜索算法都可以完成。 首先考虑一下二叉树的对称&#xff0c;什么样的二叉树是对称二叉树&#xff0c;就是如果对所…

第11章 GUI Page495~496 步骤三十一:另存为别的文件

当前的TrySaveFile(bool hint_on_dirty true)有两个特征无法满足“另存”的需求&#xff1a; 一&#xff0c;TrySaveFile仅在数据为“新”的时候才提问用户输入文件名。而“另存”总是要求用户输入一个文件名&#xff0c;多以它总应该弹出一个文件选择对话框&#xff0c;这也…

2024年CES展会都有些啥?亮点集锦都在这里

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 CES在科技界是一场盛会&#xff0c;被誉为科技界的春晚&#xff0c;展会上前沿的技术、概念的产品吸引不少关注。2024年CES是在2023年大语言模型…

Java SE入门及基础(9)

if选择结构 1. 基本if选择结构 语法 if ( 条件 ){ // 如果条件满足&#xff0c;则执行代码块 //代码块 } 案例 从控制台输入一个整数&#xff0c;如果该数字小于 10 &#xff0c;则输出 10 与该数字的差值。 流程图 代码实现 public class Example1 { public s…

如何实现网页当前页面刷新功能

类似于这样的页面 实现思路如下&#xff1a; 首先我们在pinia中定义一个刷新状态的字段&#xff0c;点击按钮的时候&#xff0c;改为相反的值对主页面的路由跳转Router-view绑定一个v-if,它绑定一个自定义的一个响应的参数&#xff0c;我们在主页面监听pinia的刷新状态数据&am…

紫光展锐5G扬帆出海 | Blade系列勇当拉美5G先锋

5G对拉丁美洲&#xff08;简称“拉美”&#xff09;绝大多数消费者来说还是一个新鲜技术。GSMA报告显示&#xff0c;过去五年&#xff0c;拉美运营商在移动网络方面的资本开支大部分用于部署4G网络。但在5G网络方面拉美也在积极大力投入中&#xff0c;紧跟全球5G发展大潮&#…

软件测试|Beautiful Soup库详细使用指南

简介 Beautiful Soup是一款强大的Python库&#xff0c;广泛用于解析HTML和XML文档&#xff0c;从中提取数据并进行处理。它的灵活性和易用性使得数据抽取变得简单&#xff0c;本文将详细介绍Beautiful Soup库的基本用法和示例。 安装Beautiful Soup 首先&#xff0c;需要确保…

软件测试工程师如何对算法做测试?

最近几年&#xff0c;随着大数据、人工智能等领域的快速发展&#xff0c;算法受到前所未有的重视&#xff0c;算法测试也随之兴起。 为了让大家能对算法测试有个初步的了解&#xff0c;这篇文章将对“如何做算法测试”进行梳理&#xff0c;大纲如下&#xff1a; 1、算法测试测…

C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录 22.1 引用其他程序集22.2 命名空间22.2.1 命名空间名称22.2.2 命名空间的补充22.2.3 命名空间跨文件伸展22.2.4 嵌套命名空间 22.3 using 指令22.3.1 using 命名空间指令22.3.2 using 别名指令22.3.3 using static 指令 22.4 程序集的结构22.5 程序集标识符22.6 强命名…

Python3.5如何打包编译

python3.5怎么打包编译 问题&#xff1a;用Python开发的小工具有时需要编译打包为Windows(*.exe)、Mac等操作系统下的可执行性文件以供非程序员使用。 解决方案&#xff1a; 一、py2exe 目前只支持到Python3.4&#xff0c;暂不支持Python3.5 二、PyInstaller 安装&#x…

【MATLAB】小波_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波-LSTM神经网络时序预测算法是一种结合了小波变换和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 小波变换是一种信号处理方法&#xff0c;能够将信号分解为…

2024年1月6日~2024年1月12日周报

目录 一、前言 二、SeisInvNet-2020 三、RTM研究 四、遇到的问题及解决 4.1 KeyError: data 4.2 将mat文件转换为npy文件 五、小结 5.1 存在的问题及疑惑 5.2 下周安排 一、前言 本周的主要安排是阅读论文查看一些好的点子。 但是想法总是美好的&#xff0c;之前答应的…

叠加文件夹内所有png文件 python

→ import os import cv2 import matplotlib.pyplot as pltPATH "./1" #文件路径 i 0 #子文件夹路径 img10 for parent, dirs, files in os.walk(PATH):for file in files:if not file.endswith(.png):continueimg cv2.imread(os.path.join(parent, file))if i0:i…

【Linux驱动】platform 设备驱动分离(一)—— 驱动分层及相关API

以目前为止的逻辑&#xff0c;无论是获取设备属性信息&#xff0c;还是实现驱动逻辑&#xff0c;都是放在一个驱动模块中。在没有设备树的情况下&#xff0c;如果我们只需要修改设备信息&#xff08;如寄存器地址&#xff09;&#xff0c;那么我们就需要重新编译整个驱动模块。…