2017-01-15 5 views
1

へのポインタと参照、115ページ、それは次の例を示します:C++入門 - C++入門第5版、3.5節で配列

int *ptrs[10]; // ptrs is an array of ten pointers to int 
int &refs[10] = /* ? */; // error: no arrays of references 
int (*Parray)[10] = &arr; // Parray points to an array of ten ints 
int (&arrRef)[10] = arr; // arrRef refers to an array of ten ints 

私は1つを除いて、ほぼすべてのexemplesを理解:

「」もポイントです名前以来

int a[10]; 
int *p = a; 

int (*Parray)[10] = &arr; // Parray points to an array of ten ints 
は、アレイを指すように、私はちょうどのような何かを行うことができますポインタが名前 'a'で表されるポインターと同じ場所を指すようになりました。

は、私が本を読んで与えられた例をコンパイルしようとした私が使用していることを期待していた:

int (*Parray)[10] = &arr; // Parray points to an array of ten ints 

は私が与えた例のように同じ効果を持っているでしょう。問題はそれが起こらないで、ここでのコードは次のとおりです。

#include <iostream> 

using namespace std; 

int main(int argc, char const *argv[]) { 

    int arr[10] = {1,1,1,1,1,1,1,1,1,1}; 
    int *ptrs[10]; 
    int (*Parray)[10] = &arr; 
    int (&arrRef)[10] = arr; 

    cout << *(Parray + 1) << endl; 
    cout << Parray[1] << endl; 

    return 0; 
} 

このコードはコンパイルして、次のような出力が得られます。

0x7fff5c4a2ab8 
0x7fff5c4a2ab8 

誰かがまさに説明してもらえ:

int (*Parray)[10] = &arr; // Parray points to an array of ten ints 

をありますか?私はそれで何ができますか?

答えて

1

誰かが正確に何を説明してもらえ:

int (*Parray)[10] = &arr; // Parray points to an array of ten ints 

がありますか?私はそれで何ができますか?

Parrayのタイプは、それが唯一のタイプint [10]のオブジェクトへのポインタに割り当てることができることを意味、int (*)[10]あります。

これは、10要素からなる配列(&arrで取得)の先頭を指すポインタです。

そして、あなたはへのインデックスができParrayを通じてarrの要素にアクセスする方法最初のポインタParray逆参照arrを得るためにする必要になります。したがって

(*Parray)[5] = 546; 

やっては第5回を割り当て要素を546に変換し、以下の式が行う結果となる。

arr[5] = 546; 

上記のように、here

1

特定の要素を持つ配列へのポインタです。 あなたは単にポインタを使うことができると書いていますint *p = a;正しいですが、このポインタは特定の配列だけでなく、技術的には、ポインタpは配列内の最初の要素の最初のアドレスを指します。 int(*Parray2)[10]静的配列の署名がT(&)[N]であるため、10個の要素を持つ配列のみを指すポインタ。あなたはポインタで仕事をしたい場合は

template < size_t N, typename T > size_t GetSize(T(&)[N]) 
{ 
    return N; 
} 
... 
int arr[10] = { 1,1,1,1,1,1,1,1,1,1 }; 
auto sz = GetSize(arr); 

あなたはさまざまな方法でそれを使用することができますが、int型(* Parray2)[:配列の署名を使用して あなたは、例えば、静的配列のサイズを返すことができる方法のために書くことができますあなたはアドレス差を見たい場合は、PArrayのアドレス、および配列のアドレスを取得することができます

int arr[10] = { 1,1,1,1,1,1,1,1,1,1 }; 
int arr2[11] = { 1,1,1,1,1,1,1,1,1,1,1 }; 

int *bare_ptr1 = arr; // legal 
int *bare_ptr2 = new int(); // legal 
int *bare_ptr3 = arr2; // legal 

int(*Parray)[10] = &arr; // legal 
int(*Parray2)[10] = new int(); // compile error 
int(*Parray3)[10] = arr2; // compile error 

cout << bare_ptr1 << endl; 
cout << &arr[0] << endl; 
cout << *(Parray + 0) << endl; 
cout << Parray[0] << endl; 

:10] 10個の要素を持つ配列にのみ指すことができます。これらのアドレスは異なる必要があります。

cout << &Parray << endl; // address of the pointer which points to the array 
cout << &arr << endl; // addres of the first element in the array