1

此代码将输出字符串中字符的索引:

#include <stdio.h>
#include <string.h>

int main(void){

   char str[100]="birds are dying";
   char *p;

   p = strchr(str,'e'); 
   int i=p-str;

   printf("%d" , i);

   return 0;
}

我无法理解的唯一代码行是:

int i=p-str;
  1. str 是一个字符串,p 也是,我搜索了将字符串打印为整数的结果,发现它是一个未定义的行为,那么它实际上返回了什么?

  2. p - str 是 : e dying - birds are dying,当我们以某种方式将其更改为整数时,为什么它返回正值

谢谢

4

2 回答 2

1

它不是一个字符串——它是一个指针。这是合法的指针算术。它以指针为单位工作。假设你有

double x[10], *start, *end;
integer exclusive;

start = &x[2];
end = &x[4];
exclusive = end - start;
printf("%d\n", exclusive);

你觉得会打印什么?你会得到 2:不是 2 * sizeof(double)。

于 2020-10-16T09:20:37.067 回答
0

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 ''array of type'' 的表达式将转换为类型为 ''pointer 的表达式键入指向数组对象的初始元素且不是左值的''。如果数组对象具有寄存器存储类,则行为未定义

在这次通话中

p = strchr(str,'e');

该函数strchr返回一个指向符号的指针'e'.

在表达式中

p-str

具有数组类型的对象 strchar[100] 被隐式​​转换为指向其第一个元素的指针。所以表达式表示两个指针的差异。

并根据 C 标准(6.5.6 加法运算符)

9 当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差....

因此,差异在于两个指针之间的元素数量,它产生找到的符号的索引,因为表达式str(在数组隐式转换str为指针之后)指向数组的第一个元素。

于 2020-10-16T09:31:04.343 回答