为什么p+=*string[2]-*string[1]
代替p+=string[2]-string[1]
(没有星号)?
res[0]=*p;
其值为'c'
为什么?当p
在单词之间移动而不是字母时,为什么*string[1]
移动单词字母?
代码的输出是
C
int main (void)
{
char* strings[]={"abcdb","bbb","dddd"};
char*p=*strings;
char res[2];
p+=*string[2]-*string[1];
res[0]=*p;
p+=3;
res[1]=*p;
printf("%s\n",res);
return 0;
}
答案 0 :(得分:2)
该程序具有未定义的行为。
我们不会考虑是否存在拼写错误而不是标识符strings
,有时会使用标识符string
。我们假设代码片段中的每个地方都使用了标识符strings
。
在本声明中
char*p=*strings;
将数组的第一个元素分配给指针。数组的第一个元素是指向字符串文字"abc"
的第一个字符的指针。所以p指向字符串文字的字符'a'
。
在本声明中
p += *strings[2] - *strings[1];
strings[2]
是类型char *
的数组的第三个元素,其值是字符串文字"dddd"
的第一个字符的地址。取消引用此指针*strings[2]
,您将获得此字符串文字的第一个字符'd'
strings[1]
是类型为char *
的数组的第二个元素,其值是字符串文字"bbb"
的第一个字符的地址。取消引用此指针*strings[1]
,您将获得此字符串文字的第一个字符“b”
字符'd'
和'b' (for example in ASCII the code of character
'b'is 98 while the code of
'd'的内部代码之间的差异为100)等于2。
所以这句话
p += *strings[2]-*strings[1];
将指针增加2.首先,它指向第一个字符串文字'a'
的字符"abc"
,在增加2之后,它现在指向相同字符串文字的字符'c'
"abc"
。
因此在本声明中
res[0] = *p;
字符'c'
已分配给res[0]
。
在此声明之后
p+=3;
p
的值变为无效,因为它现在指向超出字符串文字“abc”,并且编译器没有必要在字符串文字"bbb"
之后放置字符串文字"abc"
。
所以在下一个语句中取消引用这个指针
res[1]=*p;
导致未定义的行为。
根据C标准
如果结果指向一个超过数组对象的最后一个元素的那个,那么 不得用作一元*运算符的操作数 评价
它只是发生了这样一种方式,即编译器将字符串文字一个接一个地放在内存中。虽然标准不保证这一点。
所以如果在声明之后
res[1]=*p;
res [1]不包含字符'\0'
,然后是下一个语句
printf("%s\n",res);
也有未定义的行为。
答案 1 :(得分:1)
首先,你的程序中没有定义string
,所以你的陈述应该是p+=*strings[2]-*strings[1]
对你的两个问题的回答是取消引用指针。您需要了解指针如何处理字符串。请检查this link。