【C言語の入門】基本的に覚える変数~ポインタまでわかりやすくご紹介

C言語は、数あるプログラミング言語の中でも、最も基本的なプログラミング言語です。他のプログラミング言語の多くは、C言語を発展させたり、派生して考案されています。 C言語を学ぶことで、プログラミングの最も基本的な考え方がわかります。そしてコンピュータの仕組みに詳しくなり、その知識は、他の言語を学ぶ上でも有用なものとなります。 ここでは、簡単なゲームの制作を通して、基本的なC言語プログラミングを学びます。 また、C言語を学ぶ上で誰もがつまずく、「ポインタ」についても学んでいきましょう。 それでは、プログラミング学習の最初の一歩!を始めましょう。

コンピュータの仕組み

その前に、コンピュータの基本的な動きについて、学びましょう。 人間を例にして考えます。私達人間が、おいしそうなカレーライスを見て、「おいしそう!」と言ったとします。 そのとき、どんな処理が行われているでしょうか?  1.おいしそうなカレーライスを目にする  2.脳が過去の記憶から、これはカレーライスだと判断する  3.脳が「おししそう!」声を発するように命令する  4.口から「おいしそう!」と声がでる。 こんな感じでしょうか?これを、コンピュータに置き換えてみます。 1.おいしそうなカレーライスを目にする  これは、コンピュータに対する入力(情報が入ってくる)ということになります。コンピュータの入力機器といえば、キーボードやマウス、カメラや、ハードディスクからの読み出しがそれにあたります。 2.脳が過去の記憶から、これはカレーライスだと判断する  記憶にあたる装置をメモリと呼んでいます。そして、カレーライスだと判断するのは、CPU(Central Processing Unit=中央処理装置)と呼ばれる装置の役割です。 3.脳が「おししそう!」声を発するように命令する  これもCPUの働きです。 4.口から「おいしそう!」と声がでる。  こちらは、出力(情報を人間が認識できる形で表す)となります。コンピュータの出力装置は、ディスプレイ、スピーカー、プリンタ、ハードディスクへの書き込みなどがそれに当たります。 この様に、コンピュータも人間と同じく、何か外から情報を得て、判断し、何かをアウトプットします。 何を入力して、どういう判断をし、何を出力するのか、これを決めるのが、コンピュータプログラムということになります。

C言語入門 〜 ゲームを作ってみよう

さて、それでは早速、C言語のプログラミングを始めましょう。今回は、簡単なゲームを作ってみます。これを読んでくださっている方の中には、ゲームプログラマーになりたい!と思っている方もいるでしょうか。私も子供の時から、ゲームを作りたいと思い、プログラミングを勉強しました。 何かを作りたい!という気持ちはとても大事です。そこから、そのためにはどうしたら良いか?と考え、調べて実践するうちに、スキルアップしてくからです。 今回作るゲームは、「数当てゲーム」です。ルールは簡単で、隠された番号を当てるというものです。隠された番号は、5に決まっていることにします。 まずは日本語で、このゲームの処理を書いてみます。  1.数値の5を、answerと名付けてメモリに保存する  2.「Guess What? >」 と表示  3. キーボードから、数値を入力して、inputと名付けてメモリに保存する  4. answerとinputを比較して、同じだったら、「correct!」と表示してプログラム終了、inputが大きかったら、「High」と表示、inputが小さかったら「Low」と表示する。  5. 2〜4を5回繰り返し、正解できなかったら、「Lose...」と表示してプログラムを終了する。 動作例は、このような形になります。  Guess what? > 2 ←ここで2を入力  Low  Guess what? > 6  ←ここで6を入力  High  Guess what? > 5  ←ここで5を入力  Correct! 上に書いた日本語の処理を、C言語に置き換えれば、プログラムは完成です。とはいえ、これだけでも、いろいろな処理が行われていますので、段階的に進めていきましょう。

C言語入門その1 基本形

まずは、何もしないプログラムを書きます。 こちらを見てください。

本稿で紹介するプログラムは、すべてrepl.itで書いたものへのリンクを付けています。 repl.itは、ブラウザ上でプログラムを動作させることができる、とても便利なサイトです。 「run」を押すことで実行できます。また、プログラムを自由に編集して、試すこともできます。 いろいろ触ってみましょう。

さて、C言語のプログラムは、すべて「関数」の中に書く必要があります。関数とは、一連の処理をひとまとめにして、名前をつけたものです。名前をつけておいて、あとからその名前を「呼ぶ」ことによって、処理が動くんですね。 中でも「main」という名前の関数は特別で、プログラム内に必ず1つ作る必要があります。 プログラムが実行された際、最初に必ずmain関数が呼ばれることになっているからです。

main関数の書き方は、上記の通りです。今はとりあえず深く考えずに、こう書くものなんだと思っておいてください。

C言語入門その2 文字列表示

では次に、画面に表示する部分だけを作ってみましょう。 日本語で書くと、下記のようなプログラムです。 1. 「Guess What? >」 と表示 2. 「correct!」と表示 3. 「High」と表示 4. 「Low」と表示 5. 「Lose...」と表示

1行目の、#include <stdio.h> はキーボードからの入力と、画面への文字出力を使いますという意味です。 外部の機能を呼び出す場合は、#include によって、その機能を指定する必要があります。 /* と */ で囲まれた部分は、コメント文です。プログラムとしては解釈されないので、プログラムの説明などを書きたい時に使います。 main関数の中に、printf(....); という行があります。printfは、<stdio.h>の中にある関数の1つで、画面に文字を表示します。 printf(“Hello”); と書けば、「Hello」と表示されるわけです。ここで、「Hello」をダブルクオーテーション( “ )で囲いました。ダブルクオーテーションで囲った文字は、プログラムのコードではなく、そのプログラムが内部で使う文字列(=文字が連なったもの)として扱われます。 printfで表示する文字列の最後に、\n とあるのは、ここで改行してくださいという意味です。 各 printf(...); の後ろにセミコロン「;」がありますが、これは1つの命令の終わりを意味しますので、忘れずにつけてください。 これで、まずは表示する部分が出来ました。

C言語入門その3 キーボードからデータを読み取る

次に、キーボードからの入力をしてみます。そして、キーボードからちゃんと読み取れているか確認するため、読み取った数値を表示するようにしましょう。 先ほどの日本語プログラムに書き加えて、 1. 「Guess What? >」 と表示 2. キーボードから、数値を入力して、inputと名付けて覚える 3. 「Your Guess: 」と表示し、その後ろに input の中身を表示 4. 「Correct!」と表示 5. 「High」と表示 6. 「Low」と表示 7. 「Lose...」と表示 こんなプログラムです。 C言語では、次のようになります。

main関数の最初に、int input; とあるのは、これからinputと言う名前でメモリを使います、inputは整数(int)として扱います、という意味です。 このように、プログラムが扱うメモリは、最初に名前と型(整数、文字など)を指定して宣言します。これを「変数」と言います。 なぜ変数を使うのでしょうか? それは、入力される値が、プログラムを実行してみないとわからないからです。今回の例では、ゲームのプレイヤーがキーボードから何の数字を入れるかは、その時になってみないとわからない、ということですね。 キーボードから何かを入力するには、scanf関数を使います。scanfの書き方は、  scanf( 制御文字列, & 変数名 ); です。 制御文字には、入力を整数として扱うなら、”%d” と書きます。他には、”%s”とすると文字列として読み取ることもできます。 変数名は、読み取ったデータの格納先を指定します。ここで、変数名の前に「&」を書くのを忘れないでください。なぜ「&」が必要なのかは、あとで説明します。 入力した値を表示するには、printfを使います。printfは、単なる指定された文字列だけじゃなく、変数の中身も表示できます。  printf( "Your Guess: %d", input); こうすると、%dの位置に、inputの内容が表示されます。

C言語入門その4 条件分岐

では続いて、正解かどうかを判定する部分を作りましょう。 1. 数値の5をanswerと名付けてメモリに保存する 1. 「Guess What? >」 と表示 2. キーボードから、数値を入力して、inputと名付けてメモリに保存する 3. 「Your Guess: 」と表示し、その後ろに input の中身を表示 4. answerとinputを比較して、同じだったら、「correct!」、inputが大きかったら、「High」、inputが小さかったら「Low」と表示する。 7. 「Lose...」と表示 C言語では、下のようになります。

mainのはじめに  int answer = 5; と書きました。 これは、answerという名前の変数を用意し、その中に数値の5を入れる。という意味です。イコール記号「=」は、数学では「等しい」という意味ですが、C言語では、「変数に値を入れる」という意味になります。これを「代入」といいます。 if( … で始まっているところが、答えがあっているかの判定部分です。カッコの中に、条件文を書きます。値が等しいかを調べるには、  if( answer == input ) このように書きます。先ほど、「=」は「等しい」という意味ではないと説明しましたが、「等しい」を意味するには、「==」とイコール記号を2つつなげて書きます。 if( 条件 ) の後ろに、{}で囲って処理を書くと、その中は、条件に合致した時だけ実行されます。 上記 repl.it のリンクを実行してみて、いろんな数字を入力してみてください。 条件判定がうまく動いていることがわかると思います。 だいぶゲームらしくなって来ましたね。

C言語入門その5 処理の繰り返し

では最後に、5回繰り返して、正解できなければ負けとする処理を追加します。 1. 数値の5をanswerと名付けて覚える 1. 「Guess What? >」 と表示 2. キーボードから、数値を入力して、inputと名付けて覚える 3. 「Your Guess: 」と表示し、その後ろに input の中身を表示 4. answerとinputを比較して、同じだったら、「correct!」と表示して終了、inputが大きかったら、「High」と表示、inputが小さかったら「Low」と表示する。 7. 2,3,4を5回繰り返したら、「Lose...」と表示して終了 プログラムは、この様になります。

繰り返し処理をするには、for文を使います。 for文の書き方は、  for( 最初に行う処理; 終了条件; 繰り返す時に行う処理 )  {   繰り返し処理の内容...  } です。  for( i = 0; i < 5; i++ )  {  } このように書くと、i = 0から始めて、繰り返す度に i に1を足します(i++は、iに1を足す、という意味)。 1回の処理を終える度に、 i<5 になっているかを確認し、これが成り立つ場合は再度繰り返し、成り立たなければ繰り返し終了、となります。 よって、iは0,1,2,3,4と変化して、5になったところで、i<5ではなくなるので、繰り返しが終わります。 すると、処理を5回繰り返すことになりますね。 入力された答えが正解だった場合は、「Correct!!」と表示したあと、直ちにプログラムを終了します。プログラムを終了するには、 exit(0); と書けばOKです。 以上で、目的とするプログラムが書けました! できたプログラムを、自分で変更してみてください。(repl.it上でできます) 表示を変えてみたり、答えを5でない別の数にしたり、繰り返し回数を変えてみると、より理解が深まると思います。

C言語入門その6 メモリアドレス(ポインタ)を扱う

さて、次で最後になりますが、保留にしてあった、 scanf(“%d”, &input); の「&」の意味について、解説します。 まず、関数のカッコ内に書くパラメータ(引数と言います)が、どう扱われているかを理解する必要があります。 例えば、変数 a と、関数 func() があったとして、 func( a ); と書いた場合、a がそのまま func()に渡される訳ではありません。 a が一度別の場所にコピーされて、それがfunc内で使われます。

コピーされているので、呼び元の a の値を書き換えることはできません。 scanfは、キーボード入力を、与えられた変数にセットする関数なので、変数の値を書き換えないといけません。これを実現するためには、scanfに渡すのは変数の値ではなく、変数の「アドレス」を渡す必要があります。 「アドレス」とは、メモリの場所に付けられた番号のことです。 例えば  int a;  scanf(“%d”, &a); というプログラムを実行した場合、まず、適当なメモリアドレスに、変数a用の領域が確保されます。 仮にアドレス1番に、変数aが割り当てられたとすると、scanfには、この1という数値が渡されます。 そしてscanfは、1のアドレスに、キーボードから入力した数値を入れます。 こうして、scanf関数の中で、呼び元の変数 a の内容を書き換えることができます。 その、「変数aのアドレス」を意味するのが、「&a」ということになります。

では試しに、受け取った変数に1をセットする関数を作ってみましょう。  void set_one(int* a)  {   *a = 1;  } int* と書くと、int型変数へのアドレスという意味になります。 これを int型へのポインターといいます。 そして、ポインタの指す先に値を入れるには、 *a = 1; このように書きます。 set_one()を呼び出すには、  int a;  set_one(&a); となります。

「*」と「&」の使い方がちょっとややこしいですが、間違えた場合は、エラーが出ますので、何度もやっているうちに理解できますよ。 ポインタについては、まだまだ奥が深いのですが、本稿では、ここまでに留めておきます。

おわりに

以上、C言語の基礎から、ポインタの扱いまでを見てきました。 まだまだ説明したりないところはあるのですが、自分で動かしてみて、エラーと格闘しながら、思い通りのプログラムができあがるまで、やってみてください。その経験が、プログラマーとしてのスキルアップにつながっていきます。 この記事が、学習を始めるにあたっての第一歩となれば、幸いです。

62 件のコメント

  • Does your website have a contact page? I’m having problems locating it but, I’d like to shoot you an e-mail. I’ve got some recommendations for your blog you might be interested in hearing. Either way, great blog and I look forward to seeing it develop over time.

  • Wonderful beat ! I would like to apprentice even as you amend your website, how could i subscribe for a weblog web site? The account aided me a acceptable deal. I have been a little bit familiar of this your broadcast provided vivid transparent idea

  • hey there and thank you for your info – I have certainly picked up anything new from right here. I did however expertise some technical issues using this website, as I experienced to reload the site many times previous to I could get it to load properly. I had been wondering if your web host is OK? Not that I’m complaining, but slow loading instances times will sometimes affect your placement in google and could damage your quality score if ads and marketing with Adwords. Anyway I am adding this RSS to my email and can look out for a lot more of your respective exciting content. Make sure you update this again soon..

  • I would like to convey my passion for your kind-heartedness giving support to those individuals that really want help on the area of interest. Your personal commitment to getting the solution along appears to be really helpful and has frequently allowed individuals much like me to attain their pursuits. Your amazing helpful help means much to me and a whole lot more to my office colleagues. Warm regards; from everyone of us.

  • Valuable information. Lucky me I discovered your website accidentally, and I am shocked why this accident didn’t came about earlier! I bookmarked it.

  • Nice post. I was checking continuously this blog and I’m impressed! Extremely helpful info specially the last part 🙂 I care for such info much. I was seeking this certain information for a very long time. Thank you and good luck.

  • It’s perfect time to make a few plans for the future and it is time to be happy. I’ve learn this post and if I could I desire to counsel you some interesting things or suggestions. Perhaps you can write next articles regarding this article. I desire to learn more things approximately it!

  • My husband and i have been now happy Chris could complete his researching through the ideas he came across from your web pages. It’s not at all simplistic to just choose to be releasing techniques which other folks might have been trying to sell. And now we consider we’ve got the writer to be grateful to because of that. The most important explanations you have made, the straightforward blog navigation, the relationships you will give support to create – it is all powerful, and it is making our son in addition to our family understand the concept is amusing, which is certainly especially mandatory. Many thanks for the whole lot!

  • Undeniably believe that that you stated. Your favourite justification seemed to be on the net the simplest factor to take into accout of. I say to you, I certainly get irked while people think about issues that they just do not understand about. You controlled to hit the nail upon the top and also defined out the entire thing with no need side-effects , folks could take a signal. Will likely be back to get more. Thanks

  • Hi there just wanted to give you a quick heads up. The text in your post seem to be running off the screen in Firefox. I’m not sure if this is a formatting issue or something to do with browser compatibility but I thought I’d post to let you know. The layout look great though! Hope you get the issue fixed soon. Cheers

  • Undeniably believe that which you stated. Your favorite reason seemed to be at the internet the easiest factor to remember of. I say to you, I definitely get irked at the same time as other folks consider concerns that they plainly don’t know about. You controlled to hit the nail upon the highest and defined out the entire thing without having side-effects , people can take a signal. Will likely be back to get more. Thanks

  • Great – I should definitely pronounce, impressed with your website. I had no trouble navigating through all the tabs and related info ended up being truly simple to do to access. I recently found what I hoped for before you know it at all. Reasonably unusual. Is likely to appreciate it for those who add forums or something, site theme . a tones way for your client to communicate. Excellent task..

  • I have to show my thanks to you for bailing me out of this incident. Because of searching throughout the world-wide-web and meeting recommendations that were not productive, I assumed my entire life was gone. Being alive devoid of the approaches to the issues you’ve fixed through your entire site is a serious case, as well as ones that could have negatively damaged my entire career if I had not come across your website. Your personal mastery and kindness in dealing with the whole thing was valuable. I don’t know what I would’ve done if I had not come upon such a stuff like this. It’s possible to now look ahead to my future. Thanks so much for your skilled and effective guide. I will not be reluctant to refer your blog to anyone who desires guidance on this topic.

  • Hey! This is kind of off topic but I need some help from an established blog. Is it very hard to set up your own blog? I’m not very techincal but I can figure things out pretty fast. I’m thinking about setting up my own but I’m not sure where to begin. Do you have any ideas or suggestions? Many thanks

  • I’m not sure where you are getting your information, but great topic. I needs to spend some time learning more or understanding more. Thanks for magnificent info I was looking for this info for my mission.

  • This design is wicked! You most certainly know how to keep a reader entertained. Between your wit and your videos, I was almost moved to start my own blog (well, almost…HaHa!) Great job. I really loved what you had to say, and more than that, how you presented it. Too cool!

  • There are some attention-grabbing deadlines on this article however I don’t know if I see all of them heart to heart. There is some validity however I’ll take hold opinion until I look into it further. Good article , thanks and we wish extra! Added to FeedBurner as effectively

  • Somebody essentially help to make seriously articles I would state. This is the first time I frequented your web page and thus far? I amazed with the research you made to create this particular publish extraordinary. Great job!

  • I would like to thank you for the efforts you have put in writing this site. I am hoping the same high-grade web site post from you in the upcoming also. In fact your creative writing abilities has encouraged me to get my own blog now. Really the blogging is spreading its wings rapidly. Your write up is a good example of it.

  • Thanks for another excellent post. Where else could anyone get that kind of information in such a perfect way of writing? I have a presentation next week, and I am on the look for such information.

  • Whoa! This blog looks exactly like my old one! It’s on a completely different topic but it has pretty much the same page layout and design. Superb choice of colors!

  • I’m really enjoying the theme/design of your weblog. Do you ever run into any internet browser compatibility problems? A couple of my blog audience have complained about my website not operating correctly in Explorer but looks great in Safari. Do you have any advice to help fix this problem?

  • Hey! Do you know if they make any plugins to assist with SEO? I’m trying to get my blog to rank for some targeted keywords but I’m not seeing very good gains. If you know of any please share. Appreciate it!

  • hlqokx,Thanks for ones marvelous posting! I actually enjoyed reading it, you will be a great author.I will always bookmark your blog and will fqvgmsriqd,come back from now on. I want to encourage that you continue your great writing, have a nice afternoon!

  • Hey There. I discovered your weblog the usage of msn. This is a very well written article. I will be sure to bookmark it and come back to read more of your useful info. Thank you for the post. I’ll definitely comeback.

  • I know this if off topic but I’m looking into starting my own weblog and was curious what all is required to get set up? I’m assuming having a blog like yours would cost a pretty penny? I’m not very web savvy so I’m not 100 sure. Any suggestions or advice would be greatly appreciated. Many thanks

  • qaekvxxtwaq,Definitely believe that which you said. Your favourite justification appeared to be on the net the simplest thing to remember of.

  • pzscpjcoyd,If you are going for best contents like I do, just go to see this web page daily because it offers quality contents, thanks!

  • Attractive part of content. I simply stumbled upon your site and in accession capital to assert that I get actually loved account your blog posts. Any way I will be subscribing on your augment or even I success you get admission to persistently fast.

  • Hi! I could have sworn I’ve been to this site before but after checking through some of the post I realized it’s new to me. Anyways, I’m definitely happy I found it and I’ll be bookmarking and checking back frequently!

  • I’m not sure where you are getting your information, but great topic. I needs to spend some time learning more or understanding more. Thanks for wonderful information I was looking for this information for my mission.

  • I have been browsing online more than 3 hours today, yet I never found any interesting article like yours. It’s pretty worth enough for me. In my opinion, if all webmasters and bloggers made good content as you did, the internet will be much more useful than ever before.

  • Hi there! Quick question that’s totally off topic. Do you know how to make your site mobile friendly? My website looks weird when browsing from my iphone4. I’m trying to find a template or plugin that might be able to fix this problem. If you have any suggestions, please share. Thanks!

  • Hmm it looks like your website ate my first comment (it was super long) so I guess I’ll just sum it up what I submitted and say, I’m thoroughly enjoying your blog. I too am an aspiring blog blogger but I’m still new to the whole thing. Do you have any tips for novice blog writers? I’d certainly appreciate it.

  • We’re a group of volunteers and starting a new scheme in our community. Your site provided us with valuable info to paintings on. You’ve performed a formidable job and our whole neighborhood shall be thankful to you.

  • I just could not depart your site prior to suggesting that I actually enjoyed the standard info a person provide for your visitors? Is gonna be back often in order to check up on new posts

  • I have been exploring for a bit for any high-quality articles or weblog posts in this sort of area . Exploring in Yahoo I finally stumbled upon this web site. Reading this information So i am glad to exhibit that I’ve a very excellent uncanny feeling I found out exactly what I needed. I such a lot for sure will make certain to do not disregard this web site and provides it a look regularly.

  • I love your blog.. very nice colors & theme. Did you create this website yourself? Plz reply back as I’m looking to create my own blog and would like to know wheere u got this from. thanks

  • Hello, you used to write great, but the last few posts have been kinda boring?K I miss your tremendous writings. Past several posts are just a little out of track! come on!

  • Hey There. I discovered your weblog the usage of msn. That is an extremely smartly written article. I will make sure to bookmark it and return to read extra of your helpful information. Thanks for the post. I’ll definitely return.

  • I like what you guys are up also. Such intelligent work and reporting! Carry on the excellent works guys I’ve incorporated you guys to my blogroll. I think it will improve the value of my web site 🙂

  • Hey there just wanted to give you a quick heads up. The words in your article seem to be running off the screen in Internet explorer. I’m not sure if this is a formatting issue or something to do with web browser compatibility but I figured I’d post to let you know. The style and design look great though! Hope you get the issue solved soon. Cheers

  • Please let me know if you’re looking for a article writer for your weblog. You have some really great articles and I believe I would be a good asset. If you ever want to take some of the load off, I’d absolutely love to write some articles for your blog in exchange for a link back to mine. Please shoot me an email if interested. Thanks!

  • I’m impressed, I need to say. Actually rarely do I encounter a blog that’s both educative and entertaining, and let me inform you, you’ve gotten hit the nail on the head. Your idea is excellent; the problem is one thing that not sufficient individuals are speaking intelligently about. I am very glad that I stumbled across this in my search for one thing referring to this.

  • I’ve recently started a web site, the info you offer on this web site has helped me tremendously. Thanks for all of your time & work.

  • Good post however , I was wanting to know if you could write a litte more on this subject? I’d be very grateful if you could elaborate a little bit further. Cheers!

  • Sweet blog! I found it while surfing around on Yahoo News. Do you have any suggestions on how to get listed in Yahoo News? I’ve been trying for a while but I never seem to get there! Cheers

  • whoah this blog is wonderful i love studying your posts. Keep up the great paintings! You recognize, many people are searching around for this information, you can help them greatly.

  • コメントを残す

    メールアドレスが公開されることはありません。