アラサーからのプログラマー生活

アラサーの新米PGが必死に頑張る成長記録です。あとは旅行とか。

職業訓練28日目でした

こんばんは、堀井です。

職業訓練開始より1ヶ月半が経とうとしており、C言語の勉強も一旦終わります。

今日はそんなまとめの話です。

早速本題に移りましょう。

※7/11 22:30 に大幅な修正を入れました

 

前回の記事では

  • 関数の基本的な使い方
  • グローバル変数、ローカル変数(スコープ)
  • プロトタイプ宣言

をやりまして、その後1週間かけて

  • 文字列
  • ポインタ
  • ライブラリ関数
  • ファイルの入出力
  • 構造体
  • 列挙体

と駆け足で進んでいきました、と言うのも今までがゆっくりすぎたそうです。

やってて思いましたがポインタに一番時間を割いてほしかったくらい難しいですねこれ。

 

そして駆け足で終わらせた今日から4日間は総合演習と言うことで、五目並べゲームを作りだしました。

とは言うものの。

設計書通りにコーディングするだけなのであまり時間も掛からないと思います。

強いて苦労したのが二次元配列を別の関数で使う時ですね。

例えばこんなコード

#include <stdio.h>

void sub(int *hoge);

 

int main(void){

    int test[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};

    sub(&test[0][0]);
    return 0;
}

 

void sub(int *hoge){
    for (int i = 0; i < 8; i++){
        printf("%d\n", *hoge++);
    }
}

※:7/11 22:00 大部分が間違っていたので修正入れました

一次元配列なら「sub(test);」と書いても「sub(&test[0];)」と書いても一緒の意味だったし問題なく使えるんですけれど、二次元配列だとそれが出来ないんですよね

できるとすれば「sub(&test[0][0]);」と先頭アドレスを渡すことだけ。

ただ渡した先で「*hoge[1][3] = 5;」のようなアドレス操作は出来ませんでした。調べてみた感じではアドレスを二次元配列で表記する術がないと言った感じでした。

図で表すとこんな扱いになるようです。

f:id:hollage0214:20180711003901g:plain

もしtest[1][1]の値を取得したいのであれば「*(hoge + 5)」となりますね。

この場合であれば例えば「int a, b;」として、「sub(a, b);」とアドレス渡しをして「hoge[A][B]」にした方が分かりやすかったりするのでしょうかね。

もし考え方など間違っていましたら教えていただけると幸いです。

※2018/7/11 22:30追記 アドレスを渡した先でも二次元配列で書ける方法が分かりましたので、記事にしました。

 


 

まあひとまずは解決しましたので、明日以降の作業でも比較的順調に書けるかなと思います。

それではまた次回。