2017-10-03 7 views
-2
int main() 
{ 
    int arr[5] = { 1, 2, 3, 5, 7 }; 
    int *ptr = (&arr + 1); 
    printf("%d", *(ptr - 1)); 
} 

arrアレイ(a[0]即ち、アドレス)のベースアドレスが含まれているので、&arr + 1*sizeof(int)a[4]ptr - 1のアドレスであろうa[3]のアドレスされるように出力が5なければなりません出力は7です。名ベースアドレスを指していない

+0

あなたは何を期待したのですか? –

+2

'&arr'は5要素配列のアドレスであり、' int * 'ではありません。また、 'ptr'とは何ですか? – Groo

+6

私は残念ですが、あなたはポインタ 'p'を持っていて、宣言されていない' ptr'の値を表示します。 – Rafalon

答えて

5

ができます

 
+---+---+---+---+---+ 
| 1 | 2 | 3 | 5 | 7 | 
+---+---+---+---+---+ 
^ ^
| | 
| &arr[1] 
| 
&arr[0] 
| 
&arr 

は次に任意の配列やポインタのためにそれを覚えている:いくつかのポインタを追加して、あなたの配列でやや「グラフィカル」を見てくださいとインデックスiの式p[i]は `*(p + i)と等しくなります。

上記の情報で、&arr(これは&arr + 0に等しい)は(&arr)[0]と同じでなければならないことがわかります。そして、&arr + 1はと等しく、を指し、の配列arrを超えている必要があります。

我々は再び「グラフィックス」を使用して、あなたのプログラムを持っているポインタを表示した場合:

 
+---+---+---+---+---+ 
| 1 | 2 | 3 | 5 | 7 | 
+---+---+---+---+---+ 
^    ^^
|    | | 
&arr   | &arr+1 
       | | 
       | p 
       | 
       p-1 

は、ここでは、p - 1(またはptr - 1は、あなたがあなたのMCVEで一貫していないです)理由は簡単だが指しています値7の要素に追加します。

もう1つ重要なポイント:&arr(および&arr + 1)のタイプはint (*)[5]です。これはint *であるp(または私はptrと仮定します)のタイプとは非常に異なります。これはまた、 &arr&arr[0](さらにはarr)の型が異なるため、最初の要素へのポインタを取得するには&arrが間違っています。 &arrとの両方は、同じ場所を指すが、異なるタイプのものであり、異なるセマンティクス(これは、例えば、&arr + 1およびp - 1の結果に容易に見られる)につながる。

+0

@AjayBrahmakshatriyaいいえ、彼らはありません。私の答えが更新されます。 –

+0

出力は5になりますか? – Charan2628

+0

@ Charan2628いいえ、私が言ったように、表現 'p - 1'は配列の最後の要素を指しています、要素は値' 7'を含んでいます。 –

0
int main() 
{ 
    int arr[5] = { 1, 2, 3, 4, 5 }; 
    int *p=(arr+1); 
    printf("%d",*(p-1)); 
} 

これはあなたに必要なものを与えます。

arrはあなたがそれの前に&を使用する場合は完全に異なる何かを得るでしょう...

はこれを試してみて、あなたはそれが動作参照してくださいよ、既にポインタです:

int main() 
{ 
    int arr[5] = { 1, 2, 3, 4, 5 }; 
    int *p=(arr+1); 
    printf("%d",*(p-1)); 
    printf("%d",*(p)); 
    printf("%d",*(p+1)); 
    printf("%d",*(p+2)); 
    printf("%d",*(p+3)); 
} 
+0

質問は '&arr + 1'で' arr + 1'ではない – Karthick

+0

@Karthickああ本当ですか?質問はあまりにも一貫していないので、私は確信していません – Rafalon

0

あなたはARRの値を取得するために探している場合は、[3] 5である、あなたは、main関数の2行目を修正する必要があります。

main() 
{ 
    int arr[5]={1,2,3,5,7}; 
    int *ptr = arr + 1*sizeof(int); 
    printf("%d",*(ptr-1)); 
} 
関連する問題