ポインタと配列の違い.

3022 ワード

ポインタと配列の違い
私は、配列がポインタとして導入される多くの場所で見ました.これは技術的に正しくない.配列はポインタではありません.それで何ですか.それはC +で他の変数のようです.
以下のコードを見てください.
int arr [ 3 ] = { 3 , 4 , 5 };
カウント<< arr ;
あなたは言うかもしれません:「そこで見てください、ARRはアドレスです.そして、それはポインターでないと言います?」
このコードはアドレスを出力します.VARはアドレスですか?
int var ;
カウント<<&
説明しましょう
すべての変数は、そのアドレスによってメモリ内で操作することができます.CPUはこれらのアドレスを使ってフェッチし、変更して保存します.したがって、すべての変数にはアドレスがあります.演算子による変数のアドレスは以下のようになります.
int * ptr =& intvar ;
//現在、intvarのアドレスがPtrにあります
配列は単なる変数の列です.しかし、C +は配列のように配列を見るという規則があります.それはどういう意味ですか.つまり、arrを書くと、コンパイラはそれをarrとして受け取ります.Tは配列要素の型です(ここではintです).1に加えると配列の2番目の要素がポイントされます.
それで、それは何をしますか?
ルールが適用されない例外の一つです.配列へのポインタとして使用します.再び配列の最初の要素を指しますが、このポインタに1を加えると、配列の最後の要素の直後の場所のアドレスを指します(配列をスキップしたように).配列全体へのポインタです.& ARRとARRの値は同じです(最初の要素のアドレス).しかし、彼らのタイプは異なります.ここで& arrは“tの配列へのポインタ”(arrの型と比較します)を持ちます.
これを見る
int arr [ 3 ] = { 3 , 4 , 5 };
配列の最初の要素をカウントする
最初の要素のアドレスを指定します
配列のアドレスをカウントする
これは何ですかARR <エンドL ;
最初のカウント:arr [ 0 ]の値を出力します.
2番目のカウント: arr [ 0 ]の"address "を出力します.
番目のカウント:再びARR [ 0 ]の「アドレス」を出力します.
end count :配列のアドレスを出力します.
これは
1
2
3
4
5
int arr [ 3 ] = { 3 , 4 , 5 };
配列の最初の要素をカウントする
最初の要素のアドレスを指定します
配列のアドレスをカウントする
これは何ですかARR + 1 <<終わり>
最初のカウント:ARR [ 0 ]プラス1の「値」を出力します.
番目のカウント:ARR [ 1 ]の「アドレス」カウントを出力します.
番目のカウント:再びARR [ 1 ]の「アドレス」を出力します.
end count :配列の後にメモリの最初のアドレスを出力します.
比較
それぞれの例として、
1 ) (*)は両方とも使えます.
int arr [ 3 ] = { 1 , 3 , 4 } ;/3要素の配列を宣言する
int * ptr = arr ;//array arrのアドレスを持つポインタptrを初期化する
カウント<<< arr + 2 >
カウント<< { Ptr + 2 )}
/*出力*/
4
2)サブスクリプションの両方を使用することができます
int arr [ 3 ] = { 1 , 3 , 4 } ;/3要素の配列を宣言する
int * ptr = arr ;//array arrのアドレスを持つポインタptrを初期化する
カウント<< arr [ 2 ])
カウント<< ptr [ 2 ])
/*出力*/
4
4
3 )ポインタとしてポインタを使用することができます.
int * ptr =新しいint [ 3 ];
ptr [ 0 ] = 12 ;
ptr [ 2 ] = 3 ;
カウント< ptr [ 2 ];
/*出力*/
3
4 )配列には型のポインタがある.つまり、その要素がポインタであることを意味します.
int Ar [ 2 ] = { 8 , 2 } ;
int変数1 = 66 ;
int変数2 = 111 ;
int * pt配列[ 5 ];
pt array [ 0 ] = Ar ;
pt array [ 1 ] =& ar [ 1 ];/配列ARの2番目の要素のアドレス
pt array [ 2 ] =& var 1 ;
pt array [ 3 ] =& var 2 ;
pt array [ 4 ] = & ar [ 0 ] ;
//コードを小さくするには、ループを使います
( int i = 0 ; i < 5 ; i++)
カウント<>
/*出力*/
8
2
66
111
8
5 )全ての配列はポインタとして関数に渡されます.関数( char [])は関数( char *)と同じです.
相違点
1 )ポインタはメモリ内の別の場所のアドレスを保持する場所です.一方、配列は隣接する要素の単一の、あらかじめ割り当てられたチャンク(同じ型のすべて)で、サイズと位置に固定されます.
3 )配列のようなポインタは配列のような定義で初期化できません.
1
2
チャーカー[ 3 ] = { ' a '、' b ', 66 }
char * cpt =新しいchar [ 3 ];/ここで初期化する方法はありません.
4 )動的配列として使用するポインタをメモリに割り当てるとき.メモリは、後でリサイズまたは解放することができます.しかし、これは配列の場合ではありません.
例えば、
1
2
3
char * pta = new char [ 12 ];
//ptaの使用
PTAを削除します
3)異なるアセンブリコードを生成する.ルックアンド比較
int main ()
{ }
チャーarr [ 3 ];
char * ptr =新しいchar [ 3 ];
arr[0]='C';   //Assembly is for this.  
ptr[0]='p';   //And for this.

return 0;