C言語:ポインタの概念の図解

C言語を学ぶ上でポインタは重要概念で、この概念を理解していないと実務で通用するプログラミングはできません。
にもかかわらず、C言語の主要なつまずきポイントにもなってしまっており、未経験者のみならず他言語を学んできた方にとっても難しい概念です。
ポインタの難しさはイメージのしにくさにあり、イメージするにはコンピュータ内部の仕組みを理解する必要があります。
今回の記事では、ポインタのイメージをなるべく簡単に書きたいと思います。

【変数の領域の確保】

コンピュータにはメモリ領域が存在し、メモリ領域の中に様々なデータがセットされています。
メモリ領域は区分けされており、それぞれの区分けごとにアドレスが割り振られています。

プログラムで変数を宣言すると、そのメモリ領域の一部がその変数用に確保され、他の用途で使用されないようにします。
変数に値をセットすると、その変数用のメモリ領域が変更されます。

以上のことを図にすると以下のようになります。

なお、この挙動はC言語に限った話ではなく、他言語にも言えることです。

【アドレスの参照と値の参照】

ここからがC言語ならではの話になります。

他の言語では変数のメモリ領域が指す値のみを使用するのですが、C言語では変数のメモリ領域の(先頭)アドレスを使用することがあります。
通常の変数でも、「&」演算子をつけて参照することでアドレスを取得することができます。

そして、C言語では普通の変数の他にポインタ変数というものがあり、変数の宣言時に「*」演算子をつけることでポインタ変数になります。
ポインタ変数はアドレスを扱う用の変数であり、演算子をつけずに普通に参照するとアドレスを取得できます。
また、「*」演算子を付けて参照することで、その変数のメモリ領域が指す値を取得することができます。

以上のことを図にすると以下のようになります。

【コーディング例】

・test.c

 ※HTMLエスケープ回避のため、特殊文字を全角文字にしています。ご了承ください。

・実行結果

【ポインタは何のために使うのか】

ポインタを使う理由は主に以下の2つです。

・関数で参照渡しをするために使う

 簡単に書くと、引数でポインタ変数を指定し、呼び出し先の関数でそのポインタ変数に値を代入すると、呼び出し元でもその代入された値を使用可能になります。
 C言語の関数は、多くの場合「ビジネスロジックで使用するアウトプットは参照渡しされた変数に代入し、returnではリターンコード(例:0なら正常、1以上ならエラー)を返す」という形になっています。

・インクリメント/デクリメントで次の/前の変数の値を取得するために使う

 文字列や配列の処理で使用します。

java:javaからのOSコマンド呼び出しと注意点

javaのプログラムからOSのコマンドを実行したい場合は、Runtimeクラスのexecメソッドで実現できます。
 
しかし、OSのコマンドは別プロセスで立ち上がるので注意が必要です。
ProcessクラスのwaitForメソッドでプロセスの終了を待たないと、処理が前後してしまい意図しない挙動となることがあります。
また、destroyメソッドでプロセスを明確に終了させ、資源を回収することも重要です。
 
以下は、プロセスの終了を待たないと意図しない挙動となることを確認するためのテストコードです。
javaのプログラムでは、OSのコマンドを使用して、3秒のスリープ後に hoge.txt を aフォルダ から bフォルダ へ移動させています。
waitForメソッドを使用しなかった場合、javaのプログラムが終了した時点で hoge.txt の bフォルダ への移動が完了していない(javaのプログラムが立ちあげたプロセスが終了していない)ことを確認できます。
逆に、waitForメソッドを使用した場合は、javaのプログラムが終了した時点で hoge.txt の bフォルダ への移動が完了している(javaのプログラムが立ちあげたプロセスが終了している)ことを確認できます。
 

【テストコード】

・RuntimeTest.java

【実行用バッチ】

・RuntimeTest.bat

【「p.waitFor();」と「p.destroy();」をコメントアウトした場合の実行結果】

【「p.waitFor();」と「p.destroy();」を有効にした場合の実行結果】

java:色々なfor文の書き方

新人にfor文を教えるために書いたコードです。
5通りの書き方をしており、全て同じ挙動を示します。
これらの書き方を使い分けることで、様々なループ条件を記述できます。

【サンプルコード】

【実行結果】

java:thisで指定されたメンバ変数が自クラスにない場合、スーパークラスを参照しにいくことの確認

実務を行う中で気になることがあったので、調査しました。
javaでは「thisで指定されたメンバ変数が自クラスにない場合、スーパークラスを参照しにいく」という挙動になると聞いたので試してみたのですが、確かにそうなりました。
試した結果は以下です。

【テストコード】

・Main.java

・ThisClass.java

・SpecializeClass.java

【実行結果】

Windowsへのopensource COBOL環境の構築手順

COBOLの概論のパワポを発表した後、WindowsでCOBOLの練習を行えるように、開発環境の構築手順を作成しました。
opensource COBOL を使用して環境を構築する手順です。

半日~1日を見た方が良い複雑な手順ですが、メインフレームや有償のパッケージソフトを使用せずともCOBOLを動かせるようになるというメリットがあります。

手順はこちらになります。