天国にいけるC言語入門 ヘキサ構造体 ver1.1661

作者 @solarplexuss

1話目から読む

新規登録でもっと便利に!

ユーザー投稿作品やKADOKAWAの人気作品をもっと便利に読めます。

閲覧履歴

どこまで読んだか忘れても大丈夫。自動的に記憶してくれます。

更新情報

「フォロー」した作家・作品の更新情報がメールで届きます。

マイページ

好きな作品を管理できる、あなた専用の本棚ができます。

必要なもの

ユーザー登録(無料)に必要なのは、メールアドレスだけ! 登録は簡単です。

目次

連載中 全422話

更新

  1. 現在、天国にいけるC言語入門 ヘキサ構造体は理想郷とつながっています 理想郷の仲間とともにC言語を学んでいきましょう
  2. ようこそ 天国にいけるC言語入門 ヘキサ構造体へ
  3. 理想郷との接続に成功しました
  4. 現在、天国にいけるC言語入門 ヘキサ構造体は理想郷とオンラインでつながっています。🌞🌞🌞🌞🌞
  5. とてもインストール簡単で便利なマイクロソフトVISUAL STUDIO 0.1
  6. 🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻
  7. お花を植えています
  8. Cooporate and Make it a Success!
  9. int型、char型に格納されているにかかわらず数値データを%c出力変換指定子をつかってprintf出力表示すると文字の画像データ(文字)がコマンドプロンプト画面に表示されます
  10. なぜ変数宣言のようなメモリに自由に名前を付けるシステムがつくられたのでしょうか まずはここで基本的なことを学んでみましょう
  11. コンピュータのメモリにはなぜアドレスがつけられているのでしょうか?アスキーコードのようなものがつくられたのはなぜでしょうか?なぜ変数宣言のようなシステムが作られたのでしょうか?
  12. しゃお~ん 基本事項の確認にゃん🐈int a=1; の実行においては int型の形式でメモリに格納された数値データ1 がint型の変数aに格納されることになります
  13. printf("%d¥n", 1);が実行されると数値データ1は自動的にint型の形式でメモリに格納されます 数値データ1.0ならdouble型の形式で自動的にメモリに格納されます
  14. つまり いきなり直接、数値データ1がint型の変数aに格納されているのではありません
  15. int a=1; の実行においては int型の形式でメモリに格納された数値データ1 がint型の変数aに格納されることになります
  16. 半角英数字が1バイト、全角文字のデータが2バイトに格納されているとはどういうことなのでしょうか  数値から画像データを呼び出すのが%c出力変換指定子の役割なのです 
  17. int型、char型の変数に格納されているにかかわらずアスキーコードを%c出力変換指定子を使ってprintf 出力表示するとアスキーコードに対応する半角英数字がコマンドプロンプト画面に表示されます
  18. GCCコンパイラについて
  19. これからは本当に遊ぶだけの楽しい世界になりそうです。 3連2分音符♪
  20. ヘッダファイル< float.h>とは変数の型floatに関する情報を含んでいます
  21. 素敵な詩 FLT_MIN = 1.175494e-038, FLT_MAX = 3.402823e+038   0.1
  22. ヘッダファイルとはなんですか?
  23. このヘキサ構造体、ヘキサ、フォーミュラのエピソードが本書を貫く基本的な概念になっています。
  24. ヘキサ構造体、ヘキサ、フォーミュラ(標準Cライブラリ、ヘッダファイル<stdio.h>の説明もありますの)
  25. C言語のヴァージョン C99 C11 ヘッダファイル<stdio.h>、標準入出力とは何のことでしょうか? 
  26. ソースコードがコンパイルされて機械語となりコンピュータに実行されていく様子を観察してみましょう
  27. オブジェクトファイルってなんでオブジェクトファイルっていう名前なのですか?
  28. CPU
  29. アドレスとは アドレスはコンピュータ内のメモリ,1バイトごとにつけられた番号のことです  
  30. int型の変数aは4バイトの格納容量を持ち1バイトごとにアドレスがつけられています。アドレスは16進数で表されるのでアドレスを表示するには16進数を出力表示する%p出力変換指定子をもちいます 0.2
  31. scanf関数は変数のデータを格納する変数のアドレスに宛てて数値データを格納する。
  32. ヨハン・パッヘルベル
  33. C言語での8進数、16進数の数値の表し方を学んでみよう🌞🌞🌞
  34. %x出力変換指定子は変数に格納されている10進数整数値データを16進数数値データに変換します
  35. 2進数を簡単に16進数に変換してみよう 0.4
  36. パソコンのアクセサリの電卓は2進数,8進数,16進数同士の計算もでき2進数から16進数への変換も簡単にできるんですよ。ぜひ使ってみてください。
  37. 今日は趣向をかえて音楽ソフトDominoをつかってみよ~のコーナーです💖
  38. では 音楽作曲ソフトDominoをつかって音楽をつくってみよう。
  39. 代入演算子 +=,  -= ,  *= , /=, の仕組みをみていきましょう。
  40. +=は加算代入演算子と呼ばれ変数が”🐦いま🐦”格納している数値に何らかの数値を加えたものをその変数に代入する働きがあります。a+=5;はa=a+5;を表しています
  41. 加算代入演算子をつかってsum+=a;と変数sumに変数sumが今格納している数値と変数aが格納している数値を加えたものを代入するなら変数sumには🌞🍊その足し合わされた数の総和🍊🌞が格納されます
  42. 加算代入演算子をもちいて🌞数値1と2と3の総和🌞を求めるプログラムを考察してみましょう。
  43. インクリメント演算子a++はaの格納している値に1を足したものをaに代入する,デクリメント演算子a--はaが今格納している値から1を引いたものをaに代入するという機能があります。
  44. インクリメント演算子++ ++aとa++の違いはどのようなときにでてくるのかな 0.1
  45. インクリメント演算子++ ++aとa++の違いはどのようなときにでてくるのかな
  46. それでは++a++;はどのようにプログラム内で実行されるのでしょうか?
  47. 単項演算子+とー、二項演算子++の仕組みをくわしくみていきましょう。コンパイラによっては演算子は違った働き方をしてきます。
  48. 引き算 掛け算 割り算 を足し算で表現してみたい  まずは「引き算」を足し算のみを用いて計算してみます
  49. 次は 「掛け算」を足し算のみを用いて計算してみます
  50. 「割り算」を足し算のみで計算してみます そして なぜ整数値同士の割り算の計算結果が整数になるのかについて考察してみます
  51. 「%f出力変換指定子の小数点以下6位までしか計算結果を表示しない」 というしばりから離れてさらに小さな小数点以下の位の数をもとめる
  52. 音楽ソフトDominoをつかってCFGCコード進行で小さな曲をつくってみる。
  53. +-みゅお~ん
  54. for文は命令文を繰り返し実行するシステムとなってるの  0.1
  55. for文の()内の初期化式、条件式、継続処理方法を書いたり書かなかったりするとどうなるでしょうか モンスター数値さん、お久しぶりです 0.1
  56. for文の()内の初期化式、条件式、継続処理方法を書いたり書かなかったりするとどうなるでしょうか 全部で8通りのパターンを考察してみよう
  57. それでは for文の8つの基本パターンで遊んでみる。
  58. for文を使って数値表をprintf出力表示してみましょう  エスケープシケンス¥tと¥nがふくまれたprintf文をfor文にくみあわせてみます
  59. 🍓命令文が繰り返されている部分🍓はfor文をつかって書き換えることができます
  60. for文と加算代入演算子を用いた数値の総和をもとめるプログラムを考察してみましょう🌞
  61. この章では陽気なscanfお蛇さん🐍と いっしょに scanf関数の性質をしらべてみましょう
  62. 新種の蛇 scanf 
  63. マイクロソフト社のVisual Studioをお使いの方はscanfではなくscanf_sとプログラムに記入してください Visual Studioではscanf関数をつかうとビルドエラーになります
  64. うねる蛇 ソーラーの片腕
  65. scanf_s関数はマイクロソフト社専用の特別製の関数でありマイクロソフト社以外のコンパイラをお使いの方は scanf_s関数はつかえませんのでscanf関数をお使いください
  66. 新種の蛇scanf お昼さがり 
  67. Visual Studioではscanf関数はそのままでは使えません。使用したい方はソースコードの冒頭に#pragma warning(disable: 4996)を記述してください
  68. 元気なscanf関数  
  69. 蛇フード
  70. 創作ファンタジー こうしてヘッダファイル<stdio.h>にscanfとprintfは格納されるようになったのか? 0.17
  71. scanf関数をつかって変数aに数値を格納するとき変数aは初期化されていても数値を受け取ることはできます
  72. scanf関数に%d出力変換指定子を用いてint型の変数に数値を入力、printf出力表示したときにたまにでてくるモンスター数値-1073741824を2進数で表してみる
  73. 7、15ビットのような奇数の単位でメモリに2進数のデータを格納すると2の補数のシステムはうまく機能しなくなります。ですので8、32ビットのように偶数の単位で2進数データは格納されるようになっています
  74. 自作関数を導入してみます 自分で関数を作製して使用することができます その方法はどうなってるのかな?
  75. 自作関数1 ソーラーといっしょに関数を自作してみましょう void newmadefunction(void)  0.1
  76. 関数の戻り値とは何のことでしょうか Int a=printf()の表現になれましょう
  77. 🌞なぜ void newmadefunction(void){ printf("今日もよいC言語日和です。\n"); return ; } と自作関数が記述されるのでしょうか?(void)に注目
  78. 🌞なぜvoid newmadefunction(void){printf("今日もよいC言語日和です。¥n"); return ; } と自作関数が記述されるのでしょうか?returnに注目☆
  79. ⛵⛵⛵漁じゃ,ははは、漁じゃあ~~~🚢🌊🌊🌊🌊🌊🌊
  80. ソーラーとマックスの一本釣り int main漁
  81. 🌞自作関数2 変数xを引数にもつ自作関数void fanction(int x)について考察してみる int xをxと記述してもよいのでしょうか? 
  82. C言語大漁捕獲 戻り値を格納する自作関数 0.7
  83. 🌞自作関数3 C言語大漁捕獲 return y;によりyの格納している値を戻り値にもつ自作関数について考察してみましょう
  84. ハ長調とは何のことでしょうか 0.1
  85. 🌞自作関数4 main関数には なぜ先頭にInt型 がくっついているのでしょうか return 0; は 何のためにあるのでしょうか? 
  86. getchar関数はコマンドプロンプト画面から入力されたデータが数値、文字にかかわらず🍎自動的に文字として🍎 変数の型charに格納します 
  87. 論理式とはなんでしょうか 論理式は 0か1の値、論理値をもちます 
  88. 論理演算子&& 論理式かつ論理式のような組み合わせも論理式となり0か1の論理値をもちます 
  89. 論理演算子||について考察してみよう。
  90. 今日は楽しいひなまつり 
  91. 論理否定 !演算子
  92. 論理否定 !演算子は論理式が持っている値を0なら1へ1なら0へひっくり返します。 
  93. if文から はじめてみよう。
  94. 複数の命令文をif文によって実行するにはブロック{}でくくります  
  95. if 命令文;else命令文;とif 命令文;else if 命令文;の違いを観察してみましょう。
  96. if文ネスト(入れ子)構造をもったプログラムををつくって実行してみましょう  
  97. if文ネスト(入れ子)多重構造をつくってみようっ  その2
  98. if文ネスト(入れ子)多重構造をよみとってみよう  その3 0.1
  99. カスタマイズが楽しいswitch 文
  100. scanf関数とswitch 文をくみあわせてみよう\(^o^)/ 
  101. switch 文のプログラムをif else文のプログラムで書き表してみましょう 
  102. while文もfor文と同じく命令文をくりかえし実行します
  103. コントローラーボタンの入力を受け付けるプログラムのプロトタイプを創造する
  104. if()continue;文はfor文の中でもちいられ if()の()内の条件式が1の値(真の値)を持つときはその繰り返しの回のcontinue;以下の命令文は実行されません 
  105. do{}while()文は()内の条件式が0の値(偽)となっても最低1回は命令文を繰り返すシステムです
  106. 後づけwhile文 do{}while()文の基本設定にもwhile文と同じく初期化式、継続処理方法、条件式が用いられます 例えばint a;do{a++;}while(a<5) のように記述します
  107. こんにちは 音楽ソフトDominoをつかってみよ~のコーナーです💖
  108. ヴィヴァルディ 四季 第一楽章を音楽ソフトMuse scoreとDominoで演奏してみる。
  109. break文でおはようございます。
  110. break;はfor文、while文、などのループ(繰り返し)文を抜け出したりswitch文を抜け出すときに使われます break;はループ文やswitch文の中でしか用いることはできません
  111. さあ、面白問題の登場です break;がfor文のブロック{}内のブロック{}内で用いられたプログラムを実行してみます どのような実行結果がえられるでしょうか?
  112. 次の問題にチャレンジ 😊break;😊が実行された時点で break; が含まれている for文の実行は終了となります
  113. continue;はfor文やwhile文などのブロック{}内でのみ用いられ continue;が実行されるとその回のブロック内の命令文の実行は終了し次の回のブロック内の命令文の実行がはじまります
  114. for文による繰り返しの中 if()continue文でとばされた回の命令文の代わりとなる別の命令文を実行させてみよう 猫の喜びの声が聞こえる・・・
  115. if() continue文を使用する際は()の中の条件式の記述方法にご注意ください 
  116. if()continue;文でもっともっと遊んでみる if(0)continue;文はどのように動作するかな? 天Cのフランス語と芸人
  117. for文にfor文を代入してみる   for文ネスト(入れ子)構造はどうなっているの?
  118. for文3重奏 for文{for文{for文}}  
  119. 🌞自作関数5 自作関数のプロトタイプ宣言をおこなってから自作関数の定義を行ってみます 
  120. 🌞自作関数6 💃ローカル変数とは ある関数の中で定義された変数のことです
  121. 🌞自作関数7 ローカル変数とは ある関数の中で定義された変数のことです その2
  122. 🌞ダミー自作関数8  ローカル変数とは ある関数の中で定義された変数のことです その3
  123. 🌞自作関数9 自作関数の定義の引数部分に変数宣言を用いる場合void f(int x)のように記述します。void f(x)と記述してはいけませんの
  124. まずは変数のスコープについて学んでみましょう。変数のスコープとは変数宣言された変数が使用可能な範囲のことです
  125. 🌞自作関数10 main関数内で自作関数f(int a)がf(1);と記述されている場合 1は《《自作関数の引数内で変数宣言されたint a;》》に代入されています。
  126. 変数のスコープと変数の寿命について学んでいきましょう。これらが理解できると どの位置で変数宣言をおこなえばよいのかがよくわかるようになります
  127. 🌞自作関数11 グローバル変数は 異なる関数同士でも共通して使えます そのグローバル変数のスコープ(使用可能な範囲)はグローバル変数宣言された行以下のプログラム全体となります
  128. 🌞自作関数12 グローバル変数宣言とローカル変数宣言のスコープ(変数宣言により作製された変数の使用可能な範囲)を考察してみましょう。
  129. ローカル変数のスコープ(変数の使用可能な範囲)は そのローカル変数が宣言された{}(ブロック)内となります
  130. 複数のローカル変数のスコープ(変数宣言により作製された変数の使用可能な範囲)を考察してみましょう。
  131. 複数のローカル変数の変数宣言のスコープ(変数宣言により作製された変数の使用可能な範囲)を考察してみましょう。その2
  132. 次に変数の寿命について学んでみましょう。変数に関するデータはコンピュータのメモリに保存されるだけでなく消去もされます。どの時点で消去されるのでしょうか?😊
  133. ローカル変数はそのローカル変数が宣言された{}ブロック内の命令文がすべて実行されるとメモリに保存されたローカル変数の名前、ローカル変数の格納している値とともにコンピュータのメモリから消去されます
  134. 🌞自作関数13ローカル変数のデータ情報はローカル変数が定義されたブロック内の命令文がすべて実行されるとコンピュータのメモリから消えてしまいます。そこでデータ情報維持のためにstaticが用いられます。
  135. 🌞自作関数13ローカル変数のデータ情報はローカル変数が定義されたブロック内の命令文がすべて実行されるとコンピュータのメモリから消えてしまいます。そこでデータ情報維持のためにstaticが用いられます。
  136. 自14 static変数が用いられた自作関数が実行された後もstatic変数に格納された数値データは保存されますがローカル変数でもあるので main関数内で定義された同じ名前の変数には影響を与えません
  137. 自14static変数が用いられた自作関数が実行された後もstatic変数に格納された数値データは保存されますがローカル変数でもあるのでmain関数内で定義された同じ名前の変数には影響を与えません 
  138. 🌞自作関数15 自作関数void f(int x)のint xにmain関数で定義された変数aを代入しても変数aはmain関数のローカル変数のままです。
  139. void f(int x)型の自作関数fの()内で変数宣言された変数xのスコープも自作関数fの定義のブロック{}内となります
  140. void f(int x){}型の自作関数の()内で変数宣言されたint xに代入されたデータは自作関数fが実行されるとメモリにつけられた変数名xと共にコンピュータのメモリから消去されます
  141. ここで自作ヘッダファイルを作製してみよう 解説はウェブ版天国にいけるC言語入門 ヘキサ構造体で図、イラストつきとなります
  142. 自作関数を作成し自作ヘッダファイルに格納してみましょう。そののち 自作ヘッダファイルをインクルードして自作関数を呼び出して実行してみましょう
  143. それでは変数のスコープをよりよく理解できる次のおもしろ問題にチャレンジしてみましょう。
  144. scanf関数をつかって変数aに数値7を格納してみます ただしこのプログラムでは5つのaの変数宣言が行われています 一体どの変数aに数値7は格納されるのでしょうか?
  145. scanf関数をつかって変数aに数値7を格納してみます ただしこのプログラムでは5つのaの変数宣言が行われています 一体どの変数aに数値7は格納されるのでしょうか?  解答で~す
  146. scanf関数をつかって変数aに数値7を格納してみます ただしこのプログラムでは5つのaの変数宣言が行われています 一体どの変数aに数値7は格納されるのでしょうか?  解答で~す
  147. 配列の登場です 配列は とっても便利なお方💖です
  148. 配列の仕組みを学んでみましょう!
  149. 配列宣言により配列内に作成されるデータの入れ物である配列変数の数と配列変数に格納する数値データの数の関係をしらべてみましょう
  150. 配列にはint型配列やfloat型配列などがあります。つまり配列に格納できる数値データは整数値データか実数値データのどちらかのタイプの数値データとなっています。
  151. 配列をつかうと どのように簡単にプログラムが記述できるのか一緒にみていきましょう
  152. 配列に格納された数値の総和をもとめるプログラムを実行してみましょう
  153. 加算代入演算子+=をつかって配列に格納されている数値データの合計を求めてみましょう。
  154. 変数aに変数bをa=b;と代入したように配列hairetuboxに配列hairetuhakoをhairetubox=hairetuhako;のように直接代入して中身のデータを渡すことはできません😊
  155. 🌞配列とfor文をつかった基本的で代表的で実践的なプログラムを考察してみましょう。 これらのプログラムは配列とfor文を用いたプログラムの基礎的な構造を備えています。🌞
  156. 配列とfor文をつかった基本的で代表的で実践的で役に立つプログラムを実行してみましょう
  157. 💖💖💖配列とfor文をつかって配列変数に格納されているデータを変更してみましょう
  158. 配列とfor文を用いて配列変数に格納されているデータをずらしてみましょう🌻💖💖
  159. 配列変数に格納されているデータの順序を逆に変更するプログラムを実行してみよう💖💖
  160. 配列変数同士で格納されている数値データを交換してみよう その1💖💖💖
  161. 配列変数同士で格納されている数値データを交換してみよう その2💖💖🌻
  162. 配列変数に格納されている数値同士を比較するプログラムを実行してみよう💖💖💖
  163. 配列変数の中に格納されている数値の中で最も大きな数値を表示してみよう(*^_^*)💖💖
  164. 配列変数の中に適当に格納されている数値を最も大きな数値から順に配列変数に入れ替えるプログラムを実行してみよう。💖💖💖
  165. 配列変数の中に適当に格納されている数値を最も大きな数値から順に配列変数に入れ替えるプログラムを実行してみよう。 その2💖💖💖
  166. 配列変数の中に適当に格納されている数値を最も大きな数値から順に配列変数に入れ替えるプログラムを実行してみよう。 より高速にビルド実行が行われるようプログラムを改良してみます💖💖💖
  167. 配列変数の中に適当に格納されている数値をより高速に最も大きな数値から順に配列変数に入れ替えるプログラムを実行してプログラムの動作する過程を鑑賞してみよう。💖💖💖
  168. イラスト作製ソフトCLIP STUDIOをちょこっとご紹介いたします ぶーにゃんさんのお気に入りソフトなんです
  169. 私の愛機はCPU AMD FX8120搭載でした
  170. とても簡単にできる完全無音パソコン環境の構築の仕方(笑)
  171. scanf関数をつかって配列へ数値を格納してみよう
  172. 2次元配列を作製し数値を格納してみる。やはり簡単でした。
  173. 簡単な方法を使って2次元配列に数値を格納(初期化)してみましょう
  174. 3次元配列宣言を行い簡単に初期化してみる 
  175. おまけのコーナー 4次元配列宣言、初期化も行ってみよう
  176. おまけのコーナー 5次元配列宣言、初期化もできるか試してみよっかな 
  177. 数値だけでなく文字データ 'a','b','c'など を配列に格納してみようよ char型の配列宣言を行ってみます。もちろん簡単な初期化方法もつかってみます
  178. おまけのコーナー 9次元配列宣言、初期化をおこなってみよう 前半
  179. char型の配列に文字列nekoを格納しnekoをコマンドプロンプト画面にprintf出力表示してみよう
  180. もっと簡単にchar型の配列に文字列nekoを格納(配列の初期化)してみる 
  181. char型の配列にひらがなの文字列を格納してみます そのときひらがなの文字列はchar型の配列内に生成された配列変数にどのように格納されているのでしょうか?
  182. おまけのコーナー 9次元配列 後半 天国にいけるC言語入門技 天国にいけるまで手計算
  183. 9次元配列をつかってあなたの健康度をチェックするプログラムを作製してみました さらにプログラムのバグの訂正に成功しました 
  184. おまけのコーナー 10次元配列宣言、初期化をおこなってみる
  185. おまけのコーナー 11次元配列宣言、初期化を実行してみる
  186. おまけのコーナー 12次元配列から24次元配列まで作製する 12次元配列から15次元配列までを作成してみる
  187. おまけのコーナー12次元配列から24次元配列まで作製する その2 16次元配列と17次元配列を作製する
  188. scanf関数をつかって半角英数字1文字分の文字データをchar型の変数に格納する
  189. 文字列データ”neko”をscanf関数をつかって配列に格納する。文字列データを格納できるということは1文字の文字列データを格納することもできます。やったね💖
  190. ひらがなの文字列データ"ねこ"もscanf関数をつかって配列に格納することができます 
  191. scanf関数を使って空白を含んだ文字列データ"Hello nyannko"を配列にとりこむとprintf関数を使ってHelloまでしか表示できません 配列内にどのようにデータは格納されているの?
  192. 🌞scanf関数を使って空白を含んだ文字列データ"Hello nyannko"を配列にとりこむことはできませんがgets関数(get_s関数)をもちいればそれが可能となります🌞 
  193. 基本的にVisual Studioではオーバーフローの起こる可能性のあるメモリにデータを格納する関数はセキュリティ機能が強化されています
  194. scanfとscanf_sの違いとは何でしょうか?
  195. scanf_s関数には バッファオーバーフローを防ぐため入力文字数制限機能が付けられています
  196. これであなたも scanf_s関数物知り博士(*´▽`*)のコーナーです
  197. これであなたも scanf_s関数物知り博士(*´▽`*)のコーナーです
  198. 配列の中に格納されている文字数を調べるstrlen関数
  199. 配列の中に格納されている文字列データの文字数を数えるstrlen関数です 文字列データが半角英数字の場合 
  200. 配列の中に格納されている文字列データの文字数を調べるstrlen関数です 文字列が ひらがな、カタカナ、漢字の場合 
  201. 配列の中に格納されている文字の文字数を調べるstrlen関数です 文字が絵文字🐈🐘🍅の場合
  202. sizeof演算子でint型,float型,double型,配列のデータ格納可能容量(バイト数)を調べてみます sizeof(int)はただの数値データ💖4💖を表します  
  203. ちょっとおまけ 統合開発環境が違うとstrlen関数が異なる働きをするところを観察してみましょう
  204. おまけのコーナー 配列の中に格納されている🍋文字列データ🍋の文字数を数え上げるstrlen関数をつかって 配列の中に格納されている🍎数値データ🍎の数を数え上げてみよう Visual Studioの場合
  205. おまけのコーナー 配列の中に格納されている🍋文字列データ🍋の文字数を数え上げるstrlen関数をつかって 配列の中に格納されている🍎数値データ🍎の数を数え上げてみよう EAZY IDECの場合
  206. 1次元配列でなく2次元配列のなかに格納されている数値データの数を配列のなかに格納されている文字列データの文字数を数え上げるstrlen関数を使って数え上げてみます
  207. おまけのコーナー 文字列データでなく数値データを格納した配列の格納容量をsizeof演算子で調べる
  208. おまけのコーナー 実際に17次元配列に格納された数値データの個数をsizeof演算子をつかって17次元配列の格納容量(格納できるバイト数)を求めることにより間接的に調べてみましょう。
  209. Visual Studioではstrcat関数はそのままでは使えません。ソースコードの冒頭に#pragma warning(disable: 4996)を記述するかstrcat_sをお使いください
  210. strcat関数を使って異なる配列内に格納されている文字列データ同士を連結させてみましょう  
  211. strcat_s関数はつなげた文字列データが配列に入りきらない場合は文字列データを配列に格納しません
  212. ここでポインタ変数を導入してみます
  213. メモリとアドレスと変数の関係について学んでみましょう 
  214. ポインタ変数とは 変数のアドレスを格納するための変数のことです 
  215. ポインタ変数とは 変数のアドレスを格納するための変数のことです 
  216. 変数のアドレスがポインタ変数に格納された場合 ポインタ変数をつかって変数内に格納されているをデータをもとめることができます💖 
  217. 👇のエピソードをみればおわかりになられますように ポインタ変数の特徴は指定したアドレスの場所に格納されている数値を変更できることにあります 
  218. ポインタ変数をつかえば ポインタ変数にアドレスを代入することにより そのアドレスの場所のメモリに格納されているをデータを変更することができます
  219. ポインタ変数ptaにポインタ変数ptbを代入することによりポインタ変数ptbが格納しているアドレスをポインタ変数ptaに代入することができます
  220. ですので このことを意識しているとポインタ変数の使い方をよりよく理解できるようになります
  221. 天国にいけるC言語入門 ヘキサ構造体 特別企画  佐月 詩さん 原作「フェアリーウェイト」2次創作映画〚ft王〛上映会 & 次回超大作告知
  222. 配列のポインタ変数とは一体何のことでしょうか?
  223. 配列には自分でポインタ変数を作製しなくとも配列を作った時点で配列専用のポインタ変数が用意されているのですの😚  
  224. 配列に数値データを格納した場合の配列や配列変数のアドレスはどうなっているのでしょうか?調べてみます。
  225. 配列に文字列データを格納した場合の配列や配列変数のアドレスはどうなっているのでしょうか?調べてみます。
  226. ここでポインタ変数を使って文字列データをメモリに格納するときに使用される[ ]演算子について学んでみましょう [ ]演算子は配列にも使用されていて極めて重要な働きをしています
  227. 🌞🌞🌞char* p="abc";を実行したのち [ ]演算子をポインタ変数pに作用させ作製した配列変数p[0]はポインタ変数pの格納しているアドレスのメモリに格納されているデータ'a'を表します。
  228. こんな子いるかな? char* p;を実行した後 p[0],p[1],p[2]を用いて文字列データをメモリに格納することはできません
  229. 配列変数a[i]のアドレスを格納しているポインタ変数はポインタ変数aにiを足したアドレス演算a+iで表されます 
  230. アドレス演算とはアドレスを格納しているポインタ変数に数値を普通の数値計算のように数値を足したり引いたりすることです その式は配列変数のアドレスを格納するポインタ変数となります
  231. 文字列を格納するchar hairetu[ ]="nekoneko";とchar *hairetu="nekoneko";この2つを比較することによりポインタ変数の仕組みがより理解できるようになります
  232. 配列の代わりにポインタ変数をつかって文字列データをメモリに格納してみます 
  233. Visual Studioでは1度変数宣言、配列宣言をおこなったならそのときと同じ変数名、配列名をつかって再度変数宣言、配列宣言を行うことはできません。🍓
  234. Visual Studioでは1度変数宣言、配列宣言をおこなったならそのときと同じ変数名、配列名をつかって変数宣言、配列宣言を行うことはできません。🍓
  235. 🌞🌞🌞ポインタ変数を使って文字列データをメモリに格納していく場合 1番最後にデータを格納したメモリのアドレスがポインタ変数に格納されます🌞🌞🌞
  236. 配列と違いポインタ変数はポインタ変数名を変更しなくても文字列を💖どんどん💖メモリに格納することができます
  237. ポインタ変数は1番最後にポインタ変数を使って文字列データを格納したメモリのアドレスを格納するために存在します。 そして文字列データをメモリに格納するためのポインタ変数名はなんでもよいのです
  238. ポインタ変数hairetuは1番最後にポインタ変数hairetuを使ってデータを格納したメモリのアドレスを格納します。文字列データをメモリに格納するためのポインタ変数名はなんでもよいのです
  239. ポインタ変数をつかって文字列データがメモリに格納されたとき最後に文字列データが格納されたメモリのアドレスがポインタ変数に代入されます その様子を観察してみましょう🍓
  240. 文字列データ"neko"をコンピュータのメモリに格納する char hairetu[]="neko"; と char* hairetu="neko"; では何がちがうのでしょうか?
  241. メモリに最後に格納された文字列データが配列変数に格納されるので配列変数に格納される文字列データは変化していきます。メモリに文字列データが格納されることと配列変数に文字列データが格納されることは別々の話
  242. 文字列データを格納するchar hairetu[ ]="nekoneko";とchar *hairetu="nekoneko";の構造を文字列データが格納される場所のアドレスを求めて比較してみます
  243. →となります。配列のポインタ変数hairetuをアドレス&aを代入されたポインタ変数ptaとすると配列変数 hairetu[0],hairetu[1]・・・ は*ptaの関係にあります
  244. 🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳
  245. 配列システムとポインタ変数システムはとても似ています。そのことを考察してみましょう。🌞
  246. 配列システムとポインタ変数システムはとても似ています そのことを考察してみましょう。🌞
  247. 複数の文字列データを1つの配列宣言やポインタ変数宣言を使い同時にメモリに格納してみます その1
  248. 🌞🌞複数の文字列データを1つの配列宣言を使い同時にメモリに格納してみます その2
  249. 配列を用いて複数のポインタ変数宣言を行うことができます。配列を用いて複数のポインタ変数宣言を行うとどのようなことが可能になるのでしょうか?
  250. 🌞🌞🌞複数の文字列データを1つのポインタ変数宣言を使い同時にメモリに格納してみます その3
  251. 配列変数はメモリにどのような数値が格納されているかをみるための窓の役割をしており、かつ、*ptaを通してアドレス&aのメモリに格納された
  252. 🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
  253. データを取り扱うことができたように窓である配列変数hairetu[0],hairetu[1],hairetu[2]・・・にとりこまれたデータを取り扱うことができます
  254. 🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
  255. 別の言い方をするとデータが格納されているのは配列変数でなくメモリであり配列変数hairetu[0],hairetu[1],hairetu[2]・・・はそのデータをとりあつかうために存在しています
  256. おさらい 自作関数newmadefunction(int x);が実行されている間は ローカル変数xに格納されている数値はコンピュータのメモリに格納されていますが実行後は消えてしまうのでした
  257. 値渡しについてご説明いたします
  258. 実引数とは?仮引数とは?実引数から仮引数への値渡しとはなんのことでしょうか? 
  259. 実引数と仮引数とは?実引数から仮引数への値渡しとはなんのことでしょうか? 今度はメモリに電荷が蓄えられるという視点からお話してみたいと思います その2
  260. 実引数と仮引数とは?実引数から仮引数への値渡しとはなんのことでしょうか? 今度はメモリに電荷が蓄えられるという視点からお話してみたいと思います その3
  261. グローバル変数bを自作関数の引数の変数aに代入した場合も値渡しとなるためグローバル変数bは自作関数の操作を受けることはなくグローバル変数bに格納されている数値は変更されません。
  262. グローバル変数bを自作関数の引数となったグローバル変数bに代入した場合も値渡しとなるためグローバル変数bは自作関数の操作を受けることはなくグローバル変数bに格納されている数値は変更されません。
  263. おまけのコーナー 24次元配列を作製する  その3
  264. 参照渡し(ポインタ渡し)の具体例はmain関数内で定義された変数aのアドレスを自作関数内で定義されたポインタ変数ptxに代入することですね
  265. 🌞🌞🌞参照渡し(ポインタ渡し)とは自作関数の引数にポインタ変数をつかい実引数のアドレスをポインタ変数に渡す方法のことなのです🌞🌞🌞
  266. ですので変数aのアドレスに格納されている数値を表す*ptxをつかい変数aのアドレスに格納されている数値を変更することができます
  267. 参照渡し(ポインタ渡し)が行われるときの自作関数の構造を分析してみましょう そのために自作関数の部分をmain関数の中で元の命令文の集まりに戻してみます
  268. すなわち main関数内で定義された変数aの格納している値を自作関数を経由して変更することができます
  269. 🌞🌞変数aに格納されている数値データと変数bに格納されている数値データの交換にチャレンジしてみよう
  270. 自作関数を使って 変数aに格納されている数値データと 変数bに格納されている数値データを 交換してみよ~う
  271. 🌞🌞変数aに格納されている数値データと変数bに格納されている数値データを交換するswap関数を作製してみよう  その1
  272. 🌞🌞変数aに格納されている数値データと変数bに格納されている数値データを交換するswap関数を作製してみよう  その2
  273. main関数内で定義された配列に格納されている数値データを自作関数を使って変更してみましょう。自作関数の引数が(int hairetu[])となっている場合 その1
  274. main関数内で定義された配列に格納されている数値データを自作関数を使って変更してみましょう。自作関数の引数が(int hairetu[])となっている場合 その2
  275. 参照渡し(ポインタ渡し)は ゲームキャラクターが移動することやゲームキャラのHPやMPの値が変化することと関係しています 
  276. main関数内で定義された配列に格納されている数値データを自作関数を使って変更してみましょう。自作関数の引数が(int *hairetu)となっている場合🌞
  277. 👆このことは ゲームキャラクターが移動することやゲームキャラのHPやMPの値が変化することと関係しています 
  278. 配列を自作関数の引数に設定しmain関数で定義された配列のアドレスを格納したポインタ変数を代入することができます。その際、参照渡し(ポインタ渡し)をされます 値渡しされる方法はありません 
  279. main関数内で定義された配列に格納されているデータをポインタ変数を使った自作関数によって操作を加え変更してみましょう そのため配列のアドレスを自作関数の引数にポインタ渡しする方法を学んでみましょう
  280. main関数内で配列宣言された配列の配列変数に格納されている数値データを配列でなく配列変数を自作関数の引数に用いることにより自作関数に値渡しすることができます。
  281. ここではポインタ変数をつかってアドレスを格納するのではなく文字や数値データを格納する方法をまなんでみましょう。
  282. 1つのポインタ変数宣言をつかって複数の文字データや文字列データをコンピュータのメモリに簡単に1度に格納する方法はあるのですが複数の数値データを1度に簡単に格納する方法はないのです
  283. ポインタ型の配列宣言をつかって簡単に複数の変数のアドレスデータをメモリに格納することができます
  284. 配列宣言を初期化される際に用いられるブロック{}内には配列変数に格納できるデータを記述することができます よってchar hairetu[3] = {'a',1,'c' };と記述することも可能です
  285. char型、char*型の配列宣言、初期化がおこなわれるときのブロック{}の仕組みを考察してみます
  286. 自作関数の引数にポインタ変数宣言や配列宣言をつかってmain関数内で作成された配列のアドレスを参照渡し(ポインタ渡し)することができます 
  287. 自作関数の引数としてhairetuの配列宣言またはhairetuのポインタ変数宣言が行われた場合*hairetuとhairetu[0]、*hairetu+1とhairetu[1]・・・は等しくなります
  288. ポインタ変数や配列をつかって数値やデータ、文字データ、文字列データをコンピュータのメモリに格納する方法 まとめ
  289. if文とヘッダファイル<string.h>に格納されているstrcmp関数を使って 入力された文字列によって実行される命令文が変わるプログラムを作成してみましょう。
  290. この章ではハードディスク内にファイルを自作しデータを保存する方法を学んでいきましょう ゲームでいえばセーブデータを保存することにあたります
  291. ファイル構造体とはハードディスクのファイルにデータを保存する前にデータをメモリに格納するときの型でありファイルからデータを読み取ってメモリに保存するときの型でもあります🌻
  292. 👆ハードディスクにデータを保存したり、ハードディスクから保存されたデータをよみこむシステムはどのようになっているかをご説明いたします
  293. ファイルポインタ変数宣言とfopen関数の書式設定をおこないハードディスク内にデータを保存するためのファイルを作製します
  294. ハードディスク内のファイルとデータをやり取りするメモリのアドレスが ファイルポインタ変数fpに格納されます  そのメモリのアドレスは変化しません
  295. ハードディスク内のファイルとデータをやり取りするメモリのアドレスが ファイルポインタ変数fpに格納されます
  296. Visual Studioではfopen関数はそのままでは使えません。ソースコードの冒頭に#pragma warning(disable: 4996)を記述してください
  297. Visual Studioをお使いの方はfopen関数を使用するときはご注意ください そのままでは使用することができません。
  298. Visual Studioでは ハードディスク内にファイルを作製するのにfopen関数だけでなくfopen_s関数を使用することができます
  299. fputs関数とfprintf関数を用いてハードディスク内のファイルにデータを書き込みます。このときまずデータはファイル構造体を通してメモリに格納されてからハードディスク内のファイルに保存されます
  300. 👆ハードディスク内のファイルにデータを保存する場合、まずはデータはコンピュータのメモリに保存されてからハードディスク内のファイルに保存されます。
  301. オープンモード "w" でファイルを開くと開いただけでファイルは初期化されて前に格納されたデータはきえてしまいます
  302. 1つのファイルポインタ変数を使い複数のファイルのデータの読み込み、書き込みを実行してみましょう。ファイルポインタ変数の仕組みをもう少し詳しく観察してみましょう。
  303. ファイルポインタ変数宣言とfopen関数の設定を2つ行い同時にハードディスク内に2つのファイルを作製してみましょう。
  304. ハードディスク内のファイルにデータを追加で保存するにはファイルを開くとき オープンモード"a"をもちいます
  305. 実はハードディスク内のファイルにデータを保存することとfclose関数をつかってファイルを閉じることは関係ありません。
  306. fprintf関数によってデータをハードディスク内のファイルへ保存することと fclose関数によってファイルを閉じることは関係ありません
  307. ちょっと休憩しています
  308. 👇ハードディスク内に保存されているデータを利用する場合も、ハードディスク内に保存されているデータはコンピュータのメモリに保存されてから利用可能となります
  309. ハードディスク内に作成したファイルをオープンモード"r"で開きデータを読み込んでみます 
  310. if(fp==NULL)の代わりにif(fp=NULL)と記述することはできません。==は関係演算子で=は代入演算子となっています。
  311. if(fp=NULL)の代わりにif(fp!=NULL)と記述してみましょう。fp=NULLの=は代入演算子ですがfp!=NULLの!=は関係演算子です。ですので!=は=の否定形ではありません
  312. ファイルオープンに成功したときファイルポインタ変数にNULL以外の戻り値が返されているのを確認してみよう
  313. 🌞🌞ファイルポインタ変数を使ってハードディスク内のデータをメモリに取り込んでいってもファイルポインタ変数の格納している値は変化しないことを確かめてみよう。
  314. ユーザーから渡されたデータはまずコンピュータのメモリに保存されるのはコンピュータの基本的なシステムでした
  315. 読み取りオープンモード"r"の代わりに追加書き込みオープンモード "a" をつかっても ハードディスク内のファイルに保存したデータをコマンドプロンプト画面に表示することはできません
  316. ハードディスク内のファイルにデータを保存する場合もハードディスク内のファイルを利用する場合も、そのシステムは機能しています
  317. 読み込みオープンモード"r"の代わりに新規書き込みオープンモード "w" をつかっても ハードディスク内のファイルに保存したデータをコマンドプロンプト画面に表示することはできません
  318. ファイルにデータがなにも保存されてない状態でオープンモード"r"でファイルをひらきデータを読み取りprintf表示したなら どのようなデータがコマンドプロンプト画面に表示されるでしょうか
  319. 👇実はハードディスク内のファイルを開くのにどのようなファイルポインタ変数を用いても構いません。
  320. 実はハードディスク内のファイルを開くのにfp,rp,spなど自由にどのようなファイルポインタ変数名を用いても構いません。なぜなら・・・
  321. このこともユーザーから渡されたデータはまずコンピュータのメモリに保存されるというコンピュータの基本的なシステムが関係しています
  322. オープンモード "w+" , "r+", "a+" について考察してみよう
  323. 読み込みモードと書き込みモードをあわせもつオープンモード”w+”,"r+","a+"ですが ファイルが開かれ閉じられるまでに1度に使えるのは書き込み機能か読み込み機能のどちらか1つだけです
  324. 読み込みモードと書き込みモードをあわせもつオープンモード"w+","r+","a+"ですが ファイルが開かれ閉じられるまでに1度に使えるのはfprintf関数かfscanf関数のどちらか1つだけです
  325. オープンモード”w+”,"r+","a+"が読み込みモードになるか書き込みモードになるかは最初にfscanf関数がつかわれるかfprintf関数が使われるかによって決まります。
  326. fprintf関数を使った後に fscanf関数を使ってみる
  327. fprintf関数を使った後に fscanf関数を使ってみる
  328. オープンモード "w+" の新規書き込み機能について考察してみよう
  329. オープンモード "r+" の新規書き込み機能について考察してみよう
  330. オープンモード "a+" の追加書き込み機能について考察してみよう
  331. オープンモード "w+"の読み込み機能について 考察してみよう 今のところ読み込み機能が働くところを観測できません。読み込み機能は機能していないかもしれません。 
  332. オープンモード "r+"の読み込み機能について 考察してみよう
  333. オープンモード "a+"のハードディスクのファイルデータ読み込み機能について 考察してみよう
  334. fprintf関数を使った後に fscanf関数を使うと ファイル内のデータはコンパイル結果に正しく表示されません。
  335. fclose関数にはファイルを閉じるという機能のほかに ファイルの書き込みモード、読み込みモードを解除するという面も持っています
  336. 同じプログラム内で fprintf関数を使って保存された数値を fscanf関数を使って配列に取り込むにはデータを保存後1度ファイルを閉じて書き込みモードを解除する必要があります。
  337. ファイルを閉じて書き込みモードを解除せずに新たにファイルポインタ変数宣言を行って読み込みモードでファイルを開いてもfscanf関数を使ってファイルデータを読み込むことはできません。
  338. ファイルを閉じて書き込みモードを解除せずに新たに別のファイルポインタ変数宣言を行って読み込みモードでファイルを開いてもfscanf関数を使ってファイルデータを読み込むことはできません。
  339. 👆この操作はゲームでいうとセーブデータを保存した後そのまますぐにそのセーブデータを開いて読み込むときに使用されます。
  340. fscanf関数を使った後に fprintf関数を使う場合でもfclose関数を使い1度ファイルを閉じ、読み込みモードから書き込みモードに変更する必要があります
  341. 👆この操作はゲームでいうとセーブデータをロードした後そのまますぐにそのセーブデータにデータを保存(セーブ)することに相当します
  342. 🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟
  343. ファイルポインタ変数fpを引数に用いるfgetc関数を考察してファイルポインタ変数の本質を垣間見てみましょう
  344. fgetc関数を使ってハードディスク内のファイルに保存された文字列から1文字だけ文字を読み取ってみましょう
  345. fgets関数をつかってハードディスク内のファイルに保存された文字列から複数の文字を用意した配列に格納しコマンドプロンプト画面に表示してみよう
  346. データをコンピュータが直接扱えるバイナリデータに変換しファイルに保存してみよう そのファイルはバイナリファイルと呼ばれます
  347. バイナリデータとしてファイルに保存されたデータをfread関数を使って配列に読み込んだ後コマンドプロンプト画面に表示してみます 
  348. fprintf関数には存在しないfwrite関数の第3引数について考察してみます fwrite(&hairetu[0],sizeof(int),1,fp);の1の部分ですね。
  349. fseek関数を用いてバイナリファイルからデータの読み込み開始位置を指定してデータを読みこんでみましょう 読み取り基準位置がSEEK_SETの場合 
  350. fseek関数を用いてデータの読み込み開始位置を指定してバイナリファイルからからデータを読みこんでみましょう 読み取り基準位置がSEEK_ENDの場合
  351. fseek関数を用いてバイナリファイルからデータの読み込み開始位置を指定してからデータを読みこんでみましょう 読み取り基準位置がSEEK_CURの場合
  352. この章では構造体について学んでいきましょう
  353. 🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟
  354. コンピュータのメモリに効率よくデータを保存、そして使用する為に配列や構造体は作られています😊ゲームでは大量のデータを扱うので大変重宝されます
  355. 構造体を導入します。構造体structure Cubeを定義しcube1の構造体変数宣言structure Cube cube1をおこないます
  356. 🐁🐁🐁みゅう
  357. 構造体変数を簡単に初期化してみましょう。
  358. 構造体と構造体変数の名前の付け方を一緒に考察してみましょう
  359. 構造体変数のメンバ変数を簡単な方法で初期化してみます
  360. int型やfloat型と同じく構造体struct Cubeの型に構造体変数は格納されます つまり構造体struct Cubeとは変数を格納する型といえます
  361. 構造体と構造体変数を用いるとどのような点が便利なのでしょうか?
  362. 構造体struct Cube型の構造体変数cube1に同じ構造体struct Cube型の構造体変数cube2を代入してみましょう
  363. typedefを使い 変数の型名、構造体名などを新しい名前に変更することができます
  364. 構造体宣言と構造体名の変更を同時に行ってみます
  365. 新たに別の種類のデータを管理するために構造体に新たなメンバ変数を追加してみます
  366. strcpy関数は生成された配列に文字列データを🌞後から🌞代入するために使用されます ここでstrcpy関数をマスターしちゃおう😊
  367. strcpy関数 strcpy_s関数の基本について学んでみましょう strcpy_s関数を使えば生成された配列に後から文字列データを代入することができます
  368. strcpy関数を使って文字列データを配列にコピーしてみよう
  369. strcpy_s関数とstrcpy関数の違いはなんでしょうか?
  370. ポインタ変数aを用いてメモリに 文字列データを格納した場合ポインタ変数aをstrcpy_s関数の第1引数に設定することができる場合とできない場合があります
  371. ポインタ変数を使ってメモリに格納された文字列データをstrcpy関数を使ってchar型の配列に代入(コピー)してみます
  372. 構造体のメンバ配列宣言を行い、構造体変数のメンバ配列に😊strcpy関数😊を用いて文字列データを格納しコマンドプロンプト画面に文字列をprintf出力表示してみよう
  373. 構造体の構造体宣言にメンバ変数として変数の他に構造体変数を加えてみます
  374. 構造体変数のメンバ変数となった他の構造体の構造体変数をもっと簡単に初期化してみましょう
  375. 自作関数の引数に構造体変数を用いることができます そしてmain関数内で定義された構造体変数を代入することもできます(この場合 値渡しとなります)
  376. main関数内で定義された構造体変数を自作関数の引数として定義された構造体変数に代入する・・・構造体変数の値渡し  マックス達はバカンスしています
  377. 構造体変数のアドレスをポインタ渡しすることによりゲームキャラの位置、ステータスデータを変更することができます ここでその仕組みを学んでいきましょう
  378. 構造体変数のメンバ変数に格納されている数値データをポインタ変数をつかってprintf出力表示してみます
  379. main関数内で定義された構造体変数のアドレスを自作関数の引数に構造体型のポインタ変数をもちいて参照渡し(ポインタ渡し)をしてみます
  380. 構造体の配列を導入します 複数のキャラクターのステータスデータを構造体の配列をもちいてメモリに格納、管理することができます。
  381. 格納した数値データを効率よくprintf表示する 構造体型の配列宣言を行い構造体型の配列を作製して複数の構造体変数のメンバ変数に格納された数値データを構造体型の配列に格納してみよう その1
  382. 格納した数値データを効率よくprintf表示する 構造体型の配列宣言を行い構造体型の配列を作製して複数の構造体変数のメンバ変数に格納された数値データを構造体型の配列に格納してみよう その2 
  383. 格納した数値データを効率よくprintf表示する 構造体型の配列宣言を行い構造体型の配列を作製して複数の構造体変数のメンバ変数に格納された数値データを構造体型の配列に格納する方法 その3
  384. 構造体型の配列の簡単な初期化法と格納した数値データを効率よくprintf出力表示する方法について考察してみます   
  385. ここで出そろったメモリにデータを格納するためのいれもの、変数、配列、構造体、構造体型の配列の違いを実際に数値データを格納、表示してみて確かめてみましょう。 数値1を格納し数値1を出力表示する場合 
  386. 数値データ1から10を格納し、数値データ1から10をprintf出力する場合 
  387. 縦1.0 横2.0 高さ3.0 の立方体cube1の数値データをメモリに格納、それらの数値データを”文章”にくみこんでコマンドプロンプト画面にprintf出力表示してみます 
  388. 複数の立方体の数値データをメモリに格納、それらの数値データを”文章”にくみこんでコマンドプロンプト画面にprintf出力表示してみましょう
  389. 構造体の配列のアドレスをポインタ渡しすることにより複数のゲームキャラの位置、ステータスデータを構造体だけを使った場合より簡単に変更することができます ここでその仕組みを学んでいきましょう
  390. main関数内で定義された構造体変数に1人のゲームキャラクターのデータを格納し自作関数の引数に構造体変数のアドレスをポインタ渡ししてから自作関数によって構造体変数に格納されているデータを変更してみます
  391. 複数のゲームキャラクターのデータをmain関数内で定義された構造体変数に格納し自作関数の引数に構造体変数のアドレスをポインタ渡ししてから自作関数によって構造体変数に格納されているデータを変更してみます
  392. ちょっとおまけ 自作関数の引数となっているポインタ変数に複数の構造体変数のアドレスが代入される様子を観察してみましょう
  393. main関数内で定義された構造体型の配列のアドレスを自作関数の引数となっているポインタ変数に参照渡ししてmain関数内で定義された構造体型の配列に格納されている数値データを変更してみたいと思います。
  394. main関数内で定義された構造体型の配列のアドレスを自作関数の引数となっているポインタ変数に参照渡ししてmain関数内で定義された構造体型の配列に格納されている数値データを変更してみたいと思います。
  395. main関数内で定義された構造体型の配列のアドレスを 自作関数の引数となっているポインタ変数にポインタ渡しして からmain関数内で定義された構造体型の配列に格納されている数値データを変更してみます
  396. main関数内で定義された構造体の配列に格納された2人のキャラクターのステータスデータを構造体の配列のアドレスを自作関数の引数であるポインタ変数に参照渡しして同時に2倍にしてみます。
  397. 構造体型の配列をつかって複数のキャラクターのステータスデータを2倍に変更して表示するときの利点はfor文を使ってprintf命令文をまとめあげることができるという点にあります
  398. 共用体は構造体のそっくりさんです
  399. 共用体と構造体は何がちがうのかな?😊
  400. 共用体の仕組みをしらべてみましょう。
  401. 列挙体をつかって文字を数値のようにあつかってみましょう。
  402. 実は😝列挙体の文字定数には数値が割り振られています
  403. プリプロセッサの1つ マクロ をご紹介いたします
  404. マクロ2
  405. マクロス
  406. マクロをつかえば自作関数の引数にアドレスを渡す参照渡しの方法を使わなくてもとても簡単にmain関数内で定義された変数を直接、自作関数にかけて格納されている数値を変更することができます
  407. マクロで自作関数を作製する
  408. マクロによって作られた自作関数の特徴を考察してみましょう。
  409. マクロで定義された自作関数をつかってmain関数内で定義された変数、配列、構造体、構造体の配列に格納されている数値を変更してみましょう ポインタ渡しの方法に比べてプログラムがとても簡単になります
  410. マクロをつかえば自作関数の引数にアドレスを渡す参照渡しの方法を使わなくても簡単にmain関数で定義された変数を自作関数にかけて格納されている数値を変更することができます
  411. マクロで定義された自作関数を使って お手軽にmain関数内で定義された配列に格納されている数値を変更してみます。
  412. マクロで定義された自作関数を使って お手軽にmain関数内で定義された構造体の構造体変数のメンバ変数に格納されている数値を変更してみます。
  413. マクロで定義された自作関数を使って お手軽にmain関数内で定義された構造体の配列に格納されている数値を変更してみます。
  414. マクロをfor文やscanf関数の使われたプログラム内で便利に使ってみます
  415. マクロを使って条件付きコンパイルを行うことができます。
  416. 条件付きコンパイル その2 #undefと#ifndef
  417. 組み込みマクロをつかってソースファイルが実行されたときのファイル名、日時に関するファイル情報を表示してみよう
  418. 今日のお話は・・・
  419. 🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞C言語の基礎事項の解説は以上となります。いかがでしたか? 😊ニコニコ       🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
  420. ちょっとウォーミングアップ たくさんの引数を持つ関数を考察してみる
  421. まずは自作関数f(a,b)型の引数表現に慣れましょう 
  422. 自作関数には引数にif文やfor文などの条件式で使用される変数をもつものがあります。 その1 if文の条件式内の変数を引数に持つ場合 0.1
  423. 自作関数には引数にif文やfor文などの条件式で使用される変数をもつものがあります。 その1 if文の条件式内の変数を引数に持つ場合 0.1
  424. 自作関数には引数にif文やfor文などの条件式で使用される変数をもつものがあります。 その2 for文の条件式内の変数を引数に持つ場合
  425. 自作関数には引数にif文やfor文などの条件式で使用される変数をもつものがあります。 その3 配列につかわれる変数を引数に持つ場合
  426. 数値が変わる部分をもつ文章を表示する自作関数Sentenseを作製してみましょう 
  427. 数値が変わる部分をもたない”文章”を表示する(引数を持たない)自作関数Sentenseを作製してみましょう
  428. 数値が変わる部分をもたない”文章”を表示する(引数を持たない)自作関数Sentenseを作製してみましょう
  429. if文の条件式に代入する数値によって表示される文章を変更することができる自作関数SelectSentenseを導入する
  430. 自作関数SelectSentenseを他の自作関数にさりげなく追加してメッセージ文を表示してみましょう
  431. 自作関数のなかに自作関数を格納する 自作関数の2重入れ子  その1
  432. 自作関数のなかに自作関数を格納する 自作関数の2重入れ子  その2
  433. プログラム内の自作関数の使われ方が難しいと思ったら、自作関数をmain関数内に戻して考えてみましょう。
  434. 自作関数がどのように機能するか解りにくいときは自作関数の定義部分をmain関数内に戻して記述して理解してみましょう
  435. それでは お話は次のシリーズへと続いていきます
  436. コマンドプロンプト画面に触れてみましょう
  437. ファイルのパスはどのような経路で保存されているファイルにたどり着けるか、どのような構造でファイルが保存されているかを表しています。
  438. コマンドプロンプト画面をおさわりしてみよう
  439. おまけのコーナー イースⅡ オープニング曲を音楽ソフトDominoで演奏させてみます
  440. malloc関数をつかってメモリを確保した後 free関数を使ってメモリを解放してみよう
  441. malloc関数の説明にとりかかってみよ~
  442. malloc関数はアドレスを戻り値としてもちます そのアドレスをポインタ変数に格納するにはアドレスを格納する型にキャストする必要があります
  443. p= (char *)malloc(sizeof(char)*100);はp= (char *)malloc(100);と記述することができます
  444. キャラアスタリスクchar *型のポインタ変数に イントアスタリスクint *型に格納されたアドレスを代入することはできません
  445. char*型のポインタ変数pにアドレスが代入されると配列変数p[0]のアドレスはそのアドレスとなりp[1]のアドレスはそのアドレスにchar型のデータ容量1バイトに対応する1を足したものになります
  446. 🌞動的にメモリを確保するということは🌞  🌞好きなタイミングでメモリをコンピュータが利用できるように解放できる🌞 ということなのです
  447. p = (char *)malloc(sizeof(char)*5);により確保されたメモリは配列変数p[0] p[1] p[2] p[3] p[4] でアクセスすることができます
  448. char p; p=(char *)malloc(sizeof(char)*100);の実行により動的に確保されたメモリに格納できるデータは文字データと決定されますがmalloc関数にはよりません
  449. malloc関数を使って確保されたメモリに文字列データを格納するには🌞必ず🌞strcpy関数を使用する必要があります
  450. malloc関数によって確保されたメモリにデータを入力しfree関数によってメモリ解放を行ってみます その1
  451. p = (char *)malloc(sizeof(char)*5);と確保されたメモリにp="neko";と文字列データを格納することはできません
  452. malloc関数を使って確保されたメモリに文字列データを格納するには🌞必ず🌞strcpy関数を使用する必要があります
  453. p = (char *)malloc(sizeof(char)*5);と確保されたメモリに文字列データを格納するにはstrcpy_s(p,5,"neko");のようにstrcpy_s関数を用います
  454. malloc関数によって確保されたメモリをfree関数を使って解放しなければコンピュータは利用できるメモリが減ってしまうためプログラムの実行速度が遅くなることがあります
  455. コンピュータの内部の世界をのぞいてみよう
  456. ちょっと休憩しています
  457. RAMとROMの違いとはなんでしょうか?
  458. コンピュータの世界の入り口
  459. ALU(算術論理演算回路)と メモリとデータをやり取りするときにデータを保存する記憶装置レジスタ
  460. コンピュータは ユーザーから与えられたデータをメモリに保存しなければ そのデータを取り扱うことができません。 命令レジスタ 命令デコーダ プログラムカウンタ 
  461. 関数を格納している先頭のメモリのアドレスを関数のポインタ変数ptfに代入すれば*ptf は関数をあらわすことになり*ptfを用いて関数を呼び出して使用することができるようになります。
  462. 関数を格納している先頭のメモリのアドレスを関数のポインタ変数ptfに代入すれば*ptf は関数をあらわすことになり*ptfを用いて関数を呼び出して使用することができるようになります。
  463. 自作関数newmadefunctionの命令文を格納している先頭のメモリのアドレスを格納する関数ポインタ変数を作製してみよう。その1
  464. 自作関数newmadefunctionの命令文を格納している先頭のメモリのアドレスを格納する関数ポインタ変数を作製してみよう。その2
  465. 関数ポインタ変数ptfに自作関数のアドレスを代入し*ptfをつかって自作関数を実行してみましょう
  466. 関数ポインタ変数ptfに自作関数のアドレスを代入し*ptfをつかって自作関数を実行してみましょう その2
  467. 関数ポインタ変数の配列をつかって複数の自作関数を実行することのメリットは自作関数が実行される順序を入れ替えることができることにあります
  468. 関数ポインタ変数の配列をつかって複数の自作関数を実行してみよう
  469. 関数ポインタ変数の配列をつかって複数の自作関数を実行することのメリットは自作関数が実行される順序を入れ替えることができることにあります
  470. constを変数宣言の前に用いて変数宣言、初期化を行うと作製された変数に格納されているデータを変更することはできません  その1
  471. constを変数宣言の前に用いて変数宣言、初期化を行うと作製された変数に格納されているデータを変更することはできません  自作関数の引数となっている変数宣言にconstをつけてみる
  472. constを自作関数の引数に設定すると自作関数内で引数に格納されている数値を変更することはできなくなります
  473. constをポインタ変数宣言の前に用いて変数宣言、初期化を行っても作製されたポインタ変数に格納されているアドレスを変更することができます 
  474. constをポインタ変数宣言の前に用いて変数宣言、初期化を行っても作製されたポインタ変数に格納されているアドレスを変更することができます その2
  475. const int *pta = &a; と記述されていても *ptaに格納されている数値データを変更することができます
  476. const int *pta = &a;と記述されて*ptaに格納されている数値データが変更できない場合を考察してみます
  477. 自作関数の引数となっているポインタ変数宣言にconstをつけてみる その1
  478. 自作関数の引数となっているポインタ変数宣言にconstをつけてみる その2
  479. 変数宣言int a;にconstが用いられてconst int a; となった場合 プログラムのどの範囲まで変数aに格納された数値は1から変更されないのでしょうか
  480. 電気回路の世界で遊んでみよう。
  481. 電球と電線とスイッチを用いて数値を表現してみよう!
  482. 参照とは変数のことでありint&型の参照変数にはint型の変数を代入することができます このときint&型の参照変数はint型の変数そのものをあらわすことになります
  483. 参照変数は参照変数を初期化した変数の管理しているメモリ領域にアクセスし続けることになります
  484. 自作関数の引数に設定された参照変数bにmain関数内で定義された変数aを代入すると変数aに格納されているデータは自作関数の操作をうけるようになります
  485. 自作関数の引数に参照変数が用いられていると変数が代入されるごとに参照変数は代入された変数そのものを表すことになります
  486. ポインタのポインタとは変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数のことですシリーズ
  487. int a[3];により生成される配列aもint a[5];により生成される配列aも同じくint[ ]型の配列aと呼ばれます
  488. おさらい ポインタ変数を使ってデータを格納してみましょう
  489. 異なるポインタ変数を一度に大量に作製してみよう
  490. char *a[3] = { "a","b","c" };が実行されると異なるポインタ変数a[0],a[1],a[2]が生成されます その様子をじっくり観察してみましょう
  491. char*型の配列宣言char* a[3];は初期化される必要があり 初期化されないで場合 配列変数a[0][0],a[0][1]‥は配列変数として機能しません
  492. おさらい(^_-)-☆ 配列変数a[i]はポインタ変数aを用いてa[i]=*(a+i); で表されます a+iはポインタ演算と呼ばれます
  493. 導入編 2次元配列の配列変数のアドレスを格納しているポインタ変数はどのように表されるのでしょうか?
  494. 変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数(ポインタのポインタ)ってなんですか?
  495. char**型のポインタ変数を用いて 変数のアドレスを格納するポインタ変数のアドレスをメモリに格納してみます
  496. char*型とchar**型は異なる型でありchar*型のポインタ変数にchar**型のポインタ変数を逆にchar**型のポインタ変数にchar*型のポインタ変数を代入することはできません
  497. char型の変数i、 char*型のポインタ変数j、 char**型のポインタ変数kは異なる型の変数であり それぞれ代入できるデータのタイプが決まっています
  498. 2次元配列aのaは2次元配列の配列変数の先頭の配列変数a[0][0]のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数となります
  499. 2次元配列の配列変数a[0][0]は*a[0],**a、a[0][1]は*(a[0]+1),*(*a+1)、a[1][1]は*(a[1]+1),*(*(a+1)+1),*(a+1)[1]で表現できます
  500. char型の変数のアドレスを格納するポインタ変数のアドレスを格納することのできるポインタ変数にはchar(*)[3]型のポインタ変数とchar **型のポインタ変数があります
  501. char (*a)[3];はaのchar(*)[3]型のポインタ変数宣言です aには2次元配列宣言char b[😊][3];により生成される2次元配列bのアドレスを格納するbを代入することができます 
  502. char (*a)[3];により生成されるポインタ変数aにはchar b[😊][3]:より生成される先頭の配列変数のアドレスを格納するポインタ変数*bのアドレスを格納するポインタ変数bを代入できます
  503. char** k;により生成されるポインタのポインタ変数kにはポインタ型の配列宣言char *a[3];のaを代入でき、2次元配列aのアクセスしているメモリに2次元配列kでアクセスできるようになります
  504. 2次元配列a[2][4]のaはchar(*)[4]型のポインタ変数でありchar**型のポインタ変数ではありません ですのでchar**型のポインタ変数bにaを代入することはできません
  505. char**型のポインタ変数pを用いて動的にメモリを確保してみよう💖
  506. char**型のポインタ変数pを用いて動的にメモリを確保してみよう💖
  507. char **p ; p= (char**)malloc(sizeof(char)*100);はchar**型のポインタ変数pに代入できるようmalloc関数を(char**)でキャストしています
  508. char*p; p = (char *)malloc(sizeof(char) * 100);を実行した場合は100バイト分のメモリが確保されます
  509. sizeof演算子はキャラアスタリスク型char*に作用することができsizeof(char*)は4を表します つまりchar*は4バイトのデータ格納容量をもちます
  510. char*p; p = (char*)malloc(sizeof(char*)*100);を実行した場合は400バイト分のメモリが動的に確保されます
  511. char**p; p = (char**)malloc(sizeof(char*)*100);を実行した場合は400バイト分のメモリが動的に確保されます
  512. char**型のポインタ変数pを用いて動的に2次元配列的にメモリを確保してみよう💖
  513. char** a; a=(int**)malloc(sizeof(char*)*2);の実行により8バイトメモリが確保されます そのメモリの先頭のアドレスはchar**型のポインタ変数aに格納されます
  514. char**型のポインタ変数を用いればmalloc関数を2度用いることにより2次元配列的にメモリを確保することができ文字データを代入することができます
  515. int**型のポインタ変数pを用いて動的に2次元配列的にメモリを確保してみよう💖
  516. int **a; a=(int**)malloc(sizeof(int*)*2);が実行されると8バイト分メモリが確保されます そのメモリの先頭のアドレスはint**型のポインタ変数aに格納されます
  517. int**型のポインタ変数を用いればmalloc関数を2度用いることにより2次元配列的にメモリを確保することができます
  518. char** a; a=(int**)malloc(sizeof(char*)*2);の実行により8バイトメモリが動的に確保されます それらのメモリを解放してみます
  519. char**型のポインタ変数を用いてmalloc関数を2段階用いることにより2次元配列的にメモリを確保することができます それらのメモリは2段階free関数を用いて解放することができます
  520. char**型のポインタ変数を用いてmalloc関数を2段階用いることにより2次元配列的にメモリを確保することができます それらのメモリを2段階free関数を用いて解放してみます
  521. int**型のポインタ変数を用いてmalloc関数を2段階用いることにより2次元配列的にメモリを確保することができます それらのメモリを2段階free関数を用いて解放してみます
  522. 実体とはメモリに格納されたデータのことです 変数は実体をあらわすことになります データを格納する基本型、データ型の変数の実体はデータを、アドレスを格納する参照型の変数の実体はアドレスとなります
  523. 実体とはメモリに格納されたデータのことです 変数は実体をあらわすことになります