2017-03-21 8 views
2

私たちは、このように、コマンドラインから引数を取っているときに間接参照コマンドライン引数には必要ありません。なぜ我々は(簡単に)

int main(int argc, char *argv[]) { } 

それはARGVは、ポインタの配列へのポインタであることを私の理解であります、これが事実であるので、なぜそれが、我々はそれを逆参照することなく、

argv[i] 

を使用してcommnandライン引数にアクセスできることである渡された引数のアドレスを保持する。

、ポインタが含まれているので?主な機能には

+1

'argv'がポインタに、ではない配列へのポインタでありますポインタの。それが指摘しているのは配列の中で最初のものです。 – StoryTeller

+2

[時計回り/螺旋規則](http://c-faq.com/decl/spiral.anderson.html)の宣言では、 'char * argv []'宣言は 'argv'が'char'。私。文字列の配列技術的には、配列を引数として渡すことはできないので、実際には正しいわけではありませんが、実用上の理由から、 'argv'をどのように見るべきですか。文字列の配列として。さらに –

+0

にアクセスする前に、 'argc'をチェックしてから' argv'要素にアクセスしてください。これは、範囲外の配列へのアクセスを避けるために付与されます。 – LPs

答えて

2

それは絶対、アドレスではない始めている介して、あなたは文字列(char *)にアクセスしていることを忘れていますvalue ...文字列にはどのような値を格納しますか? 「文字列」タイプを使用する必要があります。したがって、「文字列」の長さはどのくらいですか?

Cの文字列は、nul(\0)で終わる印刷可能な文字数で構成されます。これらはメモリに保存されます。

char *argv[]パラメータは、char *要素の配列があることを指定しています。上記のように、char *は文字列(またはchar要素の配列)です。

char **argvのように、char *argv[]パラメータを正式に宣言することもできます。

たとえば、あなたは、メモリ内の自分のアドレスとともに、文字列の各文字の絶対値を出力することができます:ここで

#include <stdio.h> 

int main(void) { 
    char *my_string = "Hello World"; 
    int i; 

    for (i = 0; my_string[i] != '\0'; i++) { 
     printf("%c - 0x%02hhX - %p\n", my_string[i], my_string[i], &(my_string[i])); 
    } 

    return 0; 
} 

、我々はmy_string[i]を使用して単一の文字を取得するには、ポインタを参照解除されています。

出力:

H - 0x48 - 0x400614 
e - 0x65 - 0x400615 
l - 0x6C - 0x400616 
l - 0x6C - 0x400617 
o - 0x6F - 0x400618 
    - 0x20 - 0x400619 
W - 0x57 - 0x40061a 
o - 0x6F - 0x40061b 
r - 0x72 - 0x40061c 
l - 0x6C - 0x40061d 
d - 0x64 - 0x40061e 

あなたが均等に(デリファレンスに注意してください)のようなので、このプログラムを実行することができます:

#include <stdio.h> 

int main(void) { 
    char *my_string = "Hello World"; 
    char *s; 

    /* s = my_string 
    * is equivelant to: 
    * s = &(my_string[0]) */ 

    for (s = my_string; *s != '\0'; s++) { 
     printf("%c - 0x%02hhX - %p\n", *s, *s, s); 
    } 

    return 0; 
} 
+0

'main main(void)'ではなく 'int main(void)'を使用してください。前者はC11標準の 'main'の標準的な署名です。 –

1

int argc、main関数に渡されたどのように多くの文字列を定義:int argc文字列の数はchar *argv[]アレイ

int main(int argc, char *argv[]) { } 

のint argcので指されます。

するchar * ARGV []:

char *argv[]ストアすべての単語/この配列内の引数。

例:

#include <stdio.h> 
int main(int argc, char const *argv[]){ 
    for(int i=0; i<argc; i++){ 
    printf("%s\n", argv[i]); 
    } 
    return 0; 
} 

コンパイル:

GCC -o Cはexample.c

実行:

が1〜2 ./c 4 5

出力:

./c 
one 
two 
there 
four 
five