0
char c='c';
char *pc = &c;
char a[]="123456789";
char *p = &(a[1]); 
cout <<"the size of the a: "<< sizeof (a)<< endl; //10
cout <<"the size of the p: "<< sizeof (p)<< endl; //4
cout << p[100] <<endl;//cross boundary intentionally
cout << pc[0];//c
cout << pc[1];

コンパイラはpを配列として扱わなくなりましたか?コンパイラはそれが配列であるかどうかをどのように検証しますか?ppcに違いはありますか?

ありがとう!!!!

4

4 に答える 4

1

コンパイラはpを配列として扱わなくなりましたか?

配列として扱われることはありませんでした。それは常にポインタでした。配列はポインタではありません。これを読んで、受け入れて、受け入れてください!それらは(パラメーターとして渡されたときに)ポインターに減衰することがありますが、ポインターではありません。

pとpcに違いはありますか?

タイプごと-いいえ。それらが異なるを指しているという点で違いがありcharます。

また、pc[1]未定義動作です。直接にメモリpcポイントを所有しているだけです。つまり、文字を含む1バイトだけ'c'です。同じことがp[100]

于 2012-11-28T04:06:14.383 に答える
1

コンパイラは、配列として宣言された変数、つまり角括弧で宣言された変数のみを配列として扱います。ポインターは配列ではありませんが、ポインター式を作成する目的で配列名をポインターのように扱うことはできます。

于 2012-11-28T04:10:48.807 に答える
1

コンパイラが配列の境界をチェックする配列構造を使用したい場合は、std::vector. 例えば

#include <vector>

int main()
{
    int array[]={0,1,2,3,4,5};
    std::vector<int> vec;
    vec.assign(array, array+6);

    for(unsigned int i=0; i<vec.size(); ++i)
    {
         std::cout << vec.at(i);
    }

    return 0; 
}

ここで、vec.at(i) はベクトルの境界をチェックします。vec[i] を使用する場合、これも有効ですが、コンパイラは境界をチェックしません。それが役立つことを願っています。

于 2012-11-28T07:59:31.390 に答える
0

コンパイラは、pを配列として扱うことはできません。pは、任意のアドレスを割り当てることができるcharへの単なるポインタです。なぜコンパイラはそれを配列として扱うのでしょうか?

于 2012-11-28T04:07:24.773 に答える