首先的困惑就像下述链接描述的一样:

char *argv[] && char **argv

char *argv[]

这是指向 char 的指针数组 。数组中的每个元素都是一个指针,它指向一个字符串(一个字符序列)。

常用于 main 函数的上下文中 ,以处理命令行参数。它通常定义为 int main(int argc, char *argv[])int main(int argc, char **argv)

char *argv[] 用于表示多个字符串(命令行参数),而 char argv[] 表示单个字符串(字符数组)。

printf("%s\n", argv[0]);  sh 正确:打印整个字符串
printf("%c\n", argv[0]);  未定义行为(可能乱码/崩溃) | 错误:%c 需要 char,但 argv[0] 是 char*
printf("%c\n", argv[0][0]);  正确:打印字符串的第一个字符
地址 0x1000: 's'
地址 0x1001: 'h'
地址 0x1002: '\0' (字符串结束符)

printf 的 %s 格式化符号的工作原理:

它期望一个 char 类型的参数*(即字符串的起始地址)。

从该地址开始,逐个字符打印,直到遇到 \0(NULL 终止符)。

它 自动解引用指针,并持续向后读取内存,直到 \0。

等价

char *ptr = argv[0];  // ptr 指向 "sh" 的首地址
while (*ptr != '\0') {
    putchar(*ptr);    // 打印当前字符
    ptr++;           // 移动到下一个字符
}