こんにちは、ダックです。
研修中に講師に 「 配列とポインタは同じようなものだからね 」 といわれました。
いったいどういうことでしょうか??
そこで、今回は文字列を出力するプログラムを配列とポインタを使って作ってみたいと思います。
同じようなもの、ですが違いもあります。
では始めましょう。
配列を使ったプログラム
はじめに、配列を使って文字列を出力するプログラムを作ってみました。
test1 では、8 文字分の配列を char str[8]; で用意し、strcpy を使い文字列を入力して出力します。
実行してみましょう。
正しく出力されました。
配列の正体
何気なく使っていましたが、この配列の正体を少し見てみましょう。
このプログラム中では図 3. のように、str[0]~[7] に 「 altima 」 という文字を入力しました。
最後の “¥0” は null です。
null についてはこちらを見てください。
test1 の strcpy や printf で使用しているように単に str とだけ書いた場合は配列の先頭を示すポインタとして振る舞います。
printf や strcpy では str はすでにポインタとして使われていたのです。ならポインタを使って書き換えるのも簡単そうですね。
ポインタは中身がない?
とりあえず、配列だったものをそのままポインタに書き換えてみました。
しかし、コンパイルしてみると、警告が表示されました。
初期化されていませんとなりました。
どうしてでしょう?
初期化が大切なことは以前の記事でも紹介しました。
配列では char str[8]; と記述した時点で、8文字分のメモリ領域を確保しています。
そのため、開始のアドレスも宣言した時点で分かっています。
しかし、ポインタの場合 char *p と記述しただけでは、メモリ領域を確保していません。
つまり、文字列のデータを入力したくても、どこに入力するかわからない状態です。
これでは、意図しない場所のメモリを書き換えてしまうなどの、重大なエラーにつながりかねません。
malloc
そこで malloc という関数を使います。この関数は指定した数のメモリ領域を確保して、そのアドレスを返す関数です。
例を挙げてみます
char *p;
p = malloc ( 8 ) ;
これで図 7 のように 8 文字分のメモリを確保し、その先頭アドレスが p になります。
では、malloc を使って test2 のコードを書き換えてみましょう。
これで、ポインタだけを使って文字列を出力することができました。
malloc はポインタを使うのに非常に便利な関数なのですね。
ダックのC言語 関連記事
組み込みシステムには欠かせないC言語その基礎を分かりやすく解説!
初期値問題 ver.C言語
初期値忘れがトラブルの原因に!?
実は同一人物!?配列とポインタ
配列とポインタ、似ているようで違うこの二つを使い分ける!
malloc~未知への挑戦~
C言語の特徴ともいえる、メモリの使い方について解説!
人には読めない?バイナリファイルの謎
文字として読めないそのファイルの中身には何がある!?