任何人都可以解释第二次输出背后的原因吗?解决使用int指针和char指针之间的区别是什么? 第二个答案是0。
int main()
{
char arr[] = "geeksforgeeks";
char *ptr1 = arr;
char *ptr2 = ptr1 + 3;
printf ("ptr2 - ptr1 = %d\n", ptr2 - ptr1);
printf ("(int*)ptr2 - (int*) ptr1 = %d", (int*)ptr2 - (int*)ptr1);
getchar();
return 0;
}
答案 0 :(得分:4)
某些类型的指针T指向T型对象。
例如
int a[] = { 1, 2 };
int *p = a;
如果你增加一个指针,例如
++p;
或
p = p + 1;
(考虑到这些语句是等价的)它将指向当前对象后面的T类型的下一个对象。因此指针的值将增加sizeof( T )
,以便提供poiner确实将指向下一个元素。
在上面的示例中,sizeof(int)(通常)等于4.因此指针的值将增加4。
如果你写
int a[] = { 1, 2 };
int *p = &a[0]; // the same as int *p = a;
int *q = &a[1];
然后表达式q - p
将等于1,但存储在p和q中的值之间的差值将等于sizeof( int )
。 p指向数组的第一个元素,q指向数组的第二个元素。这就是所谓的指针算法。
对于减去int指针的结果,行为是未定义的。根据C ++标准
除非两个指针指向同一个数组对象的元素或一个 超过数组对象的最后一个元素,行为是未定义的
在你的情况下,int指针不指向同一个数组的元素。他们会指向同一个数组的元素,至少它们的值之差应该等于sizeof(int)
答案 1 :(得分:0)
这是因为char大小是1字节,而int是32Bit(4byte)变量
答案 2 :(得分:0)
编辑保持指针在原始数组中并确保正确的对齐以避免未定义的行为(参见Matt McNabb的评论)
因为3<的sizeof(int)的
在指针算术中,(int *) ptr2 - (int *) ptr1
给出real_addr_of_ptr2 - real_addr_of_ptr1) / sizeof(int) = 3 / 4
。因为它是整数除法=> 0 - 这是未由C ++ 指定,但是当前实现。
如果您使用:char *ptr2 = ptr1 + 8;
,则会获得:(int*)ptr2 - (int*) ptr1 = 2
由于数组中有超过8个字符,只要原始数组正确对齐,它就可以工作。为了与规范保持一致,应该宣布:
union {
char arr[] = "geeksforgeeks";
int iarr[];
} uarr;
char *ptr1 = uarr.arr;