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

for sizeof(x) VS while ([x] != '\0') in C

我只是想知道使用

是否有区别
for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {

while (argv[1][i] != '[=11=]')

我只是好奇,我找不到任何相关信息。

(objective是putcharchar*的每一个字符)

这两个条件有本质区别

表达式 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++) {

等同于

for(i = 0; i < 6; i++) {

因为终止零也包含在数组中。也就是说,循环体也将获得字符 '[=24=]'.

的控制权

虽然这个循环

while ( s[i] != '[=13=]')

在遇到字符 '[=24=]' 时停止迭代。

这是一个显示差异的演示程序。程序输出符号的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] != '[=14=]' )
    {
        printf( "%d ", s[i] );
        ++i;
    }
    
    putchar( '\n' );
    
    
    return 0;
}

程序输出为

72 101 108 108 111 0 
72 101 108 108 111 

它们不是一回事(尽管它们很接近)。

第一个

for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {

表示:

  1. i设置为0

  2. sizeof(argv[1]) / sizeof(argv[1][0])表示strlen(argv[1]),所以表示

while i is less than the length of argv[1]

这与

基本相同
int i = 0;
while(argv[1][i++] != '[=12=]')

有两个区别:

  1. 在第二个中,i 永远不会设置为 0

  2. 在第二个中,i 永远不会增加(尽管在循环本身中它可能会增加)