C语言数组与指针内存本质解析:从概念到实战避坑指南
1. 项目概述从“存储”到“访问”的思维跃迁在C语言的世界里数组和指针是两座绕不开的山峰也是无数初学者从“会写代码”到“理解内存”的关键分水岭。很多人学了很久依然觉得数组就是数组指针就是指针顶多知道数组名可以当指针用。但真正在项目里尤其是涉及到性能优化、数据结构实现比如动态数组、字符串处理或者与底层硬件、操作系统接口打交道时对这两者关系的肤浅理解往往会成为bug的温床和性能的瓶颈。我自己在早期做嵌入式开发处理传感器数据流时就踩过坑试图用一个指针去遍历一个二维数组结果访问到了完全错误的内存区域导致系统采集的数据全部错乱。那一刻我才明白不理解数组和指针在内存中的本质写出的代码就像在沙地上盖楼随时可能坍塌。这个内容就是要把数组和指针那层“似是而非”的窗户纸彻底捅破。它不仅仅是语法更是一种对计算机内存模型的认知方式。无论你是正在学习C语言基础的学生还是工作中需要与C/C代码打交道的开发者甚至是使用其他语言但想深入理解“引用”、“迭代器”背后原理的程序员搞懂这对CP都能让你的编程功底扎实一大截。简单说数组是一种数据组织方式而指针是一种内存访问工具。但C语言巧妙或者说“狡猾”地让它们产生了千丝万缕的联系。本文将带你从内存布局的视角重新审视数组和指针不仅告诉你它们是什么更重点剖析它们为什么这样设计在实际编码中如何正确、高效地使用以及如何避开那些常见的“坑”。我们会从最基本的概念拆解到复杂的多维数组与指针运算最后落到字符串、函数参数传递等实际应用场景目标是让你看完后对a[i]、*(ai)、a[0]这类写法不再有丝毫困惑并能自信地运用指针去操作复杂的数据结构。2. 内存视角下的本质解构数组的“连续”与指针的“指向”要理解数组和指针必须抛弃纯语法的视角深入到内存的层面。你可以把计算机的内存想象成一个超级大的、带编号的储物柜阵列。每个储物柜就是一个字节Byte拥有一个唯一的门牌号这个门牌号就是内存地址。2.1 数组预定好的连续包厢当我们声明一个数组时比如int arr[5];我们向系统提出了一个明确的需求“请给我预留5个连续的、每个能存放一个int假设是4字节的储物柜。” 系统会在内存中寻找一块足够大的、连续的空间比如从门牌号0x1000开始到0x1013结束5 * 4 20字节即0x14个字节所以地址范围是 0x1000 到 0x10000x130x1013。元素索引元素值示例起始内存地址假设占用的“储物柜”字节arr[0]100x10000x1000, 0x1001, 0x1002, 0x1003arr[1]200x10040x1004, 0x1005, 0x1006, 0x1007arr[2]300x10080x1008, 0x1009, 0x100A, 0x100Barr[3]400x100C0x100C, 0x100D, 0x100E, 0x100Farr[4]500x10100x1010, 0x1011, 0x1012, 0x1013数组的核心特性连续性这5个int的储物柜必须是紧挨着的。这是数组能通过下标arr[i]进行O(1)时间复杂度随机访问的物理基础。知道了数组首地址和每个元素的大小要找到第i个元素只需做一次乘法和加法地址 首地址 i * sizeof(元素类型)。大小固定在声明时其长度包厢数量就确定了。在大多数使用场景下静态数组或栈上分配的数组这个大小在编译后就不能改变。这是数组与动态数据结构如链表最根本的区别之一。数组名arr的“双重身份”这是关键所在。在大多数表达式中数组名arr会被编译器“转换”decay为指向其第一个元素的指针即arr[0]其类型是int*。然而在两种特殊情况下它不代表指针sizeof(arr)这里arr代表整个数组对象计算的是整个数组占用的总字节数本例中为5 * sizeof(int) 20。arr这里取到的是“整个数组”的地址。虽然它的值和arr[0]一样都是0x1000但其类型是int (*)[5]即“指向长度为5的int数组的指针”。这个区别在指针运算时至关重要。2.2 指针存储地址的“遥控器”指针本身也是一个变量只不过这个变量里存储的不是普通数据而是另一个内存单元的“门牌号”地址。声明int *ptr;意思是ptr是一个变量它里面能存放一个int类型数据的地址。ptr arr[2];这个操作就像把储物柜arr[2]地址0x1008的门牌号写在了ptr这个便签上。现在ptr这个“遥控器”就指向了那个存放着值30的储物柜。指针的核心操作取地址运算符获取某个变量的内存地址。arr[2]得到的是0x1008。*解引用运算符根据指针存储的地址去访问那个地址里存储的值。*ptr就相当于去打开0x1008这个储物柜取出里面的值30。指针运算指针加减整数不是简单的数值加减而是以指向类型的大小为步长移动。ptr 1意味着0x1008 1 * sizeof(int) 0x100C即指向了arr[3]。这是指针和数组联系紧密的数学基础。实操心得理解“类型”是指针的灵魂指针的类型如int*、char*、double*不仅告诉你它指向的数据是什么类型更决定了指针运算的步长。char*加1地址前进1字节int*加1地址前进4字节假设int为4字节。在类型转换如void*转换或处理内存块时对步长的清晰认知能避免严重的越界访问错误。3. 关联与差异的深度辨析为何arr[i]等于*(arri)理解了内存模型数组和指针那著名的等价关系就很好解释了。C语言标准明确规定下标运算符[]的本质就是指针运算E1[E2]等价于*((E1) (E2))。这里的E1可以是指针也可以是数组名因为数组名在表达式中会转换为指针。所以arr[i]这个写法arr作为数组名被转换为指向首元素的指针int*值为0x1000。arr i进行指针运算得到地址0x1000 i * 4。最外层的*解引用这个地址访问到该位置的值。因此arr[i]完全等价于*(arr i)。同理*(ptr i)也等价于ptr[i]只要ptr指向一个有效的内存块比如它指向了某个数组的首元素。但是等价绝不意味着相同它们存在根本性差异特性数组 (int arr[5])指针 (int *ptr)内存角色数据本身。它定义了一块连续的内存空间来存储数据。数据的引用。它是一个独立的变量存储着另一个内存单元的地址。存储内容直接存储了5个整数。存储一个地址值通常8字节或4字节。sizeof返回整个数组的字节大小如5*420。返回指针变量本身的大小通常是8或4字节。赋值操作不能直接对数组名赋值。arr something;是非法的。可以改变指针的指向。ptr x; ptr arr;都是合法的。运算符arr得到的是“数组指针”(int(*)[5])类型不同。ptr得到的是“指针的指针”(int**)即存储指针变量本身的地址。可变性数组的大小和位置栈上或静态区通常固定。指针的指向可以随时改变非常灵活。一个经典误区辨析int arr[5] {1, 2, 3, 4, 5}; int *ptr arr; // ptr指向数组首元素 printf(%p\n, arr); // 输出数组首地址类型是int* printf(%p\n, arr); // 输出数组首地址类型是int(*)[5] printf(%p\n, ptr); // 输出ptr存储的地址即数组首地址 printf(%p\n, ptr); // 输出ptr变量自身的地址 printf(%ld\n, sizeof(arr)); // 输出20 printf(%ld\n, sizeof(ptr)); // 输出864位系统下指针大小 // 指针运算的差异 printf(%p\n, arr 1); // 地址增加4一个int大小指向arr[1] printf(%p\n, arr 1); // 地址增加20整个数组大小指向整个数组之后的位置arr 1这个操作是理解数组名和数组指针区别的绝佳例子。它跳过了整个数组常用于计算数组边界或进行某些内存检查。4. 多维数组与多级指针的迷宫导航一维数组和指针的关系还算清晰到了二维、三维数组以及对应的指针复杂度就上来了。但核心原则不变从内存布局出发。4.1 二维数组数组的数组声明int matrix[3][4];时你定义了一个“由3个数组组成的数组”每个子数组包含4个int。内存中依然是连续存放的先存放matrix[0]这个包含4个int的数组紧接着是matrix[1]然后是matrix[2]。逻辑视图内存线性视图地址递增matrix[0][0],matrix[0][1],matrix[0][2],matrix[0][3]地址Amatrix[1][0],matrix[1][1],matrix[1][2],matrix[1][3]地址A 16matrix[2][0],matrix[2][1],matrix[2][2],matrix[2][3]地址A 32关键点matrix是数组名类型是int [3][4]。matrix在表达式中会“退化”为指向其第一个元素的指针。它的第一个元素是什么是matrix[0]而matrix[0]本身又是一个int [4]的数组。所以matrix退化成的是一个指向数组的指针即int (*)[4]。matrix[0]是第一个子数组的数组名类型是int [4]它会退化为int*指向matrix[0][0]。因此matrix、matrix[0]、matrix[0][0]三者的值地址是相同的但类型截然不同这决定了它们进行1运算时的步长不同。4.2 指向数组的指针与指针数组这是两个极易混淆的概念指向数组的指针 (Pointer to Array)int (*parr)[4];声明了一个指针parr它专门指向一个含有4个int的数组。parr matrix;是合法的因为matrix的类型就是int (*)[4]。(*parr)[2]或parr[0][2]可以访问元素。指针数组 (Array of Pointers)int *arrp[3];声明了一个数组arrp它包含3个元素每个元素都是一个int*指针。这常用于存储多个字符串字符串常量地址或构建不规则的多维数据结构如行长度不等的二维数组。实操心得动态分配二维数组这是面试和实际项目中常见的问题。如果直接用int **p malloc(rows * sizeof(int*));然后每行再malloc你得到的是一个指针数组每行内存可能不连续。如果需要连续的、像真正二维数组一样的内存应该int (*matrix)[cols] malloc(rows * sizeof(*matrix)); // matrix是 int(*)[cols] 类型 // 或者 int *matrix malloc(rows * cols * sizeof(int)); // 分配一维大数组手动计算索引 i*cols j第一种方法通过“指向数组的指针”一次分配所有内存保证了连续性且可以用matrix[i][j]语法访问更直观。5. 字符串字符数组与字符指针的典型应用C语言没有真正的字符串类型字符串是通过字符数组或字符指针来模拟的。这恰恰是数组和指针知识最集中的应用场景。字符数组char str1[] Hello;在栈上分配6个字节包含结尾的\0str1是数组名内容可修改如str1[0] h;。字符指针指向字符串常量char *str2 World;str2是一个指针指向存储在只读数据区通常的字符串常量World。试图修改其内容如str2[0] w;是未定义行为通常会导致程序崩溃。常见问题字符串拷贝与比较因为数组名不能直接赋值所以str1 str2;是非法的。字符串操作必须使用函数拷贝strcpy(dest, src)需确保dest空间足够否则用strncpy比较strcmp(s1, s2)返回0表示相等连接strcat(dest, src)同样要注意目标缓冲区溢出避坑技巧永远警惕缓冲区溢出这是C字符串处理中最常见、最危险的安全漏洞。gets函数因其无法限制输入长度而被弃用应使用fgets替代。任何strcpy、strcat、sprintf等操作前都必须心里有数目标数组有多大源数据可能有多长使用带n的安全版本如strncpy、snprintf并正确处理结尾的\0是每个C程序员的基本素养。6. 函数参数传递数组“退化”为指针的实战这是数组和指针关系体现最直接的地方。当数组作为参数传递给函数时它总是会退化为指向其首元素的指针。这意味着void func(int arr[10]); // 函数声明 void func(int arr[]); // 等价声明 void func(int *arr); // 最本质的等价声明编译器眼中只看这个。无论你怎么写函数内部接收到的都是一个int*指针。因此在函数内部sizeof(arr)得到的是指针的大小而不是原数组的大小。数组的长度信息在传递过程中丢失了解决方案显式传递长度这是最常用、最安全的方法。void func(int *arr, size_t len);使用哨兵值像字符串以\0结尾一样在数组末尾放置一个特殊值来表示结束适用于元素值域有特殊值的情况。传递数组指针void func(int (*arr)[10]);这样函数就知道数组的维度但灵活性很差只能处理固定大小的数组。实操心得const修饰符的保护作用在函数参数中使用const可以明确意图防止意外修改。void print_array(const int *arr, size_t len);表示函数不会修改arr指向的内容。int find_max(const int *arr, size_t len);同理。 这既是良好的编程习惯也能让编译器进行更好的优化和错误检查。7. 复杂声明解析与typedef的简化魔法看到int (*(*func)(int))[10];这样的声明是不是头皮发麻这是“声明符”语法。有一个著名的右左法则可以帮助解析从标识符func开始。先看右边遇到)就看左边。*表示指针()表示函数[]表示数组。逐步向外解析。对于上面那个声明func是一个标识符。向右看是)所以向左看遇到*说明func是一个指针。跳出括号向右看遇到(int)说明这个指针指向一个函数该函数接受一个int参数。函数返回什么呢向左看遇到*说明返回一个指针。这个指针指向什么向右看是[10]说明指向一个大小为10的数组。数组里是什么类型向左看是int。 所以func是一个函数指针该函数接受一个int参数并返回一个指针该指针指向一个包含10个int的数组。简化利器typedef对于复杂的指针类型尤其是函数指针使用typedef可以极大提高代码可读性。typedef int (*FuncPtr)(int, int); // 定义FuncPtr为函数指针类型 FuncPtr fp some_function; // 声明变量就清晰多了 typedef int Array10[10]; // 定义Array10为包含10个int的数组类型 void process(Array10 *arr); // 相当于 void process(int (*arr)[10]);8. 常见陷阱、调试技巧与性能考量8.1 十大经典陷阱数组越界访问访问arr[5]有效索引0-4。这是最普遍的错误可能导致数据损坏、程序崩溃或安全漏洞。务必手动检查循环边界误用sizeof求数组长度在函数内部对指针参数使用sizeof(arr)/sizeof(arr[0])会得到错误结果。混淆指针和数组的sizeofsizeof(ptr)是指针大小sizeof(arr)是数组总大小。对字符串常量进行写操作char *p literal; p[0] L;这是非法操作。使用未初始化的指针int *p; *p 10;野指针操作后果不可预测。返回指向局部变量的指针函数结束后局部变量的内存被回收返回的指针悬空。指针类型不匹配的算术运算int *p; p (int*)0x1000; p;结果是0x1004如果你本意是字节地址加1就错了。混淆和*的优先级*p是取p指向的值后p自增(*p)是p指向的值自增。用比较两个字符串的内容这比较的是地址是否相同而不是字符串内容是否相等。必须用strcmp。忘记字符串的终止符\0手动构建字符串时必须在末尾添加\0否则strlen、printf等函数会一直读取直到遇到内存中的随机\0导致溢出或错误输出。8.2 调试与排查技巧使用调试器GDB/LLDB这是最强大的工具。可以查看指针的值地址、解引用的值、监视表达式如*ptr10查看连续10个元素。打印地址和值在关键位置用printf(“%p: %d\n”, (void*)ptr, *ptr);输出指针和内容。静态分析工具如clang的-fsanitizeaddress地址消毒剂可以在运行时检测数组越界、使用后释放等问题。代码审查对于复杂的指针运算和数组访问人工走查代码逻辑非常有效。8.3 性能考量局部性原理数组由于内存连续访问时缓存命中率高性能远优于在堆上随机分配并通过指针链接的数据结构如链表。在需要频繁遍历、随机访问的场景数组是首选。指针与下标访问现代编译器优化能力很强对于arr[i]和*(arri)生成的代码效率通常没有区别。选择哪种取决于代码清晰度通常arr[i]可读性更好。多级间接访问int **pp这样的多级指针访问最终数据需要多次内存解引用先取pp的值得到p的地址再取p的值得到数据的地址比直接访问数组或一级指针慢。在性能关键路径上应尽量减少间接层级。理解数组和指针最终是为了更好地驾驭内存。它们一个提供了高效、可预测的内存布局数组另一个提供了灵活、动态的访问能力指针。C语言的强大和危险都源于此。当你能够熟练地在“数组的确定性”和“指针的灵活性”之间游刃有余地切换并能清晰地洞察每一个操作背后的内存变化时你才算是真正摸到了C语言乃至系统编程的门道。这需要大量的练习和踩坑但一旦掌握你对程序的理解将不再浮于表面语法而是深入到计算机工作的核心机制中去。

相关新闻

变速箱油更换全流程实测:从原理到实践,科学验证换油效果

变速箱油更换全流程实测:从原理到实践,科学验证换油效果

1. 一个老司机的“油”虑:变速箱油到底该不该换? “变速箱油到底要不要换?”这个问题,几乎每隔一段时间就会在我的车友群里被翻出来讨论。有人说“车是修坏的,不是开坏的,别瞎折腾”,也有人说“…

2026/8/18 23:17:07 阅读更多 →
小模型大智能:从Faraday 27B看智能体框架如何超越模型参数

小模型大智能:从Faraday 27B看智能体框架如何超越模型参数

如果你最近关注AI智能体领域,可能会被一个看似“离谱”的消息刷屏:一个名为Faraday的27B参数模型,在论文复现任务上,不仅超越了Claude 3 Opus,甚至在某些维度上超过了GPT-4o。这听起来像是一个典型的“标题党”——一个…

2026/8/18 23:17:07 阅读更多 →
2026 三角洲全品类护航七大品牌横评|知悦电竞登顶!预算党、新手玩家一站式避坑榜单

2026 三角洲全品类护航七大品牌横评|知悦电竞登顶!预算党、新手玩家一站式避坑榜单

‍开篇引言:玩家实测数据佐证,直击封号、隐形加价、售后失联、打手冷暴力四大行业痛点一、权威测评溯源说明(全样本可核验,零付费榜单中立评测)2026 年《三角洲行动》双端玩家体量持续爆发,物资护航、排位上…

2026/8/18 23:17:06 阅读更多 →

最新新闻

本地AI工具升级指南:从灵沐V6平滑升级到V6.1的完整流程

本地AI工具升级指南:从灵沐V6平滑升级到V6.1的完整流程

这次我们来看一个本地AI工具升级的实操过程:灵沐V6升级到V6.1。如果你正在使用灵沐V6进行AI绘画、语音合成或其他本地AI应用,并且收到了V6.1的更新推送,那么这篇文章就是为你准备的。升级过程本身不复杂,但涉及模型文件、配置文件…

2026/8/20 4:10:46 阅读更多 →
从限速到满速:百度网盘真实下载链接获取完全指南

从限速到满速:百度网盘真实下载链接获取完全指南

从限速到满速:百度网盘真实下载链接获取完全指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 晚上十点,同事发来一份 2GB 的项目资料包,…

2026/8/20 4:10:46 阅读更多 →
把高性能 PC 装进口袋:Sunshine 开源串流服务器实践手册

把高性能 PC 装进口袋:Sunshine 开源串流服务器实践手册

把高性能 PC 装进口袋:Sunshine 开源串流服务器实践手册 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你坐在沙发上,手里是平板电脑,想玩那台…

2026/8/20 4:10:46 阅读更多 →
基于可验证环境与自我蒸馏的深度搜索智能体进化框架

基于可验证环境与自我蒸馏的深度搜索智能体进化框架

1. 项目概述:当搜索智能体需要“自我进化”最近在探索大模型与具身智能结合的前沿领域时,一个名为“DeepSearch-World”的项目引起了我的注意。这个项目直指一个核心痛点:如何让一个基于大语言模型(LLM)的深度搜索智能…

2026/8/20 4:10:46 阅读更多 →
Flow-ERD:基于流匹配与熵正则化蒸馏的多样化交通流仿真技术

Flow-ERD:基于流匹配与熵正则化蒸馏的多样化交通流仿真技术

1. 项目缘起:为什么我们需要“多样化的交通流仿真”?如果你做过自动驾驶仿真,或者研究过交通流预测模型,肯定遇到过这样的困境:仿真出来的车流,要么千篇一律、过于理想化,像个训练有素的军队&am…

2026/8/20 4:10:46 阅读更多 →
隐形红外人体感知模块:从原理到实战,实现静动检测与智能交互

隐形红外人体感知模块:从原理到实战,实现静动检测与智能交互

1. 项目概述:什么是“隐形”红外人体接近与运动感知模块?在智能家居、安防监控、节能控制乃至一些创意交互项目中,我们常常需要一个能“感知”人存在的“眼睛”。但摄像头涉及隐私,毫米波雷达成本高且复杂,而传统的热释…

2026/8/20 4:09:46 阅读更多 →

日新闻

Framework笔记本BIOS更新变砖,“可维修”承诺遭遇芯片级维修考验!

Framework笔记本BIOS更新变砖,“可维修”承诺遭遇芯片级维修考验!

Framework笔记本BIOS更新引“变砖”危机2026年7月7日,Framework向用户quantum5发送邮件,建议其安装BIOS 3.20更新。然而,更新后电脑出现严重问题,屏幕显示三角形和随机像素图案,风扇狂转,系统完全挂起。qua…

2026/8/20 0:00:46 阅读更多 →
2026还在担忧建站平台哪家好?手把手带你搭建自家网站!

2026还在担忧建站平台哪家好?手把手带你搭建自家网站!

2026还在担忧建站平台哪家好?手把手带你搭建自家网站!据艾瑞咨询发布的《2026年中国企业数字化服务市场研究报告》,2025年国内网站建设市场规模已达896亿元,同比增长18.7%。中国互联网络信息中心数据显示,截至2025年底…

2026/8/20 0:00:46 阅读更多 →
2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?

2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?

2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?据艾瑞咨询《2026年中国企业数字化服务市场研究报告》,2025年国内网站建设市场规模已达896亿元,其中高端定制网站服务占比突破42%。更值得关注的是,91%的规模以上企业…

2026/8/20 0:00:46 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/19 11:55:18 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 9:46:27 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/19 11:55:16 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/19 5:04:55 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/19 7:42:22 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/19 11:55:13 阅读更多 →