数组指针学习

#include <stdio.h>

int main()
{
    int array[10] = {0,1,2};
    typedef int (*ARRAY)[10];  // 数组指针
    int *p1 = array;
    ARRAY p2 = &array;
    int *p3 = &array;

    printf("p1 = %#x\n",p1);               // p1 = 0x476c4940          
                                           // p1相当于array,array又代表数组array的首地址
    printf("p2 = %#x\n",p2);               // p2 = 0x476c4940
                                           // p2这里依然是数组首地址
    printf("p3 = %#x\n",p3);               // p3 = 0x476c4940         
                                           // 虽然&array的物理意义是取整个数组元素的地址,但此处表示的依然是数组首地址
    printf("int=%dbyte\n",sizeof(int));    // int=4byte
    printf("p1+1 = %#x\n",p1+1);           // p1+1 = 0x476c4944
                                           // 这里p1移动了本身整型字节大小距离
    printf("p2+1 = %#x\n",p2+1);           // p2+1 = 0x476c4968
                                           // p2这里移动了整个数组元素内存大小的地址
    printf("p3+1 = %#x\n",p3+1);           // p3+1 = 0x476c4944
                                           // p3移动整型字节大小距离

//PS:int *p1 = array;和int *p3 = &array;这两个在指针+1的时候主要看前面定义的类型,是char就只移动1个字节大小的地址,是double就移动8个字节大小的地址

    printf("*(p1+1) = %#x\n",*(p1+1));     // *(p1+1) = 0x1
                                           // 这里就涉及到解引用了,*p1表示array[0]里面的内容,+1就表示array[1]的内容
    printf("*p2+1 = %#x\n",*p2+1);         // *p2+1 = 0x476c4944
                                           // *p2暂时还没弄清楚
    printf("*(p3+1) = %#x\n",*(p3+1));     // *(p3+1) = 0x1
                                           // *p3表示的依然是array[0]里面的内容,+1就表示array[1]的内容
    printf("p1[2]=%d\n",p1[2]);            // p1[2]=2
                                           // 这里指针加下标的话,效果跟数组是一样的
    printf("p2[2]=%d\n",p2[2]);            // p2[2]=1198279056
                                           // 对数组指针的偏移,以整个数组元素内存大小偏移
    printf("p3[2]=%d\n",p3[2]);            // p3[2]=2
                                           // 跟数组一样
    printf("(*p2)[2]=%d\n",(*p2)[2]);      // (*p2)[2]=2
                                           // 这是对数组指针的解引用
    // printf("(*p1)[2]=%d\n",(*p1)[2]);    // error,很明显*p1是0
    // printf("(*p3)[2]"=%d,(*p3)[2]);      // error,*p3也是0
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值