我了解到,在将数组传递给函数时,编译器在幕后执行的操作是将其转换为指向数组首元素的指针。
int myArray(int arr[])
转化为
int myArray(int *arr)
大多数情况下,数组会衰变为指针,例如:
arr[0]
与
是一样的。(arr + 0)
(如有错误请指正)
但是当涉及到char *argv
时,就会变得很混乱,char *argv[]
翻译为字符串数组。
例如:
argv[2] = "Hello"
argv[3] = "World"
**argv
和 *argv[]
怎么会相同呢?因为 **argv
是一个指向指针的指针,而它又是如何包含 10 个不同的值呢?我觉得我可能理解错了什么。
int*
指针变量只是指向一个int
类型的地址,它怎么可能包含 10 种不同的值呢? - Siguzaint*** == int** == int* == int
。最终,所有指针只是存储内存地址的数字。可以根据各个数组的长度和所引用的索引来评估所讨论的数组的值。一个常见的伪例子是对于int**
,其中arr[1][2]
可能会检索到地址arr + (sizeof(int) * len(arr) * 1) + (sizeof(int) * 2)
(这可能因编译器等而异,但基本上是这样的一个想法)。 - Rogueargv
指向的是一个指针,而不是 10 个值。 - chux - Reinstate Monica