數組指針等價的東西只成立只爲函數參數,因此,儘管void fn(const char* argv[])
和void fn(const char** argv)
是等價的,但它不是真實的,當涉及到的變量,你可能想傳遞給函數。
考慮
void fn(const char** argv)
{
...
}
int main(int argc, const char* argv[])
{
fn(argv); // acceptable.
const char* meats[] = { "Chicken", "Cow", "Pizza" };
// "meats" is an array of const char* pointers, just like argv, so
fn(meats); // acceptable.
const char** meatPtr = meats;
fn(meatPtr); // because the previous call actually cast to this,.
// an array of character arrays.
const char vegetables[][10] = { "Avocado", "Pork", "Pepperoni" };
fn(vegetables); // does not compile.
return 0;
}
「蔬菜」不是一個指針的指針,它直接指向在3×10個連續字符序列的第一個字符。在上述替換FN(蔬菜),以獲得
int main(int argc, const char* argv[])
{
// an array of character arrays.
const char vegetables[][10] = { "Avocado", "Pork", "Pepperoni" };
printf("*vegetables = %c\n", *(const char*)vegetables);
return 0;
}
,輸出是「A」:蔬菜本身直接指向 - 無需間接 - 的字符,而不是中間指針。
蔬菜的分配基本上是這樣一個快捷方式:
const char* __vegetablesPtr = "Avocado\0\0\0Pork\0\0\0\0\0\0Pepperoni\0";
vegetables = __vegetablesPtr;
和
const char* roni = vegetables[2];
轉化爲
const char* roni = (&vegetables[0]) + (sizeof(*vegetables[0]) * /*dimension=*/10 * /*index=*/2);
來這裏張貼,所以+1你。另外,將它寫爲'char * argv []'可能更有意義,因此讀取指針數組更容易。 – austin
不,這也是錯誤的,'argv'是指向指針的指針。考慮'sizeof()',將'argv'變量賦值給別的東西等等...... – 2013-06-22 20:12:32
@ H2CO3 C井把'argv'指向一個指針數組。但嚴格來說是的,正式的'main'參數被調整爲指向指針的指針。 – ouah