指针与数组下标访问与指针访问的区别如下:
char *p="abcde";
char a[5]={1,2,3,4,5};printf(" p+4 = 0x%p,*(p+4) = 0x%x\n",p+4,*(p+4));
printf("&p[4] = 0x%p, p[4] = 0x%x\n",&p[4],p[4]);
printf(" a+4 = 0x%p,*(a+4) = %d\n",a+4,*(a+4));
printf("&a[4] = 0x%p, a[4] = %d\n",&a[4],a[4]);
仿真局部变量的地址与结果如下所示:
(1)以指针形式访问指针
*(p+4)。指针p的地址为0x00415754,加上4个字符的偏移量后的新地址为0x00415758,然后取出新地址中的内容0x65(e)。
(2)以下标形式访问指针
p[4]。编译器将下标形式的操作解析为以指针形式的操作。首先取出 指针p的地址0x00415754,再加上4个字符的偏移量后的新地址为 0x00415758,然后取出新地址中的内容 0x65(e)。
(3)以指针形式访问数组
*(a+4)。数组a的首地址为0x0012ff4c,加上4个字符的偏移量后的新地址为0x0012ff50,然后取出新地址中的内容 5。
(4)以下标形式访问指针
a[4]。编译器将下标形式的操作解析为以指针形式的操作。首先取出数组a的首地址为0x0012ff4c,加上4个字符的偏移量后的新地址为0x0012ff50,然后取出新地址中的内容 5。
测试结果如下: