我正在学习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,为什么在对它们进行算术运算时,它们会变成整数?我感谢所有的帮助。
答案 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是一个整数的内存地址。