c语言如何理解指针的指针?

news/2024/5/24 8:38:12/ 标签: c语言, 开发语言

1.啥叫指针?

在C语言中,指针是一个非常重要的概念。指针本质上是一个变量,它的值不是数据本身,而是存储数据的内存地址。指针允许程序直接访问和操作内存中的数据,这在很多情况下非常有用,比如在处理数组、字符串和动态内存分配时。

文绉绉的,好讨厌,我来说点人话吧~

让我们用一个现实生活中的比喻来理解指针的概念:

  大家想象一下你正在参观一个大型图书馆,这个图书馆有很多书架,每个书架上都摆满了书籍。在这个比喻中,书籍代表数据,书架代表内存,而图书馆的索引卡片则是指针。

  每张索引卡片上写着一个书名和它所在的书架号。当你想找一本书时,你首先查看索引卡片上的书名和书架号,然后根据这些信息去相应的书架上找到那本书。在这个过程中,索引卡片就像是指针,它不包含书的内容(数据本身),但它告诉你去哪里找到这本书(数据所在的内存地址)。

  在C语言中,指针的工作方式与此类似:

  • 指针变量就像是索引卡片,它存储了一个地址,这个地址指向内存中的一个位置,那里存储着你想要的数据(书籍)。
  • 当你声明一个指针变量时,就像你拿到了一张索引卡片。例如,int *p;声明了一个指针变量p,它可以指向一个整型数据(一本书)。
  • 当你给指针变量赋值时,就像你在索引卡片上写下了书名和书架号。例如,p = &variable;,这里&variable是获取variable变量地址的操作,相当于找到了书的确切位置。
  • 当你通过指针访问数据时,就像你根据索引卡片上的信息去书架上找书。例如,*p是解引用指针p的操作,它让你能够访问指针指向的内存位置的数据,就像根据索引卡片找到并阅读书籍。

  通过这个比喻,我们可以理解指针在C语言中的作用:

它们不是直接存储数据,而是存储数据的位置信息,允许程序直接访问和操作内存中的数据。

2.啥叫指针的指针?

指针的指针,或者说指向指针的指针,是一个更高级的指针概念,它在C语言中用于更复杂的数据结构和内存管理中。

要理解这个概念,我们可以从简单的指针开始,然后逐步深入。

首先,回顾一下基本的指针概念:

  • 一个指针是一个变量,它存储的是另一个变量的内存地址。
  • int *p;` 声明了一个指针`p`,它可以指向一个`int`类型的变量。

  现在,让我们考虑指针的指针。这意味着我们有一个指针,它存储的不是普通变量的地址,而是另一个指针变量的地址。这可以用来创建指向指针的数组、动态分配多维数组等。```c

int **pp; // 声明一个指向指针的指针
int *p; // 声明一个普通指针
int var = 10; // 声明一个整型变量p = &var; // p 现在指向 var 的地址
pp = &p; // pp 现在指向 p 的地址,即 pp 是一个指向指针的指针

  在这个例子中,`pp` 是一个指向`p`的指针。`p`本身是一个指向`var`的指针。所以,如果你想要通过`pp`访问`var`的值,你需要先解引用`pp`来获取`p`,然后再解引用`p`来获取`var`的值。

int value = **pp; // 通过解引用pp来访问var的值

  这里的`**pp`是两次解引用操作:第一次解引用`pp`得到`p`,第二次解引用`p`得到`var`的值。

  让我们用一个比喻来帮助理解:

  想象一下,你有一个文件柜,里面有很多文件。每个文件都有一个编号,你通过这个编号来找到文件。这里的文件编号就像是变量的地址,而文件柜就像是指针。现在,假设你有另一个文件柜,里面存放的是文件编号的清单。这个文件柜的每个编号不再指向一个文件,而是指向第一个文件柜中的一个文件编号。这个第二个文件柜就是一个指向指针的指针。


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

相关文章

基于Canvas实现的简历编辑器

基于Canvas实现的简历编辑器 大概一个月前,我发现社区老是给我推荐Canvas相关的内容,比如很多 小游戏、流程图编辑器、图片编辑器 等等各种各样的项目,不知道是不是因为我某一天点击了相关内容触发了推荐机制,还是因为现在Canvas…

bug(警告):[vue-router] Duplicate named routes definition: …

查看警告:[vue-router] Duplicate named routes definition——翻译[vue-router]重复命名路由定义 小编劝诫:当我们在开发过程中警告也一定不要忽略,虽然你在本地跑代码时这些警告影响项目的正常运行,但是会让你产生误区&#xff…

Go语言入门|包、关键字和标识符

目录 Go语言 包文件 规则 关键字 规则 标识符 规则 预定义标识符 Go语言 Go语言是一种静态类型、编译型和并发型的编程语言,由Google开发。Go的源代码文件以.go为扩展名,文件名通常与包名保持一致。一个Go文件可以包含多个顶级声明,…

ubuntu上安装调试SVN服务

刚成立团队需要临时搭建一台SVN服务器,所以对照网上的一些提示做了下,操作起来不复杂,还是踩了不少坑,顺便原理性了解了下。 主要操作步骤如下: 1:安装svn sudo apt-get install subversion 2: 创建svn版…

数组和指针的联系(C语言)

数组和指针是两种不同的数据类型,数组是一种构造类型,用于存储一组相同类型的变量;而指针是一种特殊类型,专门用来存放数据的地址。数组名除了sizeof(数组名)和&数组名表示整个数组外,其他情况下都表示的是首元素的…

Android开发——ListView

activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_height"match_parent"android:layout_width"match_parent"…

EasyExcel追加写入数据,分批查询多次写入场景下,注意使用方式【OOM警告】

使用.withTemplate(file) 将临时数据文件和真实数据文件合并的方式&#xff0c;在生产环境大批量数据下&#xff0c;完全不可取&#xff0c;有很高的内存溢出风险 伪代码 public static void writeAppend(String fileName) {String filePath "tempDir".concat(Fil…

Android rxjava

一.简介 RxJava是ReactiveX在JVM上的一个实现&#xff0c;ReactiveX使用Observable序列组合异步和基于事件的程序的库&#xff1b;是一个基于事件流、实现异步操作的库。RxJava在Java环境下使用&#xff0c;它通过Observable&#xff08;可观测对象&#xff09;和Subscriber&a…

Android之图片压缩几种方式

大概可以分为以下几类&#xff1a;更换图片格式&#xff0c;质量压缩&#xff0c;采样率压缩&#xff0c;缩放压缩&#xff0c;调用jpeg压缩等 1.设置图片格式 Android目前常用的图片格式有png&#xff0c;jpeg和webp&#xff0c; png&#xff1a;无损压缩图片格式&#xff0…

代码随想录算法训练营第三十六天| 435.无重叠区间、763.划分字母区间、56.合并区间

系列文章目录 目录 系列文章目录435. 无重叠区间贪心算法按左边界排序&#xff08;与【452. 用最少数量的箭引爆气球】思路差不多&#xff09; 763.划分字母区间贪心算法①将字符串映射到哈希数组&#xff0c;用二维数组记录每个字母存在的区间&#xff0c; 转化为重叠区间问题…

Rust 语言使用 SQLite 数据库

SQLite 是一种广泛使用的轻量级数据库&#xff0c;它通过简单的文件来承载数据&#xff0c;无需复杂的服务器配置。正因如此&#xff0c;它成为了许多桌面和移动应用的首选数据库。在 Rust 生态中&#xff0c;rusqlite 库为开发者提供了操作 SQLite 数据库的简洁且有效的方法。…

Python 编程必备技能:解包。简化代码,提高效率

在 Python 中&#xff0c;解包&#xff08;Unpacking&#xff09;是指将一个序列&#xff08;列表、元组等&#xff09;或字典中的元素解开&#xff0c;分别赋值给多个变量的过程。解包可以方便地将序列或字典中的元素分别取出来&#xff0c;用于后续的处理和操作。 在 Python…

深入了解MindOpt优化求解器的License服务

在商业和研究领域&#xff0c;高效的数学优化求解器是解决复杂问题的关键工具。MindOpt求解器以其卓越的性能和广泛的应用场景成为众多专业人士的首选。但在享受其强大功能的同时&#xff0c;了解和选择合适的License服务是至关重要的。本篇博客将详细介绍MindOpt优化求解器的L…

python/pygame 挑战魂斗罗 笔记(二)

一、建立地面碰撞体&#xff1a; 现在主角Bill能够站立在游戏地图的地面&#xff0c;是因为我们初始化的时候把Bill的位置固定了self.rect.y 250。而不是真正的站在地图的地面上。 背景地图是一个完整的地图&#xff0c;没有地面、台阶的概念&#xff0c;就无法通过碰撞检测来…

MacOs 安装thrift-0.5.0

下载thrift-0.5.0.tar.gz https://archive.apache.org/dist/incubator/thrift/0.5.0-incubating/ 安装thrift 解压&#xff1a;tar -zvxf thrift-0.5.0.tar.gz 进入解压目录&#xff1a;cd thrift-0.5.0 编译命令&#xff1a;./configure --prefix/usr/local/ --with-boo…

Hadoop 3.1.3

第1章 Hadoop概述 1.1 Hadoop是什么 1.2 Hadoop发展历史&#xff08;了解&#xff09; 1.3 Hadoop三大发行版本&#xff08;了解&#xff09; Hadoop三大发行版本&#xff1a;Apache、Cloudera、Hortonworks。 Apache版本最原始&#xff08;最基础&#xff09;的版本&#x…

Rust 构建跨平台 GUI 的新选择

在现代软件开发过程中&#xff0c;用户界面&#xff08;GUI&#xff09;的设计与实现是不可或缺的一环。随着Rust编程语言的崛起&#xff0c;其安全性、性能和并发特性使其成为开发高质量GUI应用的理想选择。relm框架&#xff0c;作为Rust生态中的一员&#xff0c;提供了一种声…

51单片机学习笔记——点亮数码管、模块化编程

工作原理图 138译码器 G1、G2A、G2B为138译码器的使能端 P22、P23、P24为输入口控制Y0-Y7的动作&#xff0c;以二进制的算法 具体如下&#xff1a; P22 P23 P24 0 0 0 Y0为1其余为0 0 0 1 Y1为1其余为0 0 1 0 Y2…

解决mac本git安装后找不到命令的问题

不熟悉mac配置&#xff0c;折腾了半天&#xff0c;记录一下。 1.问题描述2.解决方法 1.问题描述 从https://sourceforge.net/projects/git-osx-installer/files/下载的git安装包&#xff1a; 安装时提示&#xff1a; 这里的解决办法是按住control键再打开文件安装。 安装完…

每日一博 - 重新定义JAR中的类或方法

文章目录 概述方式一 &#xff1a; 项目覆写相同包结构的类方式二&#xff1a; 魔改Jar包中的类方案对比方案一&#xff1a;在项目中新增第三方包路径方案二&#xff1a;替换JAR包中的类文件 概述 在一些情况下&#xff0c;我们可能需要定制第三方库的行为&#xff0c;但却无法…