2016-12-24 5 views
2
#include<stdio.h> 

int main(void) 
{ 
    int arr[5]={1,2,3,4,5}; 
    int (*ptr)[5]=&arr; 

    printf("ptr=%p\n",ptr); i am not getting the diff btw both statements 
    printf("*ptr=%p\n",*ptr); 

    return 0; 
} 

output:- 
ptr=0xbf8f8178 
*ptr=0xbf8f8178 

へのポインタのように私は、同じアドレスを取得しています配列へのポインタを逆参照しながら、両方の間のdiffは何ですステートメント私たちは配列名と配列名は、ベースアドレスを示し得る配列へのポインタを参照解除知っ配列

+0

[このブログの投稿](https://ghost.pileborg.se/2016/08/28/the-difference-between-arrays-decaying-to-pointers-and-pointers-to-arrays/ )うまくいけば少し物事をクリアする必要があります。ポインタにポインタ演算を使用すると、2つのポインタ間の差異が非常に目立つようになります。 –

+0

答えを得ました、ありがとう – sam1006

+0

どちらも未定義の動作です、 '%p'は' void * 'を必要とします –

答えて

0

のprintfの最初のポインタは、printf関数に第2のポインタは、最初のポインタ

が指し示す最初の要素を指しているが、2つのポインタの種類が異なる

ポインタへのポインタである

enter image description here

この画像を見る

出典:https://www.eskimo.com/~scs/cclass/int/sx9b.html

0

2つのポインターは同じアドレスを持ちますが、タイプが異なります。

ptrは、5つの整数の配列へのポインタです。

*ptrは5 intの配列です。しかし、「Tの配列」の式がsizeofまたは&以外のコンテキストで使用されると、自動的に配列の最初の要素を指す「Tへのポインタ」型の式に変換されます。この場合、intへのポインタになります。

明らかに、配列は最初の要素と同じアドレスから開始します。