web-dev-qa-db-ja.com

Cの値のアドレスまたはポインターを出力します

かなりシンプルに思える何かをしたい。結果は出ますが、問題は、結果が正しいかどうかを知る方法がないことです。

私はCで作業していますが、2つのポインターがあります。ポインターの内容を印刷したい。ポインタを逆参照して値を指すようにするのではなく、ポインタに格納されているアドレスが必要です。

次のコードを作成しましたが、正しいかどうかを確認する必要があります。正しくない場合は、どうすれば修正できますか。

/* item one is a parameter and it comes in as: const void* item1   */
const Emp* emp1 = (const Emp*) item1; 

printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 );

これを投稿している間(そしてそれが正しいことが重要である理由)、ポインターへのポインターのために最終的にこれを行う必要があるということです。あれは:

const Emp** emp1 = (const Emp**) item1; 
77
Frank V

あなたが持っているものは正しいです。もちろん、emp1とitem1のポインター値は同じであることがわかります。

29
Don Neufeld

ポインターへのポインターでアドレスを印刷するには:

printf("%p",emp1)

一度逆参照して2番目のアドレスを出力するには:

printf("%p",*emp1)

常にデバッガで確認できます。Linuxでdddを使用してメモリを表示する場合、または単にgdbを使用する場合は、メモリアドレスが表示されるので、ポインタの値と比較できます。

38
stefanB

これが最も正しいと思います。

printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);

printf()は可変個の関数であり、正しい型の引数を渡す必要があります。標準では、%pvoid *を取ります。

14
sigjuice

既に基本的なポインターアドレスの表示を解決しているように見えるので、ダブルポインターのアドレスを確認する方法は次のとおりです。

char **a;
char *b;
char c = 'H';

b = &c;
a = &b;

以下を実行することで、ダブルポインターaのアドレスにアクセスできます。

printf("a points at this memory location: %p", a);
printf("which points at this other memory location: %p", *a);
9
Luca Matteis
char c = 'A';
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c);

結果:

ptr:0xbfb4027f、値:A、およびアドレス:3216245375

4
4pie0

特に新しいハードウェアに関しては、私はこの立場にありました。独自の小さな16進ダンプルーチンを作成することをお勧めします。データとそれらのアドレスをすべて表示することができます。それは良い習慣であり、信頼の構築者です。

0
gbarry