指针数组和数组指针分析

//指针数组和数组指针分析
#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
*/
posted @   blackBox  阅读(228)  评论(0编辑  收藏  举报
编辑推荐:
· .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#中如何使用异步编程
点击右上角即可分享
微信分享提示