关于指针和数组的移动
#include<stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int * )(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
程序运行的结果是:2,5.
2这个结果没什么异议*(ptr-1)为什么5呢? 因为是&a+1移动的是一整个数组的长度(&a是整个数组的长度5*int),之后强制类型转换(int*),ptr-1移动之后的字组长度的首地址再向后移动一个int, 到了前面数组的最后一个字节地址了, 所以是5.
经测试把a[5]改成a[6], 加一个元素6 , 输出也是6.
#include<stdio.h>
int main()
{
int a[6] = { 1, 2, 3, 4, 5, 6 };
int *ptr = (int*)(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
把&a 改成&a[0] ,移动的就是一个int了,结果为2,1, 如下:
#include<stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a[0] + 1); //这样改后 "int *" 可以不要了.
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
浙公网安备 33010602011771号