文章

为什么char *argv[]表示字符串?

·

在学习C语言的时候,常常看到 int main(int argc, char argv[]) ,而大部分国内教科书里并不会介绍括号里的两个参数。

为什么char *argv[]表示字符串?

在学习C语言的时候,常常看到int main(int argc, char *argv[]),而大部分国内教科书里并不会介绍括号里的两个参数。这两个参数的含义并不复杂:

  • int argc:参数个数

  • char *argv[]:参数数组

由于我个人此前忘记其原理解释,一度只知道怎么用,所以特此记录为什么char *argv[]表示字符串。

我们知道C语言里严格意义上没有字符串,只有字符,那么类似字符串的功能是由字符数组替代的,其中又有几种等价的语法表示和读取字符数组:

  • char c[] = "hello";

  • char c[] = {'h', 'e', 'l', 'l', 'o', '\0'};

  • char *c = "hello";

这三种方法都可以让我们通过下标访问字符。

因此,我们考虑:char *argv[] = {"hello", "world"};

首先,argv 是一个数组,而数组元素的类型是 char *。换句话说,数组中每个位置存放的都是一个指向字符的指针。

具体来说:

argv[0] // 指向字符串 "hello" 的首字符 'h'
argv[1] // 指向字符串 "world" 的首字符 'w'

argv[0] 并不直接保存整个 "hello",它保存的是字符串首字符所在的地址。由于字符串中的字符连续存储,并且以 '\0' 结尾,因此只要知道首字符的位置,就可以依次找到后面的字符。

例如:

argv[0][0] // 'h'
argv[0][1] // 'e'
argv[0][2] // 'l'
argv[0][3] // 'l'
argv[0][4] // 'o'
argv[0][5] // '\0'

这里的第一层下标用于选取字符串,第二层下标用于选取字符串中的字符。

实际上:argv[0][1] ⟺ *(argv[0] + 1)

argv[0] 指向 'h',argv[0] + 1 指向下一个字符 'e',再通过 * 取得对应的字符。

因此,char *argv[] 能够表示一组字符串,并不是因为数组直接存储了所有字符串,而是因为它存储了一组字符指针,每个指针分别指向一个字符串的首字符。

表达式 含义 类型
argv 字符指针数组 char *[2]
argv[0] 指向 "hello" 首字符的指针 char *
argv[1] 指向 "world" 首字符的指针 char *
argv[0][0] 字符 'h' char
&argv[0] 数组第一个元素的地址 char **