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

C 指针上相同两个操作的不同行为,c,pointers,C,Pointers,我写了这段代码,结果是这样的 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); } chara[5]={'a','B','C','D'}; char*b=a+2; int i=0; 对于(i=0;i

我写了这段代码,结果是这样的

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);
}
chara[5]={'a','B','C','D'};
char*b=a+2;
int i=0;
对于(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);
    }
chara[5]={'a','B','C','D'};
字符*b=&a+2;
int i=0;
对于(i=0;i<4;i++)
{
*b=(a[i]+1);
printf(“%c”,*b);
}

输出变成刚好
B

这与指针算法的执行方式有关。将值添加到指针时,指针将以该值乘以其引用的类型的大小来递增指针

在表达式
a+2
中,
a
具有类型
char*
,因此添加2将地址增加
2*sizeof(char)==2
字节

给定
&a+2
&a
具有类型
char(*)[5]
,即指向5个
char
数组的指针。加上2,地址将增加
2*sizeof(char[5])==10个字节。这指向一个超过数组末尾的内存位置,因此取消对它的引用将调用它,在本例中,这将导致循环提前退出


在第二种情况下,您还有一个无效的赋值,因为您试图将
char(*)[5]
类型的值赋值给
char*
类型的值,编译器应在

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);
}
chara[5]={'a','B','C','D'};

char*b=&a+2;//<代码>&a+2
正在添加2*大小的数组。当然,完全启用警告的编译器会抱怨。节省时间,启用编译器警告。这应该会生成编译器警告。如果没有,你需要增加你的警告并修复(而不是掩盖)注意到的问题。在这种情况下,它是一个指针算术的东西
&a
char(*)[5]
,而不是
char*
,因此表达式
a+2
自然会产生与
&a+2
不同的结果。在伤口上加盐,后者也会引发未定义的行为。