对于C中的sizeof(x)VS while([x]!=';\0';)

对于C中的sizeof(x)VS while([x]!=';\0';),c,pointers,char,sizeof,c-strings,C,Pointers,Char,Sizeof,C Strings,我只是想知道使用 for(i=0;i

我只是想知道使用

for(i=0;i

while(argv[1][i]!='\0')
我只是好奇,什么也找不到


(目的是
putchar
字符的每个字符*

这两种情况有本质的区别

表达式
argv[1]
是一个指针,其类型为
char*
,通常占用4或8个字节,具体取决于使用的系统,该系统等于表达式
sizeof(argv[1])/sizeof(argv[1][0])
的值或表达式
sizeof(argv[1])
的值,因为
sizeof(argv[1][0])
sizeof(char)
相同,最后一个始终等于
1

另一方面,指针可以指向比4或8个字符多得多(或更少)的字符串

但是,即使您将对声明的字符数组(而不是指针)应用
sizeof
运算符,例如

char s[] = "Hello";
即使在这种情况下,循环的条件也会不同,这就是for循环

for(i = 0; i < sizeof( s ) / sizeof( s[0]); i++) {
遇到字符
'\0'
时停止其迭代

这是一个演示程序,显示了差异。该程序输出符号的ASCII码

#include <stdio.h>

int main(void) 
{
    char s[] = "Hello";
    
    for ( size_t i = 0; i < sizeof( s ) / sizeof( s[0]); i++ )
    {
        printf( "%d ", s[i] );
    }
    
    putchar( '\n' );
    
    size_t i = 0;
    
    while ( s[i] != '\0' )
    {
        printf( "%d ", s[i] );
        ++i;
    }
    
    putchar( '\n' );
    
    
    return 0;
}

这两种情况有本质区别

表达式
argv[1]
是一个指针,其类型为
char*
,通常占用4或8个字节,具体取决于使用的系统,该系统等于表达式
sizeof(argv[1])/sizeof(argv[1][0])
的值或表达式
sizeof(argv[1])
的值,因为
sizeof(argv[1][0])
sizeof(char)
相同,最后一个始终等于
1

另一方面,指针可以指向比4或8个字符多得多(或更少)的字符串

但是,即使您将对声明的字符数组(而不是指针)应用
sizeof
运算符,例如

char s[] = "Hello";
即使在这种情况下,循环的条件也会不同,这就是for循环

for(i = 0; i < sizeof( s ) / sizeof( s[0]); i++) {
遇到字符
'\0'
时停止其迭代

这是一个演示程序,显示了差异。该程序输出符号的ASCII码

#include <stdio.h>

int main(void) 
{
    char s[] = "Hello";
    
    for ( size_t i = 0; i < sizeof( s ) / sizeof( s[0]); i++ )
    {
        printf( "%d ", s[i] );
    }
    
    putchar( '\n' );
    
    size_t i = 0;
    
    while ( s[i] != '\0' )
    {
        printf( "%d ", s[i] );
        ++i;
    }
    
    putchar( '\n' );
    
    
    return 0;
}

它们不是同一件事(尽管它们很接近)

第一个

for(i=0;i
指:

  • i
    设置为
    0

  • sizeof(argv[1])/sizeof(argv[1][0])
    的意思是
    strlen(argv[1])
    ,所以它的意思是

  • 而i小于argv[1]的长度
    
    这基本上和

    inti=0;
    而(argv[1][i++]!='\0')
    
    有两个区别:

  • 在第二种情况下,
    i
    从未设置为
    0

  • 在第二个循环中,
    i
    从不递增(尽管在循环本身中它可能递增)


  • 它们不是同一件事(尽管它们很接近)

    第一个

    for(i=0;i
    指:

  • i
    设置为
    0

  • sizeof(argv[1])/sizeof(argv[1][0])
    的意思是
    strlen(argv[1])
    ,所以它的意思是

  • 而i小于argv[1]的长度
    
    这基本上和

    inti=0;
    而(argv[1][i++]!='\0')
    
    有两个区别:

  • 在第二种情况下,
    i
    从未设置为
    0

  • 在第二个循环中,
    i
    从不递增(尽管在循环本身中它可能递增)


  • sizeof(argv[1])
    是指针的大小。
    argc
    告诉您数组的长度
    *argv[]
    @WeatherVane看起来OP是在查找单个参数的长度,而不是参数的数量要获取
    argv[1]的长度
    请使用
    strlen(argv[1])
    您需要理解指针和数组之间的区别。如果从
    main()
    获取
    argv
    ,它是指向指向(数组的)指针的指针,指向(数组的)
    char
    argv[1]
    是指针,
    sizeof argv[1]
    将返回指针的大小,而不是数组。
    while(argv[1][i]!='\0')
    相同,而(argv[1][i])
    sizeof(argv[1])
    是指针的大小。
    argc
    告诉您数组的长度
    *argv[]
    @WeatherVane看起来OP是在寻找单个参数的长度,而不是它们的数量来获取
    argv[1]的长度
    请使用strlen(argv[1])
    您需要了解指针和数组之间的区别。如果您从
    main()
    中获得
    argv
    ,则它是指向(数组的)指针的指针,指向(数组的)
    char
    argv[1]
    是指针,并且
    sizeof argv[1]
    将返回指针的大小,而不是数组。
    while(argv[1][i]!='\0')
    while(argv[1][i])
    sizeof(argv[1])/sizeof(argv[1][0])
    并不意味着
    strlen strlen(argv[1])
    。前者是指针的大小除以
    char
    argv[1][0]
    ,这通常与从
    argv[1]
    开始的字符串长度不同,因为指针的大小与传递给程序的字符串无关。
    sizeof(argv[1])/sizeof(argv[1][0])
    并不意味着
    strlen(argv[1])
    。前者是指针
    argv[1]
    的大小除以
    字符的大小<