在c中对char执行算术运算

时间:2016-02-20 17:50:36

标签: c

我正在学习C并正在研究strchr函数。我找到了以下代码,这让我很困惑。

/* strchr example */

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


int main (){

char str[] = "This is a sample string";
char * pch;
printf ("Looking for the 's' character in \"%s\"...\n",str);
pch=strchr(str,'s');

while (pch!=NULL) {
   printf ("found at %d\n",pch-str+1);
   pch=strchr(pch+1,'s');
}
return 0;
}

使用以下输出

Looking for the 's' character in "This is a sample string"...
found at 4
found at 7
found at 11
found at 18

变量pch和数组str都是char,为什么在对它们进行算术运算时,它们会变成整数?我感谢所有的帮助。

6 个答案:

答案 0 :(得分:3)

让我们看看有问题的陈述:

printf ("found at %d\n",pch-str+1);

在此算术上下文中,您正在指针上运行char,因此这是经典指针算法:

  • pch的类型为char *
  • str的类型为char[],它会衰减为另一个char *指针类型
  • pch-str在技术上属于ptrdiff_t类型,是有符号整数类型的别名(在您的情况下为long int

因此,完整的表达式pch-str+1也属于long int类型。

最后,您的printf语句使用%d格式说明符,它需要int参数并将其作为带符号的十进制数输出。

答案 1 :(得分:1)

不,他们不会变成整数

可以对指针以及整数和浮点数进行数学运算,因此,如果char str[] = "hello";,则*(str+1)等于&#39; e&#39; ,*(str+N)是第一个之后的N个字符。

答案 2 :(得分:0)

实际上pch是一个指针。向指针添加常数时,它等同于数组。例如。     char *ptr。     ptr[i]相当于ptr+i,也相当于i+ptr。这不是char变量的算术,而是对字符指针执行算术运算。

确保任何类型的指针都是一个包含地址的整数。

答案 3 :(得分:0)

C中有两种基本类型的数据类型。即整数类型和浮点类型。字符也属于整数类型,只有一个字节(即8位)。所以它也可以将整数值存储到255.因为2 ^ 8 = 256(0-255)。

希望这有帮助。

答案 4 :(得分:0)

不,你没有做整数运算你正在做指针运算。 pch是指针,pch +1表示pch + 1 * sizeof(char)。这里strchr属于以下类型

char *strchr(const char *str, int c).

您可以阅读有关strchr here

的更多信息

答案 5 :(得分:0)

当声明任何数据类型的指针p []数组时,p表示p指向的地址。因此,当我们执行p + 1时,地址增加一个字节或4个字节,因为p是指向char的指针或指向整数的指针。

在每种情况下,p都是一个基本上是整数的地址。

所以当你做pch + 1 pch是一个整数的内存地址。