数组下标操作a[i]
定义为*(a + i)
- 给定地址a
,从该地址偏移i
元素(不是字节)并取消引用结果。因此,给定一个指针p
,*p
等价于*(p + 0)
,这等价于p[0]
。
的类型argv
是char **
; 鉴于此,以下所有情况都是正确的:
Expression Type Value
---------- ---- -----
argv char ** Pointer to a sequence of strings
*argv char * Equivalent to argv[0]
**argv char Equivalent to argv[0][0]
argv[i] char * Pointer to a single string
*argv[i] char Same as argv[i][0]
argv[i][j] char j'th character of i'th string
&argv[i] char ** Address of the pointer to the i'th string
由于argv[i][j]
is的类型char
,*argv[i][j]
不是有效的表达式。
这是argv
序列的糟糕可视化:
+---+ +---+ +---+
argv | | ---> argv[0] | | ---------------------------> argv[0][0] | |
+---+ +---+ +---+ +---+
argv[1] | | -------> argv[1][0] | | argv[0][1] | |
+---+ +---+ +---+
... argv[1][1] | | ...
+---+ +---+ +---+
argv[argc] | | ---||| ... argv[0][n-1] | |
+---+ +---+ +---+
argv[1][m-1] | |
+---+
这可能有助于解释不同表达式的结果。