かなりシンプルに思える何かをしたい。結果は出ますが、問題は、結果が正しいかどうかを知る方法がないことです。
私は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;
あなたが持っているものは正しいです。もちろん、emp1とitem1のポインター値は同じであることがわかります。
ポインターへのポインターでアドレスを印刷するには:
printf("%p",emp1)
一度逆参照して2番目のアドレスを出力するには:
printf("%p",*emp1)
常にデバッガで確認できます。Linuxでddd
を使用してメモリを表示する場合、または単にgdb
を使用する場合は、メモリアドレスが表示されるので、ポインタの値と比較できます。
これが最も正しいと思います。
printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);
printf()
は可変個の関数であり、正しい型の引数を渡す必要があります。標準では、%p
はvoid *
を取ります。
既に基本的なポインターアドレスの表示を解決しているように見えるので、ダブルポインターのアドレスを確認する方法は次のとおりです。
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);
char c = 'A';
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c);
結果:
ptr:0xbfb4027f、値:A、およびアドレス:3216245375
特に新しいハードウェアに関しては、私はこの立場にありました。独自の小さな16進ダンプルーチンを作成することをお勧めします。データとそれらのアドレスをすべて表示することができます。それは良い習慣であり、信頼の構築者です。