C 无法理解strlen表达式参数结果

C 无法理解strlen表达式参数结果,c,string,sizeof,strlen,pointer-arithmetic,C,String,Sizeof,Strlen,Pointer Arithmetic,我搜索了所有地方,但没有找到当斯特伦的论点是一个表达式时会发生什么。最后一个语句的结果是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) ); } 至于你的例子,那么

我搜索了所有地方,但没有找到当斯特伦的论点是一个表达式时会发生什么。最后一个语句的结果是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) );
}
至于你的例子,那么在这句话里

5 - HELLO
4 - ELLO
3 - LLO
2 - LO
1 - O
表达式p+sizeof p的类型为char*,该表达式生成一个指针,指向数组对象p的最后一个元素

表达式p+sizeof p-sizeof x将指针向左移动—在系统中,sizeof x似乎等于8。表达式p+sizeof p-sizeof x+5将指针向右移动

结果,整个表达式生成一个指针,指向字符数组p中的以下位置


因此,看起来像A\n的字符串的长度等于2。

提示:它与strlen无关。p+sizeof p-sizeof x+5代表什么?如果你不能回答,那么你需要理解指针和指针算法,可能还有sizeof。另外,strlen做什么?strlen将字符串作为参数,然后它遍历字符串直到\0,对每个字符进行计数,然后返回该计数。因此,参数必须指向字符串。它可以是表达式,但计算表达式的结果必须是指向字符串的指针。现在,正如Iharob所建议的,检查一下你在做什么。momo:好奇:为什么用strlenp编码%lu?这是通过实验发现的吗?代码示例?“%zu”如何?请注意,sizeofx将根据生成的是32位还是64位程序给出不同的结果。@IharobAlAsimi I I在Tsand sizeof and strlen下。在我看来,表达式是将9*sizeofchar添加到p的起始地址,因此strlen正在计算p[]的位置9的字符数?这给了我们最后2个字符。我现在理解正确了吗?
5 - HELLO
4 - ELLO
3 - LLO
2 - LO
1 - O
printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );
char p[]="CALIFORNIA\n";
                   ^
                   |