//指针数组和数组指针分析
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[8][8] = {1,2,3,4};
int (*ptr1)[8] = a ;
int (*ptr2)[8][8] = &a;
int *ptr3 = &a[0][0];
printf(" &a[0][0] = %#x\n" , &a[0][0]); //指向数组的第一个元素的地址
printf(" ptr1 = %#x\n" , ptr1); //A、指向一纬数组第一个元素首部
printf(" &a[0] = %#x\n" , &a[0]); //同上A
printf(" ptr1+1 = %#x\n" , ptr1+1); //B、指向一纬数组第二个元素首部 = A+4*8
printf(" &a[0]+1 = %#x\n\n" , &a[0]+1); //同上B
printf(" ptr2 = %#x\n" , ptr2);
printf(" &a = %#x\n" , &a);
printf(" ptr2+1 = %#x\n" , ptr2+1);
printf(" &a+1 = %#x\n\n" , &a+1);
//ptr2的解释就是:一个指向二维数组[8][8]的指针,
//那么ptr2+1则是偏移了一个二维数组[8][8]的地址,即为4*8*8=256(0x100)个字节的偏移
printf(" ptr3 = %#x\n" , ptr3);
printf(" &a[0][0] = %#x\n" , &a[0][0]);
printf(" ptr3+1 = %#x\n" , ptr3+1);
printf(" &a[0][0]+1 = %#x\n\n" , &a[0][0]+1);
//int *ptr3 = &a[0][0];这个毫无疑问,是将数组a的首元素地址赋给指针ptr3,
//由于是int型数组,那么ptr3+1则是偏移一个int型大小,即偏移4个字节.
return 0;
}
//结果是:
/*
&a[0][0] = 0x28fde4
ptr1 = 0x28fde4
&a[0] = 0x28fde4
ptr1+1 = 0x28fe04
&a[0]+1 = 0x28fe04
ptr2 = 0x28fde4
&a = 0x28fde4
ptr2+1 = 0x28fee4
&a+1 = 0x28fee4
ptr3 = 0x28fde4
&a[0][0] = 0x28fde4
ptr3+1 = 0x28fde8
&a[0][0]+1 = 0x28fde8
*/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
· C# 开发工具Visual Studio 介绍
· 在 Windows 10 上实现免密码 SSH 登录
· C#中如何使用异步编程