C语言 二维数组指针(二)
执行结果截图:
代码:
#include <stdio.h>
void testTwoDimArrPotFunc(int arr[][4])
{
arr[0][4] = 100;
}
int main()
{
int array[][4] = {
{0,1,2,3,},
{4,5,6,7,},
{8,9,10,11}};
// 二级指针的缺点是不清楚数组的列数,指针跨度与数组不一致,跨度太细
// 指针p + 1 与 指针array + 1 (从其指向的地址上看)跨度不一样
int * * p = array;
// 数组指针的优点是可以知道二维数组的列数,
// 一维数组指针p类似于字符指针数组中的行字符串的指针
int (* p1) [4] = array;
// 二维数组指针p2,要用&取二维数组的地址赋值给p2,
// 二维数组指针p2的行数和列数与数组array一一对应
// 因为指针有二级,所以解引用要有三级
int (* p2) [3][4] = &array;
int i;
int j;
printf("p:%p\np + 1: %p\n", p, p + 1);
printf("* p:%p\n* p + 1: %p\n", * p,* p + 1);
printf("array:%p\narray + 1: %p\n", array, array + 1);
printf("p1:%p\np1 + 1: %p\n", p1, p1 + 1);
printf("p2:%p\np2 + 1: %p\n", p2, p2 + 1);
printf("* p2:%p\n* p2 + 1:%p\n&array[1][0]:%p\n", * p2, * p2 + 1, &array[1][0]);
printf("* (* p2 + 2) + 3:%p\n&array[2][3]:%p\narray[2][3]:%d\n", * (* p2 + 2) + 3 , &array[2][3], array[2][3]);
printf("指针p和指针* p和指针array的跨度不一样,指针array跨度是整个列宽,是* p跨度的4倍\n");
printf("指针array的跨度和数组指针p1的跨度一致,而指针p2跨度相当于p的12倍,是p1的3倍\n");
printf("数组指针p2作为二级指针,是指向整个数组的指针,数组指针p1作为一级指针,是指向整个列的指针\n");
printf("p2解引用(即 * p2)是一级指针 * p2,指针(* p2 + i)的值是第i + 1行的首个元素的地址,相当于p1 + i\n");
printf("p2可以通过两层解引用表达行和列: * (* p2 + i) + j表示指向第i行和第j列元素的地址,相当于 * (p1 + i) + j\n\n");
// 行和列与一级指针p1同级别,与二级指针p2不同级别,因此不要将行数和列数直接与二级数组指针p2相加
// p2是二级指针,需要1次解引用,方可与行和列同一维度进行相加,
// 如果i代表第i行,j代表第j列,那么一级指针* (* p2 + i) + j的值就是数组array的元素的地址
// 以二级二维数组指针p2打印二维数组array:
// 二维数组传参给函数testTwoDimArrPotFunc()
testTwoDimArrPotFunc(array);
printf("array[0][4]:%d\n", array[0][4]);
printf("以二级二维数组指针p2打印二维数组array:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%3d", * (* (* p2 + i) + j));
}
printf("\n");
}
printf("\n");
printf("array[0][4]=%d\n", array[0][4] = 4);
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%3d", * (* (* p2 + i) + j));
}
printf("\n");
}
printf("\n");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】