6

このコードは 29 を出力すると誰かが私に言いました。それはなぜですか?

int *a = 17; 
printf("%d", a+3);
4

5 に答える 5

36

ポインターに追加すると、オブジェクトのサイズが追加されるためです。この場合、オブジェクトのサイズは 4 (sizeof(int) == 4) です。つまり、17 + 3 * 4 == 29 です。

于 2009-12-15T20:51:59.517 に答える
13

少なくとも 6809 では、答えが 23 であることは誰もが知っています。

a+3 == a + (3 * sizeof(int)) == a + 6 == 17 + 6 == 23
于 2009-12-15T20:57:32.750 に答える
11
a+3 == a + (3 * sizeof(int)) == a + 12 == 17 + 12 == 29
于 2009-12-15T20:52:09.220 に答える
2

C言語では、整数ゼロに評価される積分定数式を除いて、ポインターを整数値で初期化することはできません。17その要件を満たしていません。

コードが無効です。何も「印刷」しません。その質問はまったく意味がありません。ポインタ演算の観点からこの質問を分析しようとする試みはばかげており、時間の無駄です。


ISO / IEC 9899:1999(プログラミング言語-C)

6.5.16.1簡単な割り当て

制約

次のいずれかが成立します:93)

—左側のオペランドには修飾または非修飾の算術型があり、右側には算術型があります。

—左側のオペランドには、右側の型と互換性のある構造体または共用体型の修飾バージョンまたは非修飾バージョンがあります。

—両方のオペランドは、互換性のある型の修飾バージョンまたは非修飾バージョンへのポインターであり、左側が指す型には、右側が指す型のすべての修飾子があります。

— 1つのオペランドはオブジェクトまたは不完全な型へのポインターであり、もう1つはvoidの修飾または非修飾バージョンへのポインターであり、左側が指す型には、右側が指す型のすべての修飾子があります。

—左側のオペランドはポインターであり、右側はnullポインター定数です。また

—左側のオペランドの型は_Boolで、右側はポインターです。

93)型修飾子に関するこれらの制約の非対称的な外観は、左辺値を「式の値」に変更する変換(6.3.2.1で指定)によるものです。これにより、式の型カテゴリーから型修飾子が削除されます。 。

于 2009-12-15T23:25:30.357 に答える
-2

何でも印刷できます..メモリ内の場所「17」へのポインタを設定しています...

于 2009-12-15T20:54:03.337 に答える