不同类型的指针指向统一地址有什么区别

首先先明确不同类型的指针有什么区别:

对于不同类型的指针:

  • 所占的内存空间大小是相同的,不会因为指向内容有差别。指针本质为一个地址,只与cpu、操作系统和编译器位数有关。
  • 区别在与指向地址空间不同,空间大小与指针类型有关。

 通过程序来检验冉类型的指针与指向空间的差别

#include <stdio.h>

int main(){
    int a[] = {0x11223344,0x55667788};
    int* q = a;
    char* p = (char*)a;
    printf("&a=%p\n",a);
    printf("sizeof(char*)=%ld,sizeof(int*)=%ld\n",sizeof(char*),sizeof(int*));    //查看不同类型指针内存大小
    printf("sizeof(char)=%ld,sizeof(int)=%ld\n",sizeof(char),sizeof(int));
    printf("int_p=%p,*int_p=0x%x\n",q,*q); 
    printf("char_p=%p,*char_p=0x%x\n",p,*p);                                      //查看不同类型指针指向的空间大小,以及空间内的值
    printf("int_p=%p,*int_p=0x%x\n",(q+1),*(q+1));
    printf("char_p=%p,*char_p=0x%x\n",(p+1),*(p+1));                              //对指针进行运算,查看区别return 0;
}

运行结果为:

&a=0x7ffe51241e00                             //数组a的首地址
sizeof(char*)=8,sizeof(int*)=8                //不同类型指针内存大小相同
sizeof(char)=1,sizeof(int)=4                  
int_p=0x7ffe51241e00,*int_p=0x11223344
char_p=0x7ffe51241e00,*char_p=0x44            //不同类型指针指向的内存地址大小不同
int_p=0x7ffe51241e04,*int_p=0x55667788
char_p=0x7ffe51241e01,*char_p=0x33            //地址运算改变的值不同

通过绘制地址与存储内容的关系, 能够比较直观的知道不同类型指向内容的差别。

疑惑:

与上面相同的程序,当对char型指针p进行运算为p+4时

printf("char_p=%p,*char_p=0x%x\n",(p+4),*(p+4));

得到结果

 不理解为何输出结果变为 0xffffff88。长时间的查找和尝试都没有理解原因,如果有知道的大佬,希望能说明一下,谢谢。

posted @ 2023-03-11 15:01  ailaopo_zhai  阅读(60)  评论(0编辑  收藏  举报