理解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++; // 移动到下一个字符
}