椋鸟C语言笔记#20:指针数组、指针模拟二维数组、数组指针、二维数组传参的本质、字符指针与字符串

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

萌新的学习笔记,写错了恳请斧正。


目录

指针数组

指针模拟二维数组

数组指针

数组指针的初始化

二维数组传参的本质

字符指针与字符串


指针数组

整型数组存放整型,那么指针数组自然是存放指针的数组。

要定义一个指针数组,我们应该像这样写:

int* parr[3] = { pa, pb, pc };

因为方括号的优先级要高于解引用操作符,所以parr先与方括号结合,规定其为数组。其中存储的数据类型为int*(整型指针)。

指针模拟二维数组

#include <stdio.h>

int main()
{
    int arr1[] = {1,2,3,4,5};
    int arr2[] = {2,3,4,5,6};
    int arr3[] = {3,4,5,6,7};
    int* parr[3] = {arr1, arr2, arr3};
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; i++)
    {
        for(j=0; j<5; j++)
        {
            printf("%d ", parr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

上述代码就是用指针数组来模拟实现一个三行五列的二维数组

parr[i]是访问parr数组的元素,找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数
组中的元素。
上述的代码模拟出二维数组的效果,但实际上并非不是二维数组,每一行不是连续的。

数组指针

相反的,那数组指针就是指向数组的指针

但是如果我们写成下面这样,定义的就是指针数组而不是数组指针

int* parr[3] = { pa, pb, pc };

所以我们就要避免parr与方括号先结合,导致被认为是数组

那么就只需加一个括号就行:

int (*parr)[3] = &arr;

这样parr先与解引用操作符结合,被认为是指针,指向int [3]类型的数据(数组)

数组指针的初始化

可以看到,上面我是通过取地址数组名来初始化数组指针的。

因为数组指针是指向整个数组的,一般只能用这种方式来初始化与赋值(数组名的特例,上一篇笔记讲了)(类型应当是这种格式:int[3] *)

二维数组传参的本质

我们之前把二维数组作为参数传递给函数是这么写的:

#include <stdio.h>

void func(int arr[8][9], int m, int n)
{
    //...
}

int main()
{
    int arr[8][9] = { 0 };
    func(arr, 8, 9);
    return 0;
}

实参是二维数组名,形参直接写成二维数组

我们知道,二维数组其实是元素为一维数组的数组

根据数组名是数组首元素的地址,二维数组的数组名表示的就是第一个一维数组的地址

上述代码中,第一行的一维数组的类型就是 int [9],所以第一行的地址的类型就是数组指针类型 int(*)[9]。所以说二维数组传参本质上也是传递了地址,传递的是第一个一维数组的地址,那么形参也是可以写成指针形式的。如下:

#include <stdio.h>

void func(int (*arr)[9], int m, int n)
{
    //...
}

int main()
{
    int arr[8][9] = { 0 };
    func(arr, 8, 9);
    return 0;
}

字符指针与字符串

字符指针,就是指向字符的指针

一般我们这么用:

#include <stdio.h>

int main()
{
    char ch = 'a';
    char* pch = &ch;
    printf("%c", *pch);
    return 0;
}

但是,我们 看看下面这一段代码:

#include <stdio.h>

int main()
{
    const char* pch = "abc";    //这里const可以省略
    printf("%s", pch);
    return 0;
}

这一段代码其实也是对的,能正常打印字符串abc,那我们如何理解呢?

首先我们要知道一点,%s作为格式控制字符,接受的其实是字符串第一个字符的地址。随后从这个地址开始,一个一个打印字符,直到遇到\0为止

那第一句怎么理解呢?难道是把字符串存储在字符指针pch中吗?

不是的,这里就涉及到字符串双引号的作用了。

字符串的双引号有3个作用:

  • 在常量区申请一片空间用于存放字符串
  • 在字符串结尾加上\0
  • 返回字符串第一个字符的地址

所以第一句其实是创建了字符串常量并将首元素地址传递给pch

那么,我们其实也就可以这么写:

#include <stdio.h>

int main()
{
    printf("%s", "abc");
    return 0;
}

这样,同样可以将字符串abc打印出来。

!!!注意!!!

用等号对字符数组整体赋值只能与初始化同时进行,不能分开!

初始化的时候使用等号只是规定了其一开始指向的位置。在初始化完成后数组名就是一个指向首元素地址的指针常量了,不能进行等号赋值操作(不能改变指向)。

这时如果想整体赋值可以使用strcpy函数(后面会讲)

为了更好的理解字符串双引号的作用,我们来看看这一段代码:

#include <stdio.h>

int main()
{
    char str1[] = "abcdef";
    char str2[] = "abcdef";
    const char *str3 = "abcdef";    //const可省略
    const char *str4 = "abcdef";    //const可省略

    if (str1 == str2)
        printf("str1 and str2 are same\n");
    else
        printf("str1 and str2 are not same\n");
    if (str3 == str4)
        printf("str3 and str4 are same\n");
    else
        printf("str3 and str4 are not same\n");

    return 0;
}

上述代码的输出结果是什么呢?

答案是:

str1 and str2 are not same.

str3 and str4 are same.

为什么呢?

因为str1与str2是两个字符数组变量的首元素的地址,而创建的两个数组的首元素地址肯定不一样,所以输出的就是str1 and str2 are not same.

而str3和str4是创建的字符指针,其指向的是由双引号在常量区创建的字符串常量abcdef。常量不像变量一样会重复创建,所以两个指针最终指向的其实就是同一个地址,输出str3 and str4 are same.


第28篇 sw放样特征矩形-圆-矩形学习笔记 本例演示三轮廓放样:先画中心对齐的100×100矩形草图,再在偏移100的基准面上绘制圆,最后在另一基准面画矩形。通过依次选择三个轮廓并正确设置连接点,实现矩形→圆→矩形的平滑过渡,注意连接点位置避免扭曲。 阅读详情

相关推荐

计算机组成原理课程设计_微程序控制的简单模型机设计

微程序控制的简单模型机设计 要求 基本要求 完成一个简单主机的设计,模型机应具备如下能力:在自行设计的指令集基础上,运行自行编写的简单用户程序,实现特定运算功能。 弹性要求 在此基础上,完成必要的扩展,实现模型机的功能扩展设计,包括:实现多种运算功能(指令集的扩充)、支持更为丰富的寻址方式、有更为完善的微程序设计等。 实验软件和硬件环境 QuartusII, FPGA计算机组...

sailist的记录站 3万+

static 的三种用法:C 语言里一个关键字的三张面孔

本文系统讲解 C 语言中 static 关键字的三种用法:修饰局部变量延长生命周期、修饰全局变量与函数限制作用域到本文件。通过一个包含三个文件的完整工程示例对照演示,并从存储期、作用域与链接性三个属性解释其统一原理,最后补充单元测试框架偏爱 static 函数的工程实践。

大模型全栈工程师 · Thanks_ks 306

madgwick算法基于MPU9250姿态融合漂移问题的原因

基于MPU9250的madgwick算法姿态漂移问题原因 0、声明 因为这个是现象是不是共性目前本人还没研究过,只是在个体问题研究的基础上得出的结论,或许我买到的MPU9250是一个盗版:),所以只具备参考性。 1、现象 使用MPU9250的加速度计、角速度计、磁力计(AK8963)原始数据输入到madgwick算法中,得到的姿态最终会在停止姿态变化后仍然漂移一小段时间。其中加速度计和角速度计读取速率为400hz,磁力计为100hz,加速度计采样范围±2g,角速度计采样范...

GreedyZombie的博客 3872

MySQL建库建表操作学习笔记

SQL(Structured Query Language,结构化查询语言)是用于在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。:用于定义对数据库对象(库、表、列、索引)的操作,如 CREATE、DROP、ALTER、RENAME、TRUNCATE 等。保存可变长度的字符串(可包含字母、数字以及特殊字 符)。:用于定义对数据库记录的操作,如 INSERT、DELETE、UPDATE、SELECT 等。:用于定义对数据库、表、字段、用户的访问权限和安全级别,如 GRANT、REVOKE 等。

Eternitycai的博客 222

TortoiseGit之配置密钥

基于github的开发必须要用到rsa密钥,因此需要用到TortoiseGit的putty key generator工具,来生成既适用于github的rsa密钥也适用于TortoiseGit的ppk密钥。

欧文的博客 2077

J1939协议实用指南与J1939数据记录方案

“没错,这是一份SAE J1939简单、实用指南。”—虹科 **开篇:**在这篇介绍中,我们介绍了J1939协议的基本知识,其中包括PGN和SPN。因为这是一篇偏向应用的简介,所以您还将会学习到如何通过DBC文件解码J1939数据、如何记录J1939、典型的应用案例和实用技巧。下面,来了解下这份简单易懂的J1939介绍吧~ 什么是J1939? 简而言之,SAE J1939其实是一套标准,重型车辆ECU间就是按照这套标准在CAN总线上进行通信的。当今大多数车辆都通过CAN(Controller Area Ne

1万+

【FreeRTOS源码学习笔记】任务创建

【FreeRTOS源码学习笔记】任务创建

2502_90565057的博客 459

【OS】AUTOSAR OS Alarm实现原理

AUTOSAR OS Alarm实现原理

qq_36056498的博客 1022

新概念英语第一册 · 词法笔记

以《新概念英语第一册》为范围,梳理 10 类词性中的 8 类:名词的数与所有格、冠词、代词、形容词副词比较级、数词与时间、介词、动词四类与 have 的四种用法、情态动词与不定式,附易错 TOP12 与课次顺序。

Ep流苏的博客 194

iOS安全和逆向系列教程 第18篇:iOS应用脱壳技术详解与实战

iOS应用脱壳技术详解与实战 摘要: 本文深入剖析了iOS应用脱壳技术,首先解释了加壳(如FairPlay DRM)与脱壳的基本概念及必要性。通过otool命令可以检测应用的加密状态。文章详细介绍了三种主流脱壳工具:经典dumpdecrypted工具的使用方法、现代化Clutch工具的安装配置以及基于Frida的高级脱壳方案frida-ios-dump。针对特殊情况,还提供了使用LLDB手动dump内存的技术细节,包括查找基地址、计算dump范围和内存读取等操作。最后介绍了修复Mach-O文件头的Pytho

一个自学不成材的程序员 710

188、LLC谐振变换器的样机调试实战(EMI测试)

本文分享了LLC谐振变换器EMI调试的实战经验。作者通过300W电源案例,指出LLC的EMI问题主要来自谐振腔共模电流和死区振铃,并提出三板斧解决方案:优化功率回路布局、合理选择共模电感、正确配置X/Y电容。文章详细分析了谐振电容位置、MOSFET走线、变压器屏蔽等关键设计要点,并列举示波器探头、滤波器接地等常见误区。最后强调EMI调试70%依赖布局优化,建议预扫测试、数据记录并保留6dB余量。全文以实际案例贯穿,为LLC电源EMI设计提供了实用指导。

Jack010169的博客 54

选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP

本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。

ACP广源盛的博客 218

YOLOv8融合HAttention:激活更多像素的注意力机制科研实践指南

HAttention通过层级化像素激活与融合的设计,为YOLOv8的像素级特征利用能力带来了质的飞跃。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决像素信息遗漏难题”的具体实践。如果你在实验中发现某类细节或大尺度目标的检测仍有不足,可以尝试结合数据增强(如随机裁剪、多尺度训练)来强化模型对像素特征的学习能力。科研的价值在于不断挖掘技术的潜力,希望这份指南能真正帮你在目标检测的像素级特征利用领域找到新的突破点,祝你在科研探索中持续收获创新与成长。

FJN110的博客 105

2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程

小红书小工具制作的核心不是复杂开发,而是把需求压缩成纯前端轻交互,并按平台要求完成 ZIP 交付。适合做的方向是测试、计算器、生成器、学习小测和记录工具;不适合做的方向是账号体系、云端数据、支付和远程接口。制作时先确认沙箱限制,再整理输入、计算、输出链路,最后通过 Builder Hub 提交审核并挂载笔记。在需求简单、素材较少的情况下,十几分钟做出一个可用的小工具是现实路径,袋马就是一个选择。

qq_39308835的博客 266

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Linux】APT 本地 deb 安装与 `-f` 参数总结笔记

apt install ./xx.deb 可自动解析并安装依赖,无需 -f;-f 仅用于修复已损坏的依赖状态,非首次安装时必需。apt install -f 可单独运行,修复 broken dependencies。两者职责不同:前者是安装与依赖解决,后者是故障修复。完全离线时需提前准备依赖包或本地源。

hknaruto的专栏 209

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

闪光灯笔记

主体后常亮补光,相机快门速度两秒,相机固定在三脚架上,让主体保持不动,按下快门之后主体周围晃动灯棒。特点:人物清晰,背景车流灯光拖在人物身后,氛围感强,就是 A7R3 + 神牛外帘同步的目标效果。总时长 = 8÷10=0.8s 👉 A7R3 相机:M 档,快门 1s,f/8,ISO100。上图:前帘同步,车向前行驶,光轨跑到车头前面,看着很怪。例:6 次,4Hz → 6÷4=1.5s → 相机快门设置≥1.5s,推荐 2s。缺点(慢速快门拍运动物体):闪光先把人定住,之后人物继续移动,在传感器上,

oDianZi1234567的博客 272

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 557

【LTE L3 笔记 10】LTE物理信道-PUCCH、PUSCH

课程来源:B站《【2022】华为HCIA-LTE无线工程师认证学习中级视频》笔记为个人整理,含课件截图,仅供学习交流。

lyouhuan的博客 178

邓明 Agent 系统面试-意图识别学习笔记

不要只是做意图识别而不做测评,就好像要评估 RAG 准确性,在接口服务要测试响应时延,超时控制等等,这里也要关注意图识别准确率,如果面试官认为项目指标太高是在吹牛,关键就是回答因为 Agent 解决的是特定领域的意图识别,识别场景单一,另外就是因为用户输入相对简单。意图识别影响 prompt/spec 的加载,意图识别影响上下文组织,意图识别影响工具选择,意图识别影响 prompt 建议,意图识别得到的意图不是让模型随机生成而是候选类别里去做选择。2.意图识别的原因,以及意图识别得到的是什么?

m0_57222081的博客 212

【LTE L3 笔记 05】LTE同步信号

课程来源:B站《【2022】华为HCIA-LTE无线工程师认证学习中级视频》笔记为个人整理,含课件截图,仅供学习交流。

lyouhuan的博客 114

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 352

硬件选型笔记:HDMI2.0 转 DP1.4 主动桥接方案 GSV2125D@ACP 评估

本文记录 GSV2125D HDMI2.0 转 DP1.4 主动桥芯片规格与工程调试问题,适合便携屏、HDMI 转 DP 转接器、图像采集板前期方案评估,重点关注 DP 链路训练、EDID、HDCP 兼容性边界。

ACP广源盛的博客 288

Arduino-MEGA-ESP单片机理论课笔记-06温湿度-07时间-延时定时-2026

本文解析了DHT11温湿度传感器的Arduino代码,逐行讲解了库引入、引脚定义、传感器初始化及数据读取流程。重点说明了delay(1000)导致阻塞的问题,并提出使用millis()实现非阻塞定时,将采样间隔改为2秒,提升程序响应性。同时建议增加isnan()错误检测、优化串口输出格式,确保数据稳定可靠。

zhangrelay的专栏 333

【学习笔记】51单片机 模块化编程

模块化编程:把各个模块的代码放在不同的c文件里,在.h文件里提供外部可调用函数的声明,在其他.c文件想使用其中的代码时,只需要#include"xxx.h"文件即可。传统方式编程:所有的函数均放在main.c中,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码组织和管理,而且很影响编程者的思路。使用LCD602液晶屏作为调试窗口,提供类似printf函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录,安全目录,自定义)

2601_96469072的博客 222

Obsidian 小团队共享笔记库的同步实测:Nutstore Sync 权限与协作能力综合测评

小团队用 Obsidian 的瓶颈在权限与数据底座。本文实测 Nutstore Sync 的团队能力:OAuth 免配置登录零培训接入,五种同步策略按角色分配,无冲突合并与 Diff3 搭配 AI 兜底多人同时编辑,共享文件夹上传下载/仅下载/仅预览三层权限,历史版本与回收站容错。核心是协作库与个人库分离。结论:对没有专职 IT 的小团队,这是目前把 Obsidian 升级为团队知识管理平台最好的方案。

xiaolantongxue_的博客 559

【论文阅读笔记】Score Centering 如何稳定存在训练-推理不匹配的强化学习

大语言模型强化学习里,负责生成 rollout 的 sampler 和负责计算梯度的 trainer 往往不是完全同一个数值系统,二者之间存在训练-推理不匹配(training-inference mismatch,TIM)

iiiiii11的博客 477
上一篇: 椋鸟C语言笔记#19:数组名、指针访问数组、一维数组传参的本质
下一篇: 椋鸟C语言笔记#21:函数指针、函数指针数组(转移表)、typedef及其必要性
椋鸟Starling
博客等级 码龄3年 447粉丝 57原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椋鸟Starling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值