使用指针算法输出奇怪的输出

时间:2014-08-04 09:47:52

标签: c pointers

任何人都可以解释第二次输出背后的原因吗?解决使用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;
}

3 个答案:

答案 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;