char *str = "ESPA1";
printf("%s", str + str[0] - str[3]);
我知道输出为1,但我不明白为什么可以这样“切割”字符串的一部分。
看看这个:
char *str = "ESPA1";
printf("%s", str + 4);
C0]的[Ascii值为65,'A'
的值为69,因此减法得到4,您从基数'E'
引用了5th
元素,这当然是第一个元素的位置/引用。
要了解有关指针算术的更多信息:
str
首先让我们分解表达式:
ASCII Table
插入str + str[0] - str[3]
和str[0]
的值,我们得到:
str[3]
假设字符以ASCII表示,与以下相同:
str + 'E' - 'A'
现在,我们将使用一个快捷方式,并假设它与:
str + 69 - 65
哪个给我们:
str + (69 - 65)
哪个是指向数组元素索引4的指针,即字符str + 4
。因此,'1'
从那里开始读取,这就是打印的内容。
现在回到该快捷方式:
printf
这不是实际计算的方式。加法和减法具有相同的优先级,并且从左到右分组,所以它的确是这样:
str + (69 - 65)
第一个子表达式生成一个指向索引69的指针,但是(str + 69) - 65
指向的字符串文字没有那么多元素。因此,由于我们要在数组末尾创建一个超过1个元素的指针,因此代码显示为str
。在这种情况下,您很幸运,它按预期运行。
这只是指针操作。该代码将0和3地址之间的差求和并打印出来。换句话说,您在初始地址中加了4个字符。