Program to see memory allocation
#include<stdio.h>
main()
{
char *p;
printf("the address of p is = %u\n",p);
}
What is the difference
#include<stdio.h>
main()
{
char *p;
printf("the address of p is = %u\n",&p);
}
Program to see memory allocation
#include<stdio.h>
main()
{
char *p;
printf("the address of p is = %u\n",p);
}
What is the difference
#include<stdio.h>
main()
{
char *p;
printf("the address of p is = %u\n",&p);
}
最初のプログラムは、初期化されていない自動変数 (p) を使用し、引数に一致しない printf 書式指定子 (unsigned int とオブジェクトへのポインター) を使用する未定義の動作により、ガベージを出力します。2 番目のものは、p のアドレスを出力します (ただし、技術的には未定義の動作も呼び出します)。
最初のプログラムは、符号なし整数として解釈された初期化されていないポインター p の値を出力します。ポインターは初期化されていないため、出力される値は、たまたまその場所にある値です。2 番目のプログラムは、符号なし整数として解釈されたポインター p のアドレスを出力します。技術的には合法ではありませんが、sizeof(char *) == sizeof(unsigned int) であるほとんどのシステムで動作します。変数「p」は自動変数であるため、ランタイムが C スタックに割り当てるアドレス範囲の値を取得します。
編集:コメントから明確にする。Printf は、制御文字列に従って、パラメーターで渡されたデータをフォーマットします。%u は、符号なし整数を出力することを意味します。だから、あなたが通過するときp
、C はポインター変数の値を printf に渡します。渡されるバイト数は、そのプラットフォームの sizeof(pointer) によって異なります。通常、printf は、制御文字列の後にパラメーターとして渡されたデータの型が制御文字列内のすべての % ディレクティブと一致する場合にのみ「機能」します。しかし、sizeof(onetype) == sizeof(another-type) の場合、私が書いたことは正しいです: printf は、特定のパラメーター位置のビットを、制御文字列の対応する場所で指定された型であると解釈します。sizeof(pointer) == sizeof(unsigned int) の場合、得られるのは unsigned int として出力されたポインターの値です。
あるメモリアドレスにポインタ変数が割り当てられ、変数が別のメモリアドレスを指しています。
+---+ +-------------------+
| p | -------------> | variable |
+---+ +-------------------+
Address: 0xBBBBBBBB Address: 0xAAAAAAAA
次のようなコードを作成できます。
int a = 5;
int* p = &a; // p, located at 0xBBBBBBBB will point to a, located at 0xAAAAAAAA
変数のアドレスを出力すると、0x(stuff) だけが返されます。
& < 変数> = 変数が配置されているアドレス。それが変数であるかポインター (それ自体が変数である) であるかに関係なく