0

int aとの違いを理解しようとしていますint *a。最初のステップは、 の printi で得られる値を確認することでし%pint a。もちろん、コンパイラは警告を表示しますが、次のコードのジョブを完了します。

#include <stdio.h>

int main() {
    int a;
    printf("a - declared");
    printf("int a = [%d]\n", a);            // example - 1745899614
    printf("int a pointer = [%p]\n", a);    // example - 0x6810505e

    a = 10;
    printf("a - initialized to value of 10\n");
    printf("int a = [%d]\n", a);            // exmaple - 10
    printf("int a pointer = [%p]\n", a);    // example - 0xa

    return 0;
}

そして、ソース コードで述べたように、 の の値を 16 進数で表すと、ある程度満足のいく結果が0xa10られ%pますint a。しかし、実際にintそのアドレスを指している場合ですか、それともコンパイラがそのような場合に意味を理解しようとしているだけ%pですか?

intsに割り当てられたメモリはどこですか? それをテストするにはどうすればよいですか?

4

4 に答える 4

2

フォーマッター( printf 内)は、指示されたとおりにメモリを解釈しているだけだと思います。ええ、「%p」はポインター用ですが、int を指定しました。あなたはそれに次のアドレスを与えたいと思っていました:

printf( "%p", &a );

シャバン全体:

int  a = 10;
int *b = &a;

printf("value of    a: %d\n", a  );
printf("location of a: %p\n", &a );
printf("value of    b: %p\n", b  );
printf("location of b: %p\n", &b );
printf("dereference b: %d\n", *b );
于 2013-11-13T17:21:20.783 に答える
1

しかし、実際には int がそのアドレスを指しているのですか、それともコンパイラがそのような場合に %p を理解しようとしているだけですか?

後者です。コンパイラは整数をポインタとして解釈しようとします。usingのを出力すると、コンパイラは の型がisであることを検出し、ポインタではないことを警告します。a%paint

使用アドレスを印刷するにaは:

printf("int a pointer = [%p]\n", (void*)&a);   

aがポインター (例: ) の場合int *a;、有効なアドレスで初期化する必要があり、次のように出力できます。

printf("int a pointer = [%p]\n", (void*)a); 
于 2013-11-13T17:19:53.367 に答える
1

%pprintfアドレスメモリとして値を出力するように指示する方法にすぎません。10の値( の値)を渡すと、aこの値が 16 進表記で出力されます0xa。特別な解釈はありません。これは単なるフォーマット オプションです。

aのアドレス メモリの値を出力したい場合は、簡単に実行できますprintf("%p", &a);&aのアドレスですa

または、ポインタを使用する場合:

int* p;
p = &a;
printf("%p", p); //Prints the p value, that is the a address. Equivalent to printf("%p", &a).
于 2013-11-13T17:19:58.907 に答える