从 char 指针中减去 char 数组产生一个 int?
Subtracting char array from char pointer produces an int?
在 http://www.cplusplus.com/reference/cstring/strchr/ 的 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;
}
为什么从 char
指针 pch
中减去 char
数组 str
加一得到 int
? (由 %d
格式类型表示)如果我删除“-str
”,程序将不会执行,直到我将 %d
更改为 %s
。
数组名称衰减为指向其第一个元素的指针(在大多数情况下)。两个指针的减法产生 ptrdiff_t
类型的数据,前提是两个指针都指向同一数组的元素。
简而言之,这是一个 bug:
该表达式可能是 int
类型,或者您可能在对 printf
.
的调用中有 未定义行为
让我们一步步来:
你实际上不是从指针中减去数组,而是从指针中减去指针:
在几乎所有情况下,array decays to a pointer to its first element.
两个指针的区别是什么类型(仅当它们指向或直接指向同一数组中的元素时才定义)?
ptrdiff_t
(这就是 <stddef.h>
中的 typedef
的用途。)
ptrdiff_t
可能恰好是 int
,但不要依赖它。
相反,使用正确的格式说明符:%ti
.
您正在查看 C/C++ 和指针的怪异之处之一。指针和数组的语法和语义简直是疯了。
str 是指向 char(以及数组)的指针。
pch 也是一个指向 char 的指针。
如果将两个指向相同类型的指针相减,您将得到它们之间的元素数。
你甚至可以做到
3 [str] ;
相当于
str[3] ;
相当于
*(str+3) ;
你的表情:
pch - 1
具有指向 char 的类型指针。你的表情
pch - str
具有类型 int。
在 http://www.cplusplus.com/reference/cstring/strchr/ 的 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;
}
为什么从 char
指针 pch
中减去 char
数组 str
加一得到 int
? (由 %d
格式类型表示)如果我删除“-str
”,程序将不会执行,直到我将 %d
更改为 %s
。
数组名称衰减为指向其第一个元素的指针(在大多数情况下)。两个指针的减法产生 ptrdiff_t
类型的数据,前提是两个指针都指向同一数组的元素。
简而言之,这是一个 bug:
该表达式可能是 int
类型,或者您可能在对 printf
.
让我们一步步来:
你实际上不是从指针中减去数组,而是从指针中减去指针:
在几乎所有情况下,array decays to a pointer to its first element.两个指针的区别是什么类型(仅当它们指向或直接指向同一数组中的元素时才定义)?
ptrdiff_t
(这就是<stddef.h>
中的typedef
的用途。)ptrdiff_t
可能恰好是int
,但不要依赖它。
相反,使用正确的格式说明符:%ti
.
您正在查看 C/C++ 和指针的怪异之处之一。指针和数组的语法和语义简直是疯了。
str 是指向 char(以及数组)的指针。 pch 也是一个指向 char 的指针。
如果将两个指向相同类型的指针相减,您将得到它们之间的元素数。
你甚至可以做到
3 [str] ;
相当于
str[3] ;
相当于
*(str+3) ;
你的表情:
pch - 1
具有指向 char 的类型指针。你的表情
pch - str
具有类型 int。