問題的陣列的機制不是關於argv
是特殊的,但是關於功能參數傳遞。嘗試此程序:
#include<stdio.h>
void foo(int a[])
{
int b[10];
printf("foo :%p %p\n",a,&a);
printf("foo :%p %p\n",b,&b);
}
int main(int argc, char* argv[])
{
int a[10];
printf("main:%p %p\n", a, &a);
foo(a);
return 0;
}
輸出在我的機器:
main:0x7fffb4ded680 0x7fffb4ded680
foo :0x7fffb4ded680 0x7fffb4ded628
foo :0x7fffb4ded630 0x7fffb4ded630
第一和第三線並不奇怪,因爲用於陣列arr
,arr
和&arr
具有相同的值。第二行需要解釋。
正如你所看到的,當a
在功能foo
傳遞的a
值沒有改變,但是地址&a
被改變,因爲C函數總是按值傳遞參數,就會有爭論的本地副本在函數內部。
這與argv
一樣,因爲它只是函數main
中的一個參數。
編輯:對於那些誰與我不同意,我的答案是不反對對方的回答。相反,他們完成對方。 argv
是一個指針,因爲它是一個作爲函數參數傳遞的數組,它「衰減」成指針。再次,argv
不是特殊的,它與其他作爲函數參數傳遞的數組沒有區別,這就是我的示例代碼的全部意義。
printf(「%d%d」,a,&a);這裏&a和a將指向相同的地址......所以您不需要同時打印它們,並使用%p代替%d來打印地址。 – sunny1304
我認爲這是因爲argv指針已初始化,但您的指針並非如此得到相同的地址 – Saxtheowl