說起Ç
我知道
的C,什麼是 「無效的主要(INT ARGC,CHAR *的argv [0])」,注意argv中零
void main (int argc, char *argv[])
是正確的方法參數傳遞給主,
但出於好奇,我寫了
void main (int argc, char *argv[1])
和程序,編譯之後表現出完全相同的結果爲前一個。
究竟我在第二版中做了什麼,有人可以解釋我嗎?
在此先感謝。
說起Ç
我知道
的C,什麼是 「無效的主要(INT ARGC,CHAR *的argv [0])」,注意argv中零
void main (int argc, char *argv[])
是正確的方法參數傳遞給主,
但出於好奇,我寫了
void main (int argc, char *argv[1])
和程序,編譯之後表現出完全相同的結果爲前一個。
究竟我在第二版中做了什麼,有人可以解釋我嗎?
在此先感謝。
void main (int argc, char *argv[1])
和
void main (int argc, char *argv[])
是等價的。
argv
是一個指針(char**
)和main()
爲其指定的大小不是字符串在argv
實際尺寸 - 因爲傳遞給函數的數組被轉換成一個指針到它的第一個元素。基本上,編譯器會忽略大小值。
出於同樣的原因,你可以指定:
void main (int argc, char *argv[101])
,它仍然可以工作,你會期望。 閱讀代碼的人可能會感到困惑。但它是完全有效的。
相關的職位:What is array decaying?
小修正。編譯器會忽略最後一個維**的大小值**。在這種情況下沒有什麼區別,但是爲了嚴謹起見,可能值得修復。 –
@ShacharShemesh不完全正確。在函數foo(int array [] [16])中,它是編譯器*需要知道的最後一個維度。 –
說明*最左邊的維被忽略*是毫不含糊的。 –
首先,C的來講,main()
返回類型應該是int
。 這是從C語言標準:
5.1.2.2.1計劃啓動
1名爲在程序啓動的功能被命名爲main
。 執行聲明 此功能的原型。它應具有的int
返回類型並沒有 參數來定義:
int main(void) { /* ... */ }
或兩個參數(這裏稱爲
argc
和argv
,雖然任何人的名字,可以 使用,因爲它們是本地在聲明它們的功能):
int main(int argc, char *argv[]) { /* ... */ }
或同等學歷;或者以某種其他實現定義的方式。
二,char *argv[]
是有以允許多個命令行參數。雖然char *argv[0]
看起來很奇怪但是有效,但通常留給你的命令行參數分析程序處理這個以編程方式。
下面是一個代碼示例表明char *argv[0]
不影響命令行參數解析:
#include <stdio.h>
int main(int argc, char *argv[0])
{
for (int i = 0; i < argc; i++)
printf("%s\n", argv[i]);
return 0;
}
在函數參數聲明的上下文中,T a[N]
和T a[]
都相當於T *a
;他們宣佈a
作爲指向T
的指針。
在argv
的情況下,T
是char *
。
如果T
是數組類型R [M]
,然後R a[N][M]
和R a[][M]
相當於R (*a)[M]
;他們宣佈a
作爲指向R
數組的指針。
試着用2或3個參數執行第二個版本 –
@ThomasAyoub你是什麼意思? –