我正在查看將大寫字母轉換為小寫的這段代碼,我不明白它為什么宣告char*argv[],后來在它使用的 for 回圈中,就argv[1][i]好像它是一個二維陣列一樣。歡迎任何提示,謝謝。
#include <stdio.h>
int main(int argc, char*argv[]){
if(argc>1) {
int i;
char c;
for(i=1; (c=argv[1][i]) != '\0'; i ){
if('A'<=c && c<='Z')
putchar(c 'a'-'A');
else
putchar(c);
}
putchar('\n');
}
}
uj5u.com熱心網友回復:
argv實際上不是二維陣列,而是char *. 這些指標中的每一個都指向一個字串,每個字串都是一個char陣列,因此可以像訪問二維陣列一樣訪問它。
更具體地說,每個成員argv都是傳遞給程式的命令列引數,第一個成員通常是程式的名稱。這些引數是字串,每個字串都是一個字符陣列。所以從第一個命令列引數中獲取第 i 個argv[1][i]字符。
uj5u.com熱心網友回復:
從 main 中第二個引數的宣告可以看出
char*argv[]
它是一個型別的指標陣列char *。
請注意,具有陣列型別的函式引數由編譯器調整為指向陣列元素型別的指標。
所以 main 的這兩個宣告
int main(int argc, char*argv[]){
和
int main(int argc, char**argv){
是等價的。
因此,如果您有一個指標陣列,例如
char * s[] = { "Hello", "World" };
那么這個陣列包含兩個指向字串文字的第一個字符的指標"Hello"和"World".
因此,要輸出陣列的元素,您可以使用這些嵌套的 for 回圈
for ( size_t i = 0; i < sizeof( s ) / sizeof( *s ) /* == 2 */; i )
{
for ( size_t j = 0; s[i][j] != '\0'; j )
{
putchar( s[i][j] );
}
putchar( ' ' );
}
putchar( '\n' );
要了解內部回圈,請考慮以下代碼片段
char *p = "Hello";
for ( size_t i = 0; s[i] != '\0'; i )
{
[utchar( s[i] );
}
putchar( '\n' );
在第一個代碼片段中,您有一個包含兩個此類指標的陣列。
uj5u.com熱心網友回復:
當您使用引數運行代碼時,它們存盤在char argv陣列中。這意味著這些值存盤在一個字符陣列中(保存一個字串值)
每個引數都用空格分隔,例如a.exe hello。
如果你這樣做,printf("%s", argv[1]);
你會得到結果“hello”,它的值argv[1] 是整個字串,如果你想訪問該字串的單個字符,你可以使用多陣串列示法來完成argv[1][0],這會給你第一個字符,在這個案例,h
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/434173.html
上一篇:訪問特定指標時出現分段錯誤
