由于字符串的 printf 使用输入中的地址,为什么 printf 不只接受“argv”

Spe*_*987 7 c arrays printf pointers argv

int main(int argc, char **argv){
    printf("argv: %s\n",argv); // does not work and prints random stuff
    printf("*argv: %s\n",*argv); // works and prints ".a.out"

}
Run Code Online (Sandbox Code Playgroud)

我测试:

./a.out nop
Run Code Online (Sandbox Code Playgroud)

我的困惑是这样的:

第二行中的“argv”变量具有“./a.out”的第一个字符的地址。

第三行中的“*argv”变量是“./a.out”的第一个字符。

那么为什么printf("argv: %s\n",argv);只打印“./a.out”不起作用呢?

我知道这是错误的,但我不知道为什么。

在此输入图像描述

185*_*.41 5

argv是一个指向指针的指针。这意味着它“指向”地址,而不是直接指向字符。

因此,在 address 处argv,存储的是其他地址,而不是字符串。如果要访问第一个字符串,则必须使用它的地址,即*argvargv[0]

不知道我说的够不够清楚,欢迎追问。