C语言指针初级

news/2024/12/2 23:48:09/

目录

一、什么是指针

二、指针和指针类型

三、野指针

1.野指针的成因:

2.如何规避野指针

四、指针运算

1.指针+-整数

2. 指针之间的加减

五、二级指针

六、指针数组


一个男人,到底要走多少的路,才能成为一个真正的男人

本专栏适用于有一定C语言基础并且还要继续学习的人 

往期回顾:

C语言函数详解

C语言操作符详解

C语言实现扫雷及进阶

C语言实现三子棋

C语言实现猜数字游戏

C语言for循环详解

C语言初学可能会遇到的问题(一)

文章质量在努力提高中...

指针是C语言的精髓,用好它,将能真正发挥C语言的强大功能。博主已经将指针的基础用法为大家准备好,并富有大量图解,有需要学习的朋友可以收藏保存,也欢迎大家与博主讨论,后续将会推出C语言指针的进阶内容。

一、什么是指针

指针是内存中一个最小单元的编号,也就是地址

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

每一个变量的创建,编译器都会给它分配一块空间来存储,而变量在这些空间中以二进制补码的形式存储,不了解补码的可以去看C语言操作符详解中有详细介绍。每一块内存空间都有对应的地址编号,这些地址在内存中是连续的,像门牌号一样,指针就相当于日常生活中的门牌号,通过某人的门牌号,就可以找到这个人。同样,拿到了指向某个变量的指针,就可以通过解引用,找到这个变量,然后对这个变量进行操作。

那么如何将地址(指针)存入指针变量中呢

a为int型,占四个字节,&a是将a的第一个字节的地址存放在指针变量p中。

指针的大小:在32位平台是4个字节,在64位平台上是8个字节

二、指针和指针类型

指针类型的意义:决定了p指向的对象类型;p解引用时可以访问的对象的字节数;决定了指针+/-整数操作时的步长。

(1)指针指向的数据为啥类型,一般就将指针类型定义为啥类型,比如指针要指向一个整形变量,就将这个指针定义为int*

(2)解引用时可以访问的对象的字节数;如果有特殊要求的话,可以修改指针类型为与自己解引用时想访问的字节数相等的数据类型

例如,在解引用时想访问1个字节的内容,即可将指针类型定义为char*类型,在解引用时想访问4个字节的内容,即可将指针类型定义为int*

(3)指针加减整数时的步长;指针加1,跳过的字节数

三、野指针

野狗:就是没有主人的狗(大多数,只是个例子);那么野指针,就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)

野指针是很‘危险’的,容易造成内存的非法访问。

1.野指针的成因:

(1) 指针未初始化

未初始化是指定义指针的时候,没有规定它指向的位置,如下面的指针p,那它现在就是一个野指针

(2)指针越界访问

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

当i=11时,循环继续执行,指针p访问的范围已经超过来了数组arr的范围,因为数组外的值是未知的,而可以通过解引用p访问到数组外,所以当这次循环执行后,p就成了野指针。

(3)指针指向的空间释放

2.如何规避野指针

(1)指针初始化

如果在定义指针时不知道指针应该指向哪里,可以先初始化为空指针   int*p=NULL;初始化为空指针后,在后面使用这个指针时即可直接修改指针要指向的对象

(2)小心指针越界

用指针对数组进行操作时,要防止指针指向数组外的空间,指针所指对象超出数组范围后,这个指针就会变成野指针,变得不可控

(3)指针指向空间释放,及时置NULL

比如,当调用函数结束后,函数里面的局部变量会销毁,如果有指向这个局部变量的指针,那么这个指针就会变成野指针,当这个变量的空间释放后,及时将指针改为空指针

(5)避免返回局部变量的地址

指针p所指向的是test函数的返回值,为局部变量a的地址,但这个值所占用的空间已经在函数调用结束后还给了操作系统,所以再通过解引用指针p去访问这个变量就是非法的,即使如图解引用后可以访问的到,也是不允许的

(6)指针使用之前检查有效性

在每次使用指针时要先判断,这个指针是不是空指针,不是空指针,才能对这个指针进行操作

四、指针运算

1.指针+-整数

指针在+-整数时,向前/向后跳过指针对应的字节数,一般情况下,在数组中进行指针+-整数的情况会多一些,因为数组中的元素是连续存放的,且每一个元素的数据类型都相同,所以指针加1再解引用,就可以访问到下一个元素,指针减1在解引用也可以访问到上一个数组元素

这段代码可以清晰地看出数组与指针之间的关系

2. 指针之间的加减

指针减指针:得到两个指针之间的元素个数

p指向数组首元素,q指向数组最后一个元素,他们之间有9个元素,因此q-p=9

指针加指针,没有实际意义

五、二级指针

二级指针指向的对象是指针

*p可以找到a,那么**q也能找到a,先对*q找到p,再对p解引用找到a,即  *(*q),简写为**q

六、指针数组

真正的男人,主语是男人。那么指针数组,主语也就是数组,存放指针的数组

指针数组,就是存放指针的数组,即数组的每一个元素都是指针(地址)

 将指针数组与二级指针结合起来

 在这里插入图片描述

本文收录于水火莲花-C疑难专题           C语言学习专题​​​​​​

这两个专题可用于正在学习C语言,并且有一定基础的人,专栏持续免费更新中...


http://www.ppmy.cn/news/78577.html

相关文章

Delphi中根据分类数据生成树形结构的最优方法

一、 引言&#xff1a; TreeView控件适合于表示具有多层次关系的数据。它以简洁的界面&#xff0c;表现形式清晰、形象&#xff0c;操作简单而深受用户喜爱。而且用它可以实现ListView、ListBox所无法实现的很多功能&#xff0c;因而受到广大程序员的青睐。 树形结构在…

Operators

Operators DataStream Transformations # DataStream 程序 在Flink里是一个常规操作,对数据流进行转换(mapping, filtering, reducing) Functions 转换接收用户定义的函数作为输入, 以定义转换的功能 Implementing Function Interfaces # 不同的函数接口用于不同的转换在…

微信外h5跳转小程序3中方式

1.转短链接跳转小程序&#xff08;支持微信内外&#xff09; 目前限制50wc次 微信h5浏览器环境内打开app&#xff1a;目录 | 微信开放文档 微信小程序内跳转app:打开 App | 微信开放文档 先转短链接 文档&#xff1a;获取scheme码 | 微信开放文档 2.微信公众号h5内跳转小程…

大纲目录以及一到五---设计模式概览讲解

转自&#xff1a;提升工作效率-设计模式概览讲解 一、什么是设计模式 设计模式是解决软件设计中常见问题的经过实践验证的最佳解决方案。它是一种在特定环境中解决特定问题的模板或者说是一种思维方式。设计模式不是一段可以直接复制粘贴到代码中的代码&#xff0c;而是用于解…

ChatGPT 使用 拓展资料:开始构建你的优质Prompt

ChatGPT 使用 拓展资料:开始构建你的优质Prompt

塞尔达工业革命卷到数字电路了!网友:怕不是要在Switch里造Switch

量子位 | 公众号 QbitAI 《塞尔达传说&#xff1a;王国之泪》发布一周多&#xff0c;懂物理的和不懂物理的都沉默了。 如果说&#xff0c;一个打怪靠冷兵器的救公主游戏&#xff0c;主角开上带悬挂的摩托车&#xff0c;还不算稀奇&#xff1a; △B站up主&#xff1a;天舐鱼XQ…

《开箱元宇宙》爱心熊通过 The Sandbox 与粉丝建立更紧密的联系

你们有没有想过 The Sandbox 如何融入世界上最具标志性的品牌和名人的战略&#xff1f;在本期《开箱元宇宙》系列中&#xff0c;我们与 Cloudco Entertainment 的数字内容顾问 Derek Roberto 聊天&#xff0c;了解为什么爱心熊决定在 The Sandbox 中试验 web3&#xff0c;以及他…

上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今年的校招基本已经进入大规模的开奖季了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好…