无法理解 strlen 表达式参数结果
Can't understand strlen expression argument result
#include "stdio.h"
#include "string.h"
int main(){
char p[]="CALIFORNIA\n";
char *x ="HELLO";
printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );
}
我找遍了,但找不到当 strlen 的参数是一个表达式时会发生什么。最后一条语句的结果是2,谁能解释一下是怎么回事?
这里用到了指针运算。为了更清楚地说明 运行 这个演示程序。
#include <stdio.h>
#include <string.h>
int main(void)
{
char *x ="HELLO";
const size_t N = strlen( x );
for ( size_t i = 0; i < N; i++ )
{
printf( "%zu - %s\n", strlen( x + i ), x + i );
}
return 0;
}
它的输出是
5 - HELLO
4 - ELLO
3 - LLO
2 - LO
1 - O
至于你的例子,那么在这个声明中
printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );
表达式 p + sizeof( p )
的类型为 char *
,即表达式产生一个指向数组对象 p
.
最后一个元素的指针
表达式p + sizeof( p ) - sizeof( x )
将指针向左移动(在您的系统中似乎 sizeof( x ) 等于 8)。表达式 p + sizeof( p ) - sizeof( x ) + 5
将指针向右移动。
结果整个表达式产生一个指向字符数组中以下位置的指针 p
char p[]="CALIFORNIA\n";
^
|
因此看起来像 "A\n"
的字符串的长度等于 2
.
#include "stdio.h"
#include "string.h"
int main(){
char p[]="CALIFORNIA\n";
char *x ="HELLO";
printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );
}
我找遍了,但找不到当 strlen 的参数是一个表达式时会发生什么。最后一条语句的结果是2,谁能解释一下是怎么回事?
这里用到了指针运算。为了更清楚地说明 运行 这个演示程序。
#include <stdio.h>
#include <string.h>
int main(void)
{
char *x ="HELLO";
const size_t N = strlen( x );
for ( size_t i = 0; i < N; i++ )
{
printf( "%zu - %s\n", strlen( x + i ), x + i );
}
return 0;
}
它的输出是
5 - HELLO
4 - ELLO
3 - LLO
2 - LO
1 - O
至于你的例子,那么在这个声明中
printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );
表达式 p + sizeof( p )
的类型为 char *
,即表达式产生一个指向数组对象 p
.
表达式p + sizeof( p ) - sizeof( x )
将指针向左移动(在您的系统中似乎 sizeof( x ) 等于 8)。表达式 p + sizeof( p ) - sizeof( x ) + 5
将指针向右移动。
结果整个表达式产生一个指向字符数组中以下位置的指针 p
char p[]="CALIFORNIA\n";
^
|
因此看起来像 "A\n"
的字符串的长度等于 2
.