2013-08-21 69 views
5

對於下面給出的程序,爲什麼第一個printf會打印argv&argv的不同值?第二個printfa&a打印相同的值。將參數變量傳遞給程序的機制是什麼?argv和正常字符串數組之間的不同輸出

#include<stdio.h> 
    int main(int argc, char * argv[]){ 
    char * a[10]; 
    printf("%d %d\n\n",argv,&argv); 
    printf("%d %d",a,&a); 
    return 0; 
} 

什麼是存儲命令行參數串

+1

printf(「%d%d」,a,&a);這裏&a和a將指向相同的地址......所以您不需要同時打印它們,並使用%p代替%d來打印地址。 – sunny1304

+0

我認爲這是因爲argv指針已初始化,但您的指針並非如此得到相同的地址 – Saxtheowl

回答

5

問題的陣列的機制不是關於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 

第一和第三線並不奇怪,因爲用於陣列arrarr&arr具有相同的值。第二行需要解釋。

正如你所看到的,當a在功能foo傳遞的a值沒有改變,但是地址&a被改變,因爲C函數總是按值傳遞參數,就會有爭論的本地副本在函數內部。

這與argv一樣,因爲它只是函數main中的一個參數。


編輯:對於那些誰與我不同意,我的答案是不反對對方的回答。相反,他們完成對方。 argv是一個指針,因爲它是一個作爲函數參數傳遞的數組,它「衰減」成指針。再次,argv不是特殊的,它與其他作爲函數參數傳遞的數組沒有區別,這就是我的示例代碼的全部意義。

+0

不錯的示例代碼!我只是認爲在我看到你的答案之前,main中的'argv'有一些特殊的地方! –

+0

這不是真的答案。對於數組類型的任何變量'a','&a'和'a'作爲指針將*總是*具有相同的地址。這是C中數組類型工作的結果。區別在於'argv'不是數組類型。 – newacct

+0

@newacct那麼爲什麼'argv'是一個指針?完全是因爲它是作爲函數參數傳遞的,「衰減」成指針。 –

4

從C標準的段落6.7.6.3廣告7在你的例子argva之間的區別如下:

的參數爲「」類型的數組「的聲明」應調整到''限定指針類型'',其中類型限定符(如果有的話)是在數組類型派生[和]中指定的那些。如果關鍵字static也出現在數組類型派生的[和]中,那麼對於函數的每次調用,相應實際參數的值應提供對數組第一個元素的訪問,其中至少與指定的元素數量一樣多由尺寸表示。

因此argv是具有其自己的地址的指針,而a是一個數組並a指向的數組,這是相同的數組的地址的第一個元件的地址。

+0

+1這是真正的答案 – newacct

相關問題