指针学习

#include 

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;
}

 

你可能感兴趣的:(C语言)