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
不同的结果。在伤口上加盐,后者也会引发未定义的行为。