【C语言】指针基础知识理解【续】

1. ⼆级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?这就是 ⼆级指针

1.1 引入二级指针

由于一级指针已经很熟悉,这里就不再赘述,这里我们重点探讨二级指针

下面先简单使用一个二级指针看看

int main()
{int a = 10;int* pa = &a;int** ppa = &pa;return 0;
}

1.2 如何拆解二级指针类型

我们看到ppa的类型是 int** ,我们该如何理解指针的类型呢?

我们可以把两颗星号拆开来看

int* * ppa = &pa;

其中一颗 * 是在说明ppa是指针变量,⽽前⾯的 int* 是在说明pa指向的是整型指针(int*)类型的对象。

通过下图就更好理解:

int a = 10; 相当于向内存申请4个字节空间,这是变量a的空间,该空间对应一个内存的地址,它的地址假设为0x0012ff50,赋值为10,也就是将这个空间存放一个 10 。a的类型是整型。

int* pa = &a; 创建了一个指向整型的指针变量 pa,然后通过 &a 取出变量 a 的内存地址,取出的是第一个字节地址,也就是0x0012ff50,并将该地址赋值给指针变量 pa 。pa的类型是整型指针类型(int*)。另外指针变量也就是变量,也就是向内存申请了4个字节(32字节)或者8个字节(64位)空间,该空间对应一个内存的地.址,它的地址假设为0x0012ff48

而int** ppa = &pa; 则创建一个指向整型指针的指针变量 ppa,然后通过 &pa 取出指针变量 pa 的内存地址,取出的是第一个字节地址,也就是0x0012ff48,并将该地址赋值给指针变量 ppa 。pa的类型是整型指针的指针类型,也就是二级指针类型(int**)。

1.3 二级指针解引⽤

我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢?

我们只要拿到了地址(指针),就可以使用解引用操作符(*)通过地址(指针)找到地址(指针)指向的对象。

*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa .
 

int b = 20;
*ppa = &b;//等价于 pa = &b;

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a .

**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

2. 指针数组

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

我们类⽐⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。

那指针数组呢?是存放指针的数组。

整型数组和字符数组

指针数组的每个元素都是⽤来存放地址(指针)的。

如下图:

指针数组的每个元素是地址,⼜可以指向⼀块区域。

3. 指针数组模拟⼆维数组

我们可以通过指针数组来模拟出二维数组。

 

#include <stdio.h>int main()
{int arr1[] = { 1,2,3,4,5 };  // 定义并初始化第一个整数数组 arr1int arr2[] = { 2,3,4,5,6 };  // 定义并初始化第二个整数数组 arr2int arr3[] = { 3,4,5,6,7 };  // 定义并初始化第三个整数数组 arr3// 定义一个指针数组 parr ,其中每个元素都是指向整数的指针// 并分别将 arr1、arr2、arr3 的地址赋给 parr 的元素int* parr[3] = { arr1, arr2, arr3 };int i = 0;int j = 0;for (i = 0; i < 3; i++)  // 外层循环控制遍历 parr 数组的元素{for (j = 0; j < 5; j++)  // 内层循环控制打印每个数组的元素{printf("%d ", parr[i][j]);  // 通过 parr[i] 可以得到对应的数组的地址,然后通过 [j] 来访问数组中的元素并打印}printf("\n");  // 换行,以便每个数组的打印结果分开显示}return 0;
}

模拟的是下图过程: 

 

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,

parr[i][j]就是整型⼀维数组中的元素。

上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀行并⾮是连续的。

 

本期博客介绍的二级指针、指针数组只是让同学们初步认识, 

后面的指针学习章节我们更加深入的学习和使用,希望这几节指针的学习,不断提高自己的内功!


 完

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

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

相关文章

TPAMI 2024 | 全新框架!深度学习可解释度量学习!

TPAMI 2024 | 全新框架&#xff01;深度学习可解释度量学习&#xff01; DIML: Deep Interpretable Metric Learning via Structural Matching 题目&#xff1a;DIML: 通过结构匹配的深度可解释度量学习 作者&#xff1a;Wenliang Zhao, Yongming Rao, Jie Zhou , and Jiwen…

C++笔试强训10

文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 前面做过很多次了&#xff0c;记住就好&#xff0c;不在赘述&#xff0c;选C。 内联函数经常使用的场景包括&#xff1a; 小型函数&#xff1a;当函数体非常小&#xff0c;只包含几条语句时&#xf…

【C++】模板的特化

文章目录 概念函数模板特化类模板特化全特化偏特化 概念 通常情况下&#xff0c;使用模板可以实现一些与类型无关的代码&#xff0c;但是有一些类型需要特殊处理&#xff0c;否则可能会得到一些错误的结果。 比如&#xff0c;在比较两个数的大小时&#xff0c;如果传入两个变量…

手动上电电路(电路收藏)

SW1按下 V1栅极对地 V1通 Vout给Mcu工作 GPIO2 高电平 V2通 SW1松开 V1栅极依然通过V2对地 维持V1通 Vout。再次按下SW1 GPIO1 对地 使Mcu收到中断 将GPIO2 输出低电平 V2关 松开SW1 V1栅极悬空 V1断开 Vout被截断

产品思维之什么是好的设计?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

原生微信小程序wxml2canvas生成海报并包保存至本地

Wxml2Canvas是什么&#xff1f; Wxml2Canvas 是一个用于微信小程序开发的工具库&#xff0c;主要用途是将小程序页面的内容绘制成图片&#xff0c;以便生成海报或保存分享图片到相册等功能。具体用途包括&#xff1a; ①海报生成功能&#xff1a;允许开发者将当前页面的特定部…

【机器学习】决策边界的基本概念以及如何在逻辑回归中找到决策边界

引言 在机器学习中&#xff0c;决策边界是分类算法用来区分不同类别数据点的线、面或超平面。这些边界通常是模型的预测规则&#xff0c;用于将特征空间中的点分配到不同的类别。决策边界可以是线性的&#xff0c;也可以是非线性的&#xff0c;取决于数据的分布和所使用的分类算…

鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇

一、概述 云数据库是一款基于对象模型的数据库&#xff0c;采用存储区、对象类型和对象三级结构。 数据模型 存储区 存储区是一个独立的数据存储区域&#xff0c;多个数据存储区之间相互独立&#xff0c;每个存储区拥有完全相同的对象类型定义 --类似于关系型数据库中的da…

ECMA6Script学习笔记(五)

【摘要】 本文是对自己学习ES6的学习笔记回顾,后面是概要: 本文介绍了ES6中的对象创建和拷贝方法。对象创建方面&#xff0c;ES6通过class关键字支持了面向对象的语法糖&#xff0c;包括属性设置、getter和setter方法、构造器、静态方法以及私有属性的定义。同时&#xff0c;展…

专业做护眼灯的有哪些品牌?五款市面主流护眼灯专业测评

专业做护眼灯的有哪些品牌&#xff1f;市面上出现的品牌毫不夸张的说&#xff0c;真的算得上是琳琅满目&#xff0c;而且每一个品牌都在说自己的产品才是最值得的&#xff0c;这种情况下来&#xff0c;很多人一时之间根本就不知道要选择哪一款比较好。而且还有一些还会买到低劣…

vue基础知识总结(2)--- axios的使用

一.下载Vue3&#xff1a; 选择自己想要下载的项目文件夹&#xff0c;cmd回车打开命令栏&#xff0c;执行 &#xff1a; cnpm init vuelatest 然后等待一会就可以创建一个项目&#xff0c;并更改项目名&#xff1a; √ 请输入项目名称&#xff1a; ... vue-project 之后按照…

华为仓颉语言测试申请

1. 申请网址 HarmonyOS NEXT仓颉语言开发者预览版 Beta招募- 华为开发者联盟 点击立即报名登录华为账号 勾选选项 , 点击同意 按要求填写信息即可 2. 申请通过后官方会通过邮件的方式发送相关下载途径 , 根据文档进行下载即可 package Cangmain(): Int64 {println("你…

AI技术修复奥运珍贵历史影像,《永不失色的她》再现百年奥运女性光彩

Greatness of HER &#xff01; AI致敬 , 了不起的「她」。 7月25日&#xff0c;在国际奥委会和各方力量的支持下&#xff0c;阿里云以AI技术修复奥运珍贵历史影像&#xff0c;让百年奥运女性的伟大光彩被看见&#xff0c;并在巴黎推出《永不失色的她》全球首映礼。 国际奥委会…

Graph Contrastive Learning via Interventional View Generation

发表于:WWW24 推荐指数: #paper/⭐⭐ 框架与动机: 整体框架 动机: 如上四个: b.HLCL 生成随机增强视图,并分别用高通过滤器和低通过滤器过滤 c.生成同配异配视图,都用低通过滤器 d.生成同配视图异配视图,同配视图用低通过滤器,异配视图用高通过滤器 通过图d,我们可以得出:d&g…

基于Material studio拉伸-断裂过程的Perl脚本

在材料科学的研究中&#xff0c;拉伸-断裂过程一直是科学家们探索的焦点。这一过程涉及复杂的力学行为和材料内部微观结构的变化&#xff0c;对于理解材料的性能至关重要。然而&#xff0c;传统的实验方法不仅耗时耗力&#xff0c;而且难以捕捉到微观尺度上的所有细节。 为了满…

网站如何实现HTTPS访问

要实现网站通过HTTPS协议访问&#xff0c;主要依赖于为网站部署SSL/TLS证书。 SSL&#xff08;Secure Sockets Layer&#xff09;是用于在互联网上加密数据传输的安全协议。部署了SSL证书之后&#xff0c;网站就可以通过HTTPS&#xff08;超文本传输安全协议&#xff09;来提供…

C# Unity 面向对象补全计划 之 初识继承方法与多态

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 1.继承方法 C# & Unity 面向对象补全计划 之 继承&#xff08;字段与属性&…

Java真人版猫爪老鼠活动报名平台系统

&#x1f43e;“真人版猫爪老鼠活动报名平台系统”——趣味追逐&#xff0c;等你来战&#xff01;&#x1f42d; &#x1f431;【萌宠变主角&#xff0c;现实版趣味游戏】 厌倦了电子屏幕的虚拟游戏&#xff1f;来试试“真人版猫爪老鼠活动”吧&#xff01;在这个平台上&…

PHP进阶-CentOS7部署LNMP服务架构的项目

在开发和部署Web应用时&#xff0c;LNMP&#xff08;Linux、Nginx、MySQL、PHP&#xff09;的组合是非常常见的。这篇博客将介绍如何通过一个简单的脚本&#xff0c;在CentOS 7上部署LNMP&#xff0c;并将PHP项目自动部署到服务器上。这不仅可以节省大量的时间&#xff0c;还能…

一个接口未做超时处理,引发数据库hang了

前言 在代码开发过程中&#xff0c;你是否会经常遇到以下问题&#xff1f; 数据库连接被瞬间占用&#xff0c;出现性能瓶颈 系统资源被大量占用&#xff0c;出现锁等待或性能下降 事务日志大量增长 上述这些状况的出现可能是未提交事务引发的。该类事务开启后&#xff0c;…