Cのポインターが分かりにくい理由

 

N88-BASICでもポインターと同じように

アドレスを扱うことができ、アセンブラも

当然アドレスを使用しますが、

Cのポインターの分かりにくさの原因を

解説します。(個人的意見です。)

 

#include <stdio.h>

void main(void)

{

int  a;  /* 整数型変数 a */

int* p;  /* (整数型変数のアドレス)を入れる変数 p */

 

a = 5;

p = &a;  /* aのアドレス(&a)をpに代入 */

    printf("%d\n, *p);  /* アドレスpの中身5が表示される */

}

 

pはアドレス(場所を表す数、番地)を入れる変数

*pはpに入っているアドレス(上記&a)の中身(上記aの内容)です。

 

アドレス 内容(1アドレスに1バイト入ります)16進表記です。

00000100 05 ← a(下位バイトから入ってますa = 00 00 00 05)

00000101 00                    int型を4バイト(32ビット)

00000102 00                    として説明しています

00000103 00

 

aは00000005

&aはaのアドレス00000100なので、

p = &aでpは00000100になります。

*pはアドレス00000100の中身00000005

になります。

 

Cでポインターpやqの宣言は、通常

int *p, *q;

と書きます。

*pや*qがint型であるという宣言です。

整数型ポインターpの中身*pは確かにint型

なので分からなくもないのですが、

アドレスを格納する変数であるポインター

の宣言に、アドレスの中身である*pが

出てくる所が混乱する原因だと思います。

 

なので、

int*を整数型ポインターの宣言だと思えば

分かりやすいかと思います。

int* p;

は、整数型ポインター pを作ると解釈します。

 

コンパイラーは空白を無視するので、

int *p; も int* p;もint*p;と同じです。

 

ただし、

int *p, *q; はpとqがポインターになりますが

int* p, q; は、int *p, q; と同じなので、

pはポインターでqは整数型になります。

 

よって、

int* p;

int* q;

というように、1行ずつ書きます。

こうすれば、ポインターの宣言に*pなどの

ポインターの中身が出て来ないので

分かりやすいかと思います。

int*が整数型へのポインター変数の宣言文

と思い込みましょう。

 

個人的に int  *p; は分かりにくいと思ったので、

int*  p; と書くようにしています。

 

VL-BASICのPLAY(MML)を.mid(SMF)に変換サンプル

 

以前紹介しましたMML→.mid変換をするBASICプログラムを

サンプルとして追加しmid~.zipを公開しました。

 

VL-BASICにCHILD命令を追加しました

CHILDはBASICからコンソール(DOS)アプリを

呼び出す命令です。

また、MPU TRONに待ち時間(ディレイタイム)

に関する不具合がありましたので修正しました。

 

mid~.zip(tron2txt.exe、txt2mid.exe、

tron.bas)と、VL-BASICは、

以下からダウンロードして下さい。

VL-BASIC(N88-BASIC互換?)ホームページへのリンク

ホームページに書いてあるパスワードを入力して、

Readme.txtを読んで、遊んで見て下さい。

すべて、windows用です。

 

tron.basのLISTです。

 

100 '----------------------------------------------------------------------
110 ' Jupiter of the planets by G.Holst の一部演奏
120 '
130 ' for VL-BASIC(MML→.mid) by ULproject
140 '----------------------------------------------------------------------
150 CMD MPU ON
160 MPU TRON ("a")
170 GOSUB *PLAY
180 MPU TROFF
190 CHILD "tron2txt a.txt"
200 CHILD "txt2mid a_txt.txt"
210 MPU MCI "open a_txt_txt.mid alias FILE"
220 MPU MCI "set FILE time format ms"
230 MPU MCI "play FILE"
240 MPU MCI "status FILE length", B$
250 K = VAL(B$)
260 WHILE I < K AND INKEY$ = ""
270   MPU MCI "status FILE position", B$
280   I = VAL(B$)
290 WEND
300 MPU MCI "close ALL"
310 MPU OFF
320 END
330 '--- play
340 *PLAY
350 PLAY "@127", "@127", "@127"
360 PLAY "v 10", "v 10", "v 10", "v 10"
370 PLAY "t100", "t100", "t100", "t100"
380 PLAY "l8q7o4", "l8q7o4", "l8q7o4", "l8q7o4"
390 A$ = "<g&b-&"
400 PLAY A$             '--- 1
410 A$ = "> c 4 c&e-&d .&<b-16&"
420 B$ = "< a-4&r4   a-.& r 16 "
430 C$ = "< e-4 r4   f4"
440 D$ = "<<a-4 r4   f4"
450 PLAY A$, B$, C$, D$ '--- 2
460 A$ = "> e-&f&e-4d 4&"
470 B$ = "  b-&r r 4r 4 "
480 C$ = "  e-4  r 4e-4 "
490 D$ = "  g 4  r 4g 4 "
500 PLAY A$, B$, C$, D$ '--- 3
510 A$ = "  c &d&c4<b-4&"
520 B$ = "  a-&r r4 f 4&"
530 C$ = "  e-4  r4 d 4 "
540 D$ = "  a-4  r4 b-4 "
550 PLAY A$, B$, C$, D$ '--- 4
560 A$ = "  g 2 g&b-&"
570 B$ = "  e-2 d&r  "
580 C$ = "> c 2<b-4  "
590 PLAY A$, B$, C$     '--- 5
600 A$ = "> c 4 c8&e-&d .&<b-16&"
610 B$ = "  a-4&r4    a-.& r 16 "
620 C$ = "  e-4 r4    f4"
630 D$ = "  a-4 r4    f4"
640 PLAY A$, B$, C$, D$ '--- 6
650 A$ = "> e-&f&g4g 4&"
660 B$ = "  b-&r r4e-4&"
670 C$ = "  e-4  r4b-4 "
680 D$ = "  g 4  r4e-g "
690 PLAY A$, B$, C$, D$ '--- 7
700 A$ = "  g&f&e-4&f 4&"
710 B$ = "  c 2     c 4 "
720 C$ = "  a-2     a-4 "
730 D$ = "  a-2     a-4 "
740 PLAY A$, B$, C$, D$ '--- 8
750 A$ = "  e-4&>b-4r4"
760 B$ = "  r 4  g 4r4"
770 C$ = "  r 4  e-4r4"
780 D$ = "  r 4  e-4r4"
790 PLAY A$, B$, C$, D$ '--- 9
800 RETURN