配列名とポインタの違い


多くのプログラマーは配列名とポインタの違いをよく知らない.配列名はポインタだと思っているが、実際には配列名とポインタには大きな違いがあり、使用時に正確に区別しなければならない.その区別規則は以下の通りである.
  
ルール1配列名は、配列であるデータ構造を指す.
                    char str[10];
                   char *pStr = str;
                   cout << sizeof(str) << endl;
                   cout << sizeof(pStr) << endl;
出力結果:
                        10
                           4
これは、配列名strがデータ構造char[10]を指すことを示す.
     
ルール2配列名は、そのエンティティを指すポインタに変換することができ、ポインタ定数であり、自己増加、自己減少などの操作を行うことができず、修正することができない.
              char str[10];
              char *pStr = str;
               str++;//コンパイルエラー、strが左でないことを示すプロンプト
              pStr++;//コンパイルが正しい
  
ルール3が配列を指すポインタは別の変数タイプ(WIN 32プラットフォームでは長さ4)であり、配列の格納アドレスのみを意味する.
  
ルール4配列名が関数パラメータとして機能する場合、関数体内では、それ自体の内包を失い、ただのポインタである.残念ながら、その内包を失うと同時に、定数特性を失い、自増、自減などの操作ができ、修正することができる.
例:

  void arrayTest(char str[])
  {
     cout << sizeof(str) << endl;   //      
   str++; //     
   }
  int main(int argc, char* argv[])
  {
    char str1[10] = "I Love U";
    arrayTest(str1); 
     return 0;
  }