为什么我必须使用二维数组?

Why do I have to use a two-dimensional array?

我正在审查这段将大写字母转换为小写字母的代码,我不明白为什么它声明 char*argv[] 并且后来在 for 循环中它使用 argv[1][i] 就好像它是一个二维数组。 欢迎任何提示,谢谢。


#include <stdio.h>

int main(int argc, char*argv[]){
    if(argc>1) {
        int i;
        char c;
        for(i=1; (c=argv[1][i]) != '[=10=]'; i++){
            if('A'<=c && c<='Z')
                putchar(c+'a'-'A');
            else
                putchar(c);
        }
        putchar('\n');
    }
}

argv其实不是二维数组而是char *的数组。这些指针中的每一个都指向一个字符串,每个字符串都是一个 char 数组,因此可以像二维数组一样访问它。

更具体地说,argv 的每个成员都是传递给程序的命令行参数,第一个成员通常是程序的名称。这些参数是字符串,每个字符串都是一个字符数组。所以 argv[1][i] 从第一个命令行参数中获取第 i 个字符。

从main中第二个参数的声明可以看出

char*argv[]

它是一个char *类型的指针数组。

注意编译器将具有数组类型的函数参数调整为指向数组元素类型的指针。

所以main的这两个声明

int main(int argc, char*argv[]){

int main(int argc, char**argv){

是等价的。

所以如果你有一个指针数组,例如

char * s[] = { "Hello", "World" };

那么这个数组包含两个指向字符串文字 "Hello""World".

的第一个字符的指针

所以要输出数组的元素,您可以使用这些嵌套的 for 循环

for ( size_t i = 0; i < sizeof( s ) / sizeof( *s ) /* == 2 */; ++i )
{
    for ( size_t j = 0; s[i][j] != '[=14=]'; ++j )
    {
        putchar( s[i][j] );
    }
    putchar( ' ' );
}

putchar( '\n' );

要了解内部循环,请考虑以下代码片段

char *p = "Hello";
for ( size_t i = 0; s[i] != '[=15=]'; i++ )
{
    [utchar( s[i] );
}
putchar( '\n' );

在第一个代码片段中,您有一个包含两个此类指针的数组。

当您 运行 您的代码带有参数时,它们存储在 char argv 数组中。 这意味着这些值存储在一个 char 数组中(保存一个字符串值)
每个参数之间用空格隔开,例如a.exe 你好.
如果你这样做 printf("%s", argv[1]);
您将得到结果“hello”,argv[1] 的值是整个字符串,如果您想访问该字符串的单个字符,您可以使用 multi-array 表示法 argv[1][0] 来实现会给你第一个字符,在这种情况下,h