指针上相同的两个操作的不同行为

时间:2017-06-05 19:08:06

标签: c pointers

我编写了这段代码,输出就像这个B C D E

char a[5] = {'A' , 'B' , 'C' , 'D'};
char *b = a + 2;
int i = 0 ;
for(i = 0 ; i < 4 ; i ++)
{
    *b = (a[i] + 1);
    printf("%c",*b);
}

但是当我添加这样的引用时:

char a[5] = {'A' , 'B' , 'C' , 'D'};
    char *b = &a + 2;
    int i = 0 ;
    for(i = 0 ; i < 4 ; i ++)
    {
        *b = (a[i] + 1);
        printf("%c",*b);
    }

输出只是B

2 个答案:

答案 0 :(得分:2)

这与指针算法的完成方式有关。向指针添加值时,它会将指针递增该值乘以它引用的类型的大小。

在表达式a + 2中,a的类型为char *,因此添加2会使地址增加2 * sizeof(char) == 2个字节。

鉴于&a + 2&a的类型为char (*)[5],即指向数组char的指针。向此处添加2会使地址增加2 * sizeof(char [5]) == 10个字节。这指向超出数组末尾的内存位置,因此取消引用它会调用undefined behavior,在这种情况下会导致循环提前退出。

在第二种情况下,您的分配也无效,因为您尝试将类型char (*)[5]的值分配给char *类型的值。

答案 1 :(得分:1)

编译器应报告错误

char a[5] = {'A' , 'B' , 'C' , 'D'};
char *b = &a + 2; // <<< compile error
int i = 0 ;
for(i = 0 ; i < 4 ; i ++)
{
    *b = (a[i] + 1);
    printf("%c",*b);
}

如果删除生成编译错误的行,则输出应该与第一段代码没有区别。