C语言天花板——指针(初阶)

🌠🌠🌠

大家在刚刚接触C语言的时候就肯定听说过,指针的重要性以及难度等级,以至于经常“谈虎色变”,但是今天我来带大家走进指针的奇妙世界。🎇🎇🎇


一、什么是指针🤔

指针理解的两个要点:

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

2️⃣平常口语中说的指针,通常指的是指针变量,是用来存放地址的变量

数据存储在内存中,是以二进制的方式进行存储的,每一个二进制找到它对应的地址存储起来

例如这样的一个整型变量a,在内存中他的存储方式就是:

我们可以看到这样一个一个的格子,这一个格子便是我们的内存单元,单位是字节,上面代码中的整型变量a,就占四个字节,也就是图中红色区域开辟的空间,里面存的就是变量a。  🎊🎊🎊                                                                                                                                                                🥳🥳🥳                                                              🥳🥳🥳                               单元编号 == 地址 == C语言中的“指针”

二、指针类型 🤔

同数据类型一样,指针也分各种类型,如图:

值得注意的是指针大小是固定的,在32位的环境下占4位,64位的环境下占8位

那么在抛出一个问题,既然所占字节大小都一样为什么还要区分指针类型呢?

指针类型有意义么?🤔🤔🤔

1️⃣指针类型决定了在解引用操作的时候,访问了几个字节

在int类型的指针中,解引用会访问4个字节

在char类型的指针中,解引用只会访问1个字节

2️⃣指针类型决定了指针在+1/-1跳过了几个字节

三、野指针🤔

概念:指针指向的位置是不可知,不确定的,随机的。

野指针成因:

1️⃣指针未初始化

2️⃣指针越界访问

3️⃣ 指针指向的空间释放

如何规避野指针:

🎇指针初始化

🎇避免指针越界

🎇指针指向的空间释放,指针及时置NULL

🎇避免返回局部变量的地址

🎇指针使用之前检查其有效性

四、指针运算🤔

1️⃣整数加减整数

指针+-整数->实际上是移动了一个指针类型的大小,而指针大小一般是4/8个字节

int main(){int arr[] = { 10,9,8,7,6,5,4,3,2,1 }int* p = arr;p++;
return 0;
}

2️⃣指针-指针

前提:两个指针指向的是同一块区域,指针类型是相同的

int main()
{int arr[10] = { 0 };//指针-指针的前提:两个指针指向同一块区域,指针类型时相同的//指针-指针差值的绝对值,指针和指针之间的元素个数printf("%d\n", &arr[9] - &arr[0]);printf("%d\n", &arr[0] - &arr[9]);return 0;
}

结论:指针-指针得到的差值的绝对值是指针与指针之间的元素个数

五、二级指针🤔

概念:二级指针变量是存放一级指针变量的地址的

int main()
{int a = 10;int* p = &a;//p是指针变量,一级指针变量int** pp = &p;//pp指针变量,二级指针变量//int** * ppp = &pp;//pp是指针变量,三级指针变量//......return 0;
}

其实指针不止有一级指针和二级指针,还有三级四级甚至是多级,但是我们在正常情况下很少可以用到。

六、指针数组🤔

指针数组是指针还是数组?🤔

答案:是数组,是存放指针的数组🛹🛹🛹

字符数组:存放字符的数组

整型数组:存放整形的数组

指针数组:存放指针(地址)的数组

int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };//指针数组int* arr[] = { arr1,arr2,arr3 };return 0;
}

注意:(数组名可以表示首元素的地址)

今天我们的指针就讲到这里,之后我还会更新一些更高阶的指针,感谢大家的支持!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebGL 正确处理对象前后的关系——隐藏面消除(深度测试)/ 深度冲突

目录 前言 验证WebGL处理对象前后关系的规则——后绘制的图形覆盖先绘制的图形 隐藏面消除(深度测试) 开启隐藏面消除功能,需要遵循以下两步: 1.开启隐藏面消除功能。 gl.enable()函数规范 2.在绘制…

2023常用的原型设计软件推荐

美观易操作的产品原型可以帮助团队构建积极的用户体验,帮助团队理解产品交互逻辑。 因此,可互动、易修改的产品原型设计对产品的点击率和回访率具有重要意义。 选择专业的产品原型设计工具,可以为团队和企业带来高效的产品设计体验。本文选…

ddtrace 系列篇之 dd-trace-java 项目编译

dd-trace-java 是 Datadog 开源的 java APM 框架,本文主要讲解如何编译 dd-trace-java 项目。 环境准备 JDK 编译环境(三个都要:jdk8\jdk11\jdk17) Gradle 8 Maven 3.9 (需要 15G 以上的存储空间存放依赖) Git >2 (低于会出现一想不到的异常&#xf…

Linux JAVA环境的搭建tomcat的部署(含多实例)

tomcat tomcat是Apache软件基金会项目中的一个核心项目由 Apache、Sun 和其他一些公司及个人共同开发而成。tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器. tomcat的组成 tomcat用于支持Java Servlet和JSP。它是一个重要的We…

flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单AdaptiveTextSelectionToolba样式UI效果

flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单样式UI效果 在开发过程中,需要长按TextField输入框cut、copy设置为中文“复制、粘贴”,我首先查看了TextField中的源码,看到了ToolbarOptions、AdaptiveTextSelectionToo…

AI与医疗保健:革命性技术如何拯救生命

文章目录 引言AI的应用领域1. 影像识别2. 疾病诊断3. 药物研发4. 个性化治疗 AI技术1. 机器学习2. 深度学习3. 自然语言处理4. 基因组学 实际案例1. Google Health的深度学习模型2. IBM Watson for Oncology3. PathAI的病理学分析 道德和隐私考虑结论 🎉欢迎来到AIG…

实验4 交换机端口隔离(access模式)

交换机端口隔离(access模式) 实验目的实验拓扑实验步骤(1)在未划分vlan前,配置pc1、pc2的地址,如图所示(2)测试两台pc机的连通性(3)创建vlan,并验…

按键点亮led灯

原理图: K0这个按键按下时,开发板D1这个灯亮,松开,灯灭 代码如下: #include "stm32f4xx.h" void LED_Init(void) {//1.定义一个GPIO外设的结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//RCC_AHB1PeriphClockCmd(RCC_AHB1Pe…

Linux底层基础知识

一.汇编,C语言,C,JAVA之间的关系 汇编,C语言,C可以通过不同的编译器,编译成机器码。而java只能由Java虚拟机识别。Java虚拟机可以看成一个操作系统,Java虚拟机是由汇编,C&#xff0c…

分享一下微信商城如何添加新客有礼活动

一、新客有礼活动的优势 新客有礼活动是一种非常有效的营销策略,通过向新用户提供优惠和礼品,可以吸引更多的用户关注和购买。以下是一些新客有礼活动的优势: 吸引新用户:新客有礼活动可以吸引更多的新用户关注和购买&#xff0c…

12306 抢票小助手: 完整易用的抢票解决方案 | 开源日报 0917

testerSunshine/12306 Stars: 31.4k License: MIT 12306 购票小助手是一个使用 Python 编写的项目,主要功能包括自动打码、自动登录、准点预售和捡漏、智能候补以及邮件通知等。该项目具有以下核心优势: 支持多个版本的 Python提供验证码本地识别功能可…

docker四种网络模式

文章目录 一.为什么要了解docker网络二.docker 网络理论三.docker的四类网络模式3.1 bridge模式3.2 host模式3.3 container模式3.4 none模式 四.bridge模式下容器的通信4.1 防火墙开启状态4.2 防火墙关闭状态 一.为什么要了解docker网络 当你开始大规模使用Docker时&#xff0…

Springboot部署服务器项目上线

第一步,项目打包,有两种方式 第一种、直接在项目根目录打开终端,输入以下语句即可。如下图: mvn clean package -DskipTests 第二种、在右侧点击 Maven选项,选择鼠标左键双击package选项即可。如下图: 两…

CocosCreator3.8研究笔记(十七)CocosCreator UI组件(一)

CocosCreator 中,用户界面 User-interface(UI)组件和2d渲染对象的区别在于2D 渲染对象一般只负责将2D 对象渲染出来,而 UI 则更多的承担着用户交互的能力。 常用的 UI 控件可通过添加节点的方式来创建。 在 层级管理器 中点击左上…

算法宝典1——Java版本(此系列持续更新,这篇文章有20道)(有题目的跳转链接)(此份宝典包含了链表、栈、队列、二叉树的算法题)

注:由于字数的限制,我打算把算法宝典做成一个系列,一篇文章就20题!!! 目录 一、链表的算法题(目前10道) 1. 移除链表元素(力扣;思路:前后指针&…

宋浩概率论笔记(六)样本与统计量

参数估计的入门章节,为后面的参数估计与假设检验铺垫基础,难点在于背诵公式,此外对于统计量的理解一定要清晰——本质是多个随机变量复合而成的函数~

ARM接口编程—Interrupt(exynos 4412平台)

CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需要一段时间后再次询问,周而复始中断 CPU执行程序时若硬件需要其服务,对应的硬件给CPU发送中断信号,CPU接收到中断信号…

MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、字符…

在c#中使用CancellationToken取消任务

目录 🚀介绍: 🐤简单举例 🚀IsCancellationRequested 🚀ThrowIfCancellationRequested 🐤在控制器中使用 🚀通过异步方法的参数使用cancellationToken 🚀api结合ThrowIfCancel…

js创建动态key的对象ES6和ES5的方法

前提: 有个场景,循环数组,根据每一项的值,往一个数组中push一个新对象,对象的key不同要从数组中获取 情况解析:push没有什么问题,问题就是创建一个动态key的对象。下面就说一下如何以参数为key…