2

これが私のコードです:-

void display(int *p)
{ 
 printf ("%u\n", p);
 printf ("%u\n", p+1);
}

int main()
{
  int a[3][4] = {
                  1,2,3,4,
                  5,6,7,8,
                  9,0,1,2
                };
  printf("%u\n",a);
  printf("%u\n",a+1);
  display(a);


}

a+1 と p+1 が異なるアドレスを与えるのはなぜですか? a と p が同じアドレスを与える場合、a+1 と p+1 は同じアドレスを指すべきではありませんか?

4

3 に答える 3

3

を期待する関数にawhich の型を渡すときに、コンパイラはエラー (または少なくとも警告) をスローする必要があります。すべてのコンパイラ警告をオンにすると、これが表示されます。int (*)[4]int *

私のコンパイラは明確に述べています:

警告: 互換性のないポインター型から 'display' の引数 1 を渡しています

アドバイス: コンパイラがあなたのコードについて不平を言うとき、あなたはそれに耳を傾けるのがよいでしょう。すべてのコンパイラ フラグ (-Wall -pedanticなど) を使用することを学びます。これにより、ほとんどの悪いコーディングの習慣が根付く前にキャッチされます。またはある日、彼らはあなたを噛むでしょう。

于 2013-10-15T23:03:25.620 に答える
1

サイズが違うので、次のサイズに移動すると追加される量が異なります。intポインターとポインターを使用した場合も同じことが起こりますchar。サイズが異なるため、同じアドレスに1を追加すると、異なるアドレスが得られます。

于 2013-10-15T23:02:20.037 に答える
0

コードをコンパイルするには、最後のステートメントを に変更する必要がありますdisplay(&a[0][0])。理由は、配列減衰が繰り返し適用されないため、 にint[3][4]なりint(*)[4]ます。コードをコンパイル可能にすると、質問した問題が表示されます。1 ずつインクリメントすると、ポインターap.

a両方の実際の値はp、配列の同じベースアドレス/最初の値の場所 (X と呼びます) になりますが、両方のポインターが異なる型であることに注意してください。pは 型ですが、 は 2 次元配列へのポインターの型になります (配列の減衰は最初の次元にのみ適用されるためです。疑似コードでint*int (*) [4]

p + 1 = X + sizeof(int)

a + 1 = X + sizeof(int (*) [4]) = X + (sizeof(int) * 4)

ここで、4 は配列の 2 番目の次元です。したがって、sizeof(int)が 4 のマシンでは、X + 4forpX + 16forが表示されaます。私のマシンでは、p + 1= 0x22fe34、a + 1= 0x22fe40 です。

于 2013-10-16T00:07:24.457 に答える