C/C++配列名とポインタ(zhuan)

2855 ワード

1、配列名はポインタではありません
プログラムを見てください(本プログラムはWIN 32プラットフォームの下でコンパイルします):1. #include
2. int main(int argc, char* argv[])
3. {
4.  char str[10];
5.  char *pStr = str;
6.  cout << sizeof(str) << endl;
7.  cout << sizeof(pStr) << endl;
8.  return 0;
9. }
配列名がポインタではないことを証明します.配列名はポインタです.pStrもstrもポインタです.WIN 32プラットフォームの下で、ポインタの長さは4です.したがって、6行目と7行目の出力はいずれも4であるべきである.実際の状況は、6行目出力10、7行目出力4;だから:仮に成立しないと仮定して、配列名はポインタではありません
注意:ポインタは、構造体、配列、基本データ型を指すポインタにかかわらず、元のデータ構造の内包は含まれていません.WIN 32プラットフォームではsizeof操作の結果は4です.多くのプログラマーはsizeofが関数だと思っていますが、実際にはオペレータですが、その使い方は確かに関数のように見えます.文sizeof(int)はsizeofが確かに関数ではないことを説明することができる.関数はパラメータ(変数)を受け入れ、世界にはintのようなデータ型を「パラメータ」として受け入れるC/C++関数はないからだ.
2、配列名の神似ポインタ検出配列名をポインタの例のように見せることもできます.
  • 1. #include
  • 2. #include
  • 3. int main(int argc, char* argv[])
  • 4. {
  • 5.  char str1[10] = "I Love U";
  • 6.  char str2[10]; 
  • 7.  strcpy(str2,str1);
  • 8.  cout << "string array 1: "<< str1 << endl;
  • 9.  cout << "string array 2: "<< str2 << endl;
  • 10.  return 0;
  • 11. }

  • 配列名がポインタではないことを証明しましたが、プログラムの5行目を見てみましょう.このロー・プログラムは、配列名をポインタに直接割り当てます.これは、配列名がポインタであるように見えます.標準Cライブラリ関数strcpyの関数原形に受け入れられる2つのパラメータはchar型ポインタですが、呼び出しで渡されるのは2つの配列名です.関数出力:string array 1: I Love U
    string array 2: I Love U
    配列名が再びポインタのように見えます!配列名がポインタではない以上、なぜあちこちで配列名をポインタとして使うのですか?そこで,多くのプログラマーは,配列名(主)がポインタではないポインタ(賓)であると結論した.
    配列名を明らかにするのは今から配列名の本質を暴露する時になって、まず3つの結論を出します:(1)配列名の内包はその指代実体が1種のデータ構造であることにあって、このようなデータ構造は配列です;(2)配列名のエピタキシャルは、そのエンティティを指すポインタに変換でき、ポインタ定数である(cosntポインタであり、ポインタは変化しない).(3)配列を指すポインタは別の変数タイプ(WIN 32プラットフォームでは長さ4)であり,配列の格納アドレスのみを意味する.
    注意:「定数ポインタ」および「ポインタ定数」
    「定数ポインタ」:(constオブジェクトへのポインタ)が指すアドレス上のデータの時定数.
    「ポインタ定数」:(cosntポインタ)が指すアドレスは定数であり、アドレス上のデータは変化することができる.
    3、データ名はそのデータ構造の内包を失う可能性がある
  • 1. #include
  • 2. void arrayTest(char str[])
  • 3. {
  • 4.  cout << sizeof(str) << endl;
  • 5. }
  • 6. int main(int argc, char* argv[])
  • 7. {
  • 8.  char str1[10] = "I Love U";
  • 9.  arrayTest(str1); 
  • 10.  return 0;
  • 11. }

  • プログラムの出力結果は4です.
    結論1では,データ名は配列というデータ構造を内包し,arrayTest関数内でstrは配列名であるが,sizeofの結果はポインタの長さであるのはなぜであるかを指摘した.これは,(1)配列名が関数パラメータとして機能する場合,関数体内ではそれ自体の内包を失い,ただのポインタであるからである.(2)残念ながら,その内包を失うとともに,その定数特性を失い,自己増加,自己減少などの操作が可能となり,修正される.したがって,データ名が関数形パラメータとして機能すると,その全体が通常のポインタに転落する!その貴族の身分は奪われ、4バイトしか持たない庶民になった.