2012-02-16 3 views
6

I、次のコードを持っている:"intの配列10へのポインタ"の使い方

#include<stdio.h> 

int main() 
{ 
    int(* a)[10]; //declare a as pointer to array 10 of int 
    int b[10]; // taken a array of 10 int 
    b[2]=32;  
    a=&b;  
    printf("b is on %p\n",&b); 
    printf("a is on %p\n",a); 
    printf("magic is %d\n",a[2]); // why this is not showing 32 
    return 0; 
} 

出力:私は配列bを指すINTのアレイ10にポインタとしてaをとっている。ここで

b is on 0xbfa966d4 
a is on 0xbfa966d4 
magic is -1079417052 

、今なぜa[2]に32の値を取得できませんか?

a[2]ので、今bので*(b+2)*(a+2)が類似している配列のアドレスは、なぜ私はここに値32を取得していない午前た*(a+2)として評価されますか?


編集:

a[2]*(a+2)で、a+2がAのとき が を参照してください...私は

(*a)[2] 

を使用して答えを得たが、私はそれがどのように動作するか取得しておりませんプラス2 * sizeof(int[10])バイト。

このように(*a)[2]はどのように展開しますか? aので

+0

(* a)[2]は[0]と同じです[2] – novice

答えて

6

aプラス2 * sizeof(int[10])バイト。

(通常int *p考える; p+1pプラスsizeof(int)バイトであり、(char *)(p + 1)(char *)p + 1異なる今int[10]intを置き換える)

+0

これは私が誤解したものです... !!ありがとう –

+0

(int *)a)[2] – Eregrith

+0

@Eregrith:これは厳密なエイリアシングルールに違反し、未定義の動作を引き起こすと思います。 –

7

は、あなたがそれが指すこと配列を参照するために、その間接参照を有する、既にポインタである:a[2]*(a+2)a+2で、ポインタ演算の規則によって

(*a)[2] 
+0

これは「一行置換」と呼ばれています:) –

-1

int型B [10] == int*の最初の値を指しアレイ

INT(* A)[10]配列

を指すポインタのアドレスを指す== int**これはあなた

+0

これは間違っています。 'b'は' int * 'ではなく、' a'は 'int **'ではなく、 'int * a [10]'は 'int(* a)[10]'とは異なります。 – interjay

+0

@interjayええ、私が最初に書いた方法は、私に10 int *の配列を生成します。しかし、 'b'は' int * 'です。 – Djole

+0

いいえ、' b'は 'int *'ではありませんが、一部の(すべてではない)コンテキストでは 'int *'に崩壊する可能性があります。しかし、 'a'は完全に異なった動作をするため' int ** 'に決して崩壊しません。また、ポインタのアドレスを指し示す 'a'に関するあなたの行は間違っています。 – interjay

1
#include<stdio.h> 

int main() 
{ 
    int(* a)[10]; //declare a as pointer to array 10 of int 
    int b[10]; // taken a arry of 10 int 
    b[2]=32;  
    a=&b;  
    printf("b is on %p\n",&b); 
    printf("a is on %p\n",a); 
    printf("magic is %p\n",a + 2); // Changed to show pointer arithmetic 
    return 0; 
} 

ために物事をクリアし

ホープこれは次のように出力されます

b is on 0xbfe67114 
a is on 0xbfe67114 
magic is 0xbfe67164 

あなたは何が起こっているのか見ていますか? magicマイナスaは、80と等しく、4 * 10 * 2となります。 これは、aが10個の整数の配列へのポインタなので、sizeof(*a) == 10 * sizeof(int)で、sizeof(a) == sizeof(int)ではなく、これはあなたが期待していたものです。 次回はポインタ演算の型に注意してください!

+0

うん、それは...感謝.. !!! –

0

ここにコメントを追加することができませんでした。評判が50であるためです。だからここに投稿された質問のために私の質問になります。 申し訳ありませんが、回答のボックスに質問を投稿してルールの一部に違反しています。 この質問は、ポインタ演算を実行する際には注意が必要であることを示しています。しかし、整数へのポインタを使うだけで同じことができるのであれば、配列へのポインタを使うのはどうですか?