こんにちは。
まず、ポインタ変数のバイト数は、単純にsizeof演算子で計算できます。
32bitビルドなら4、64bitビルドなら8が出力されます。
C
1char *pointer;
2printf("%d\n", sizeof(pointer));
(pointerを初期化していませんが、ポインタ変数のサイズを計算しているだけなので、pointerの内容をアクセスしてないですから、問題なく動作します。)
次に配列のサイズもsizeof演算子で計算できます。
下記では10と表示される筈です。
C
1char array[10];
2printf("%d\n", sizeof(array));
さて、問題は下記ですね?
C
1char *pointer="123456789";
2printf("%d\n", sizeof(*pointer));
期待値としては、pointerが指す領域サイズの10を表示して欲しいということかと思います。
実際には*pointerはchar型ですからsizeof(char)と同じなので1と表示されます。
sizeof演算子はコンパイラがソース・コードを見て計算してます。
どのような順序で実行されたかに関わらず、ソースだけから分かる情報でのみ計算できます。
C
1char *pointer;
2int foo;
3scanf("%d", &foo);
4if (foo == 0)
5 pointer="";
6else
7 pointer="abc";
8printf("%d\n", sizeof(*pointer));
このようなプログラムの場合、コンパイラはpointerに""が設定されているのか、"abc"が設定されているのか知ることができません。
従って、ポインタの先の配列サイズをsizeof演算子で計算することはできないため、sizeof演算子は上記のような仕様となってます。
どうしても必要な場合は、別途配列の要素数変数を用意しておくしかありません。
例えば、下記のような構造体を定義し、pointerへアドレス設定する際に、そのアドレスに格納されている配列の要素数をCountへ設定します。
C
1struct Array
2{
3 int Count;
4 char* pointer;
5};
C++言語なら直感的に使えるArrayクラスを定義することができます。