指针在数组中如何赋值与移位
1.在下面的数组中,输出结果如下:
#include<stdio.h>
int main()
{
#if 1
int a[5] = { 1,2,3,4,5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d\n", *(a + 1), *(ptr - 1));
printf("%d,%d,%d\n", *(a + 1), *(ptr - 1),*(ptr-2));
printf("%p,%p,%p\n", a + 1, ptr - 1, ptr);
printf("%p\n", a);
printf("%d\n", *ptr);
#else
char a[5] = { '-','1','2','3','4' };
char *ptr = (char *)(&a + 1);
printf("%c,%c\n", *(a + 1), *(ptr - 1));
printf("%c,%c,%c\n", *(a + 1), *(ptr - 1), *(ptr - 2));
printf("%p,%p,%p\n", a + 1, ptr - 1, ptr );
printf("%p\n", a);
printf("%c\n", *ptr);
#endif
return 0;
}
output:
地址a(010FFD3C)与ptr地址(010FFD50)相差20,也就是5个数,说明int *ptr = (int *)(&a + 1);语句将数组a移动一个数组大小后再附给指针ptr;
a + 1则是将数组a中一维数组的元素向后移动一个元素。
int main()
{
#if 0
int a[5] = { 1,2,3,4,5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d\n", *(a + 1), *(ptr - 1));
printf("%d,%d,%d\n", *(a + 1), *(ptr - 1),*(ptr-2));
printf("%p,%p,%p\n", a + 1, ptr - 1, ptr-2);
printf("%p\n", a);
printf("%d\n", *ptr);
#else
char a[5] = { '-','1','2','3','4' };
char *ptr = (char *)(&a + 1);
printf("%c,%c\n", *(a + 1), *(ptr - 1));
printf("%c,%c,%c\n", *(a + 1), *(ptr - 1), *(ptr - 2));
printf("%p,%p,%p\n", a + 1, ptr - 1, ptr );
printf("%p\n", a);
printf("%c\n", *ptr);
#endif
return 0;
}
output:
上下对比说明,指针中数组元素的移动,与数组元素类型(int
/char)无关,而是与数组与指针赋值有关。