我编写了这段代码,输出就像这个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
。
答案 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);
}
如果删除生成编译错误的行,则输出应该与第一段代码没有区别。