2

I have a program below ...I have a turbo c compiler so int is 2 bytes..

#include<stdio.h>
main()
{
    int a[3][2]={
                 {1,3},
                 {2,0},
                 {3,4}
                };
    printf("%d",(a+1));   //increments 2 bytes
        printf("%d",(&a[0]+1)); // increments 4 bytes
        printf("%d",(a[2]));
    return 0;
 }

What is the difference between a+1 and &a[0]+1 ?

4

3 に答える 3

2

They are equivalent expresssions.

a + 1 and &a[0] + 1 values are the same and they are both of type int (*)[2].

Note that you are not correctly printing the pointer values: use p conversion specifier and cast the argument to (void *) to print the value of a pointer:

printf("%p\n", (void *) (a + 1)); 
printf("%p\n", (void *) (&a[0] + 1)); 
printf("%p\n", (void *) (a[2]));
于 2012-08-03T09:45:18.313 に答える
1

コンパイラにバグがあるようです。a配列に名前を付ける場合、[ほとんどの] 式a&a[0]同じ型と値を持つ必要があるため+1、両方のケースで結果が同じになるはずです。

a+1&a[0]+1はどちらも と同等である必要があります&a[1]

これをテストするときに厳密に正しくするには%p、ポインター値を表示するためのフォーマット指定子として使用する必要があります。

于 2012-08-03T09:50:16.750 に答える
0

a配列int a[3][2]に名前を付けるので、タイプはint [3][2]。です。式a + 1では、最初の要素へのポインタに減衰します。したがって、タイプはですint (*)[2]

&a[0]では、はa再び型のポインタに減衰し、型も同様int (*)[2]に減衰します。address-of演算子は、ポインターの減衰を引き起こさないという特殊なケースであるため、型があり、減衰と同じ型と値を持ちます。a[0]int [2]&a[0]int (*)[2]a

a[0]推測では、コンパイラがで誤って減衰し&a[0]ているので&a[0]、型が指定されていると推測されますint **。プラットフォーム上のデータポインタのサイズが4バイトの場合、それが観察された結果を説明します。

于 2012-08-03T10:20:45.203 に答える