1. 关于数组的首地址:
#include <stdio.h> int main(void) { char cs[2][3] = { {'A','B','C'}, {'D','E','F'} }; char *p1,*p2,*p3,*p4; p1 = p2 = p3 = p4 = NULL; /* 下面四个指针都是指向了同一个地址 */ p1 = &cs[0][0]; /* 这个最好理解 */ p2 = &cs[0]; p3 = &cs; p4 = cs; /* 这个最方便 */ printf("%p\n%p\n%p\n%p\n", p1, p2, p3, p4); /* 显示地址 */ printf("\n%c %c %c %c\n", *p1, *p2, *p3, *p4); /* 显示内容 */ getchar(); return 0; }
2. 数组其他元素的地址:
例子中, 数组的元素在内存中应该是这样排列的:
[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]
下面是通过指针的方式获取数组的第三个元素:
#include <stdio.h> int main(void) { int nums[2][3] = { {11, 12, 13}, {21, 22, 23} }; int *p1,*p2; p1 = p2 = NULL; p1 = &nums[0][2]; p2 = nums; p2 = p2 + 2; // p2 = (int *)nums + 2; /* 或者用这一句替换上面两行 */ printf("%d, %d\n", *p1, *p2); getchar(); return 0; }
3. 遍历数组的普通方法:
#include <stdio.h> int main(void) { int nums[2][3] = { {11, 12, 13}, {21, 22, 23} }; int i,j; for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { printf("%d\n", nums[i][j]); } } getchar(); return 0; }
4. 通过指针遍历数组:
#include <stdio.h> int main(void) { int nums[2][3] = { {11, 12, 13}, {21, 22, 23} }; int *p = nums; int i; for (i = 0; i < 6; i++) { printf("%d\n", *(p+i)); } getchar(); return 0; }
#include <stdio.h> int main(void) { char cs[2][3] = { {'A','B','C'}, {'D','E','F'} }; char *p = cs; unsigned i; for (i = 0; i < sizeof cs / sizeof cs[0][0]; i++) { printf("%c\n", *p++); } getchar(); return 0; }
#include <stdio.h> int main(void) { char cs[2][3] = { {'A','B','C'}, {'D','E','F'} }; int i; for (i = 0; i < 6; i++) { printf("%c\n", *(*cs + i)); // *cs 是什么? 看下例 } getchar(); return 0; }
5. 再探数组的指针地址:
#include <stdio.h> int main(void) { char cs[2][3] = { {'A','B','C'}, {'D','E','F'} }; //在本例中(二维数组) // cs 是指向数组 cs[0] 的地址 // *cs 是指向 cs[0][0] 的地址 printf("%p, %p\n", cs, *cs); // **cs 指向 cs[0][0] 的值 printf("%c, %c\n", **cs, cs[0][0]); getchar(); return 0; }
6. 使用指针遍历三维数组:
#include <stdio.h> int main(void) { char cs[2][2][3] = { { {'A','B','C'}, {'D','E','F'} }, { {'1','2','3'}, {'4','5','6'} } }; int i; int count = sizeof cs / sizeof cs[0][0][0]; for (i = 0; i < count; i++) { printf("%c\n", *(**cs + i)); } getchar(); return 0; }
7. 遍历多维数组还是用指针变量更容易理解:
#include <stdio.h> int main(void) { char cs[2][2][3] = { { {'A','B','C'}, {'D','E','F'} }, { {'1','2','3'}, {'4','5','6'} } }; char *p = (char *)cs; /* 相对上面的例子, 这里加了类型转换; 这样编译器就没有提示了 */ int i; int count = sizeof cs / sizeof cs[0][0][0]; for (i = 0; i < count; i++) { printf("%c\n", *p++); } getchar(); return 0; }
分类:
学习 C 语言
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2007-11-28 刷新网页
2007-11-28 把字符串复制到剪贴板
2007-11-28 如果一个对象不存在