哥终于征服了c的多维数组指针
一个小例子,把一个字符串按逗号分隔,放到一个字符串数组里,字符串在C里也是用字符数组表示的,所以就要声明一个两位数组。
声明指针变量有几种情况,
- 指向单个值,如int,用int *p;
- 指向数组,如一个元素类型为int,长度为3的数组,用 int (*p)[3];
我们所要的数组是4个字符串,每个字符串是3个长度(加上'\0'),所以我们先声明一个指向元素为char,长度为3的数组指针char (pc*)[3];
然后分配空间的时候我们分配4块儿这么长的空间,即malloc(4*3*sizeof(char));
都初始化为'\0',memset(pc,'\0',4*3*sizeof(char));
剩下的就是访问第一个字符数组的时候用*pc,也就是pc[0],访问第二个字符数组用*pc++,也就是pc[1],刚不是说pc是个指针吗,怎么还可以用下标访问,这不就成了数组了吗?经我观察,确实差不多,以下两段代码是一回事(不考虑内存分配细节),得到的pc变量使用起来一模一样。
第一段:c是栈上分配的二维数组,pc是一个指向它的数组指针,热了,一个是数组指针,一个是二维数组,竟然能指过去,看来C不是强类型语言,内存里存的啥都不管,直接用一个带类型的指针去指,指成啥是啥,汗了。
char c[4][3] = {{'\0'}};
char (*pc)[3] = c;
char (*pc)[n] = (char(*)[n])malloc(m*n*sizeof(char));
memset(pc,'\0',m*n*sizeof(char));
以下是完整的代码,cygwin+gcc 3.4.4编译通过

#include <stdio.h>
#include <string.h>
int main()
{
int i = 0, m = 4, n = 3;
char *input = "a1,b2,c3,d4";
char (*pc)[n] = (char(*)[n])malloc(m*n*sizeof(char));
memset(pc,'\0',m*n*sizeof(char));
char (*pc1)[n] = pc;
char *p1 = strtok(input, ",");
while(p1 != NULL)
{
strncpy(*pc++, p1, 2);
p1 = strtok(NULL, ",");
}
pc = pc1;
for(i = 0; i < m; i++)
{
printf("xxx%d=%s\n",i,*pc++);
}
free(pc1);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构