指针+1问题

指针+1问题

看下面这个代码

#inclide <stdio.h>
int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9,10};
	int *p=arr;
	p++;
	*p=10;
	p++;
	*p=20;
	printf("%d,%d\n",arr[0],arr[1]);
	return 0;
}

在不明确的条件下*p+1我们一般都会想到两种情况:
(1)加一个字节
(2)加一个单元格
那么这两种情况到底谁是正确的,我们来分析一下
如果是加一个字节,如图
指针+1问题
最终我们可以得出蓝色框中的值为2561,这当然不可能,所以应该是加一个单元格;
所以上面代码的结果是

1,10
请按任意键继续. . .

总结

指针+i,表示加i个单元格,其加i*sizeof(指针本身去掉一个 * )字节

我们再来看个代码

#include <stdio.h>
int main()
{
	int *p = (int *)2000;
	printf("%d\n",p-2);            //2000-2*sizeof(int)=1992
	printf("%d\n",(char *)p-2);    //2000-2*sizeof(char)=1998
	printf("%d\n",(short *)p-2);   //2000-2*sizeof(short)=1996
	printf("%d\n",(long long *)p-2);//同上1984
	printf("%d\n",(float *)p-2);    //1992
	printf("%d\n",(double  *)p-2);  //1984
	printf("%d\n",(int **)p-2);     //2000-2*sizeof(int*)=1992
	printf("%d\n",(unsigned long)p-2);//1998****不是指针,是个无符号的长整型

	return 0;
}

答案为

1992
1998
1996
1984
1992
1984
1992
1998
请按任意键继续. . .