0

質問。「C Programming」などの文字列が次のようにアドレス値としてコンパイルされるのはなぜですか?

 #include <stdio.h>

 void ShowAllString(int argc, char * argv[]) 
 {
     int i;
     for(i=0; i<argc; i++)
        printf("%s \n", argv[i]);
 }

 int main(void)
 {
     char * str[3]={
         "C Programming",
         "C++ Programming",
         "JAVA Programming"  };

    ShowAllString(3, str);
    return 0;
  }

私のアナロジーは次のようなものでした...できれば訂正してください。

char * argv[] パラメータの場合、これは char ** argv と同等です。したがって、この関数は void ShowAllString(int argc, char ** argv) のように、引数として double ポインターを受け取ります。したがって、str は配列 char * str[3] の名前であり、str はここでは配列名としての二重ポインターであるため、パラメーターとして str を持つことは理にかなっています。char * str[3] は、ポインターの 3 つの要素を持つことになっている配列です....しかし、アドレス値の代わりにそのような文字列が char * str[3] の隣に配置されるのはなぜですか...これは私が立ち往生している場所です!

私を助けてください!

4

2 に答える 2

1

配列名がパラメーターとして渡されると、ポインターに崩壊します。コードには、3 つのポインターの配列があります。したがって、ポインターへのポインターに崩壊します。

于 2013-03-29T22:08:31.553 に答える
0

C では、 の配列がメモリ内で次々に格納されるchar[]場所へのポインタです。charたまたま、これは文字列を保存する良い方法です。あなたのコードでは、 の配列への 3 つのポインターの配列を作成していますchar。最初の は、 「C プログラミング」のシーケンスがメモリに格納されstr[0]ている場所を指し、以下同様です。char

(日常の英語では、一般に「一連のchar」を「文字列」と呼びますが、技術的には、最初のコメントが正しく指摘しているように、これchar[]は定義上文字列を意味する必要があることを意味しますが、そうではありません。)

このポインターの配列へのポインターを関数に渡すと、関数はchar("strings")の各配列へのポインターを取得します。printf行は、このポインターを使用して文字列 (の配列char) を取得し、それらを出力します。

于 2013-03-29T22:14:59.447 に答える