【C言語】ポインターとはなんぞ?

ポインターとは?

→値の代わりにアドレスにアクセスできる変数だよ。

ハイ終わり!!あと宿題な!!ジャンプ買ってくる!!

 

・・・・さて?上記説明だけで「ポインター完全に理解した」

と言える人はツワモノだわ。色々教えて頂きたいですわ。

買ってきたジャンプあげるから。。

 

C言語最大にして、これさえ理解すれば大抵の言語は怖くないとまで思える、概念「ポインター

 

そもそもこの記事を書こうと思ったきっかけは?

・だいたいここで行き詰まる。

・「ポインターわかんねですよ・・」と同じチームのC言語やり始めた若い子がいた。

ツイッターポインターの理解に関して意味不明なことを言ってるツイートがあったから。

 

そんなに難しいかなぁ・・正直最初意味わからなかった覚えあるけど、使ってたら体で覚えた俺からすると、慣れですよ慣れ。としか思えない。。

ただ確かに説明するのはめっちゃ難しい。

これは間違いない。

 

というわけで俺はこう覚えた!というポインタの覚え方?理解の仕方?を一つ公開しようかと思う。

  • そもそも何がわからんのだ!
  • 理解する上で何が必要か!
  • まとめて・・ポインターとは?

こんな論調で進めていこうかと思う。

 

  • そもそも何がわからんのだ!!

 何がややこしいのか?原因を考えてみた!

  1. 変数との違いがわかんねぇ。。
  2. 説明が難しいよう。。
  3. プログラムが読めねぇ・・

といったところかなぁ。。

まず概念としてのポインターの説明は「値の代わりにアドレスにアクセスできる変数」でほんとに終わってしまう。

たとえ話としては色々あって

・住所の書かれたメモを渡す

・変数が箱だとすれば箱に書かれたNoがポインター

まあ、色々。。

間違ってないんだけど、ふわっとしてる。

確かに説明色々みた覚えあるけど、わかった感はあるけど理解はできない記憶だなぁ。。個人的に

 

  • 理解する上で何が必要か!

はっきり言って、C言語のことをずっと追いかけてもしょうが無い。視点としてはズバリ2つ必要。

  1. モリー(RAM)というものがPCやマイコンには存在する。
  2. そもそもプログラムの変数はどのようにPCやマイコン上では処理されるのか?

じゃあ、1.から

PCにはメモリーというものが存在する。

ナンノコッチャ?と思う人は

https://akiba-pc.watch.impress.co.jp/docs/dosv/695135.html 

 あたりを見ると良い。

モリーの役割として、プログラムやデータを一時的に置いておく役割とあるけど、まさにこの通り。

ソフトが起動したら、必ずメモリーに必要なものが置かれる。変数もその一つと思ってもらって問題ない。

 

ただ無造作に置いてしまうと良くない。

必要なときに必要なものを引き出せないということになる。

そこで出てくるのがポインターを語る上で必ず出てくる言葉

 

アドレス。

 

「値の代わりにアドレスにアクセスできる変数」

のアドレスは具体的にはPCのメモリー内部のアドレスを指す。

 

「PCのメモリー内部のアドレス」 これ大事!

 

そして話は2.に移る。

ここでメモリーの中身の話に移っちゃいます。頑張って付いてくるべし

https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/prog1/08-02.html 

 このあたりがとてもわかり易いかと。。

 

PCメモリー内部のイメージは以下の図の形になる。

 

f:id:tatekarito:20200112005320j:plain

大前提としてメモリーというものは

1bitずつアドレス(≒位置No)が振られている

というのを頭において欲しい。

 

この図で言うと一番左が始まりのアドレスになる。0x0という値から始まって

1番目のbitが0x0。2番目のbitが0x1。3番目のbitが0x2という要領で。

上部は4bitずつ数値を書いている。

 

例えば char str ="a";

とか宣言してこのメモリーに置いとくとすると

f:id:tatekarito:20200112005419j:plain

緑色の部分に変数strの値を置くために、PCのメモリー内部に場所が確保される。

char型は8bitの大きさのため0x0 - 0x7までの部分を使用することになる。この部分にstrに入る値を置くのだ。

変数を宣言することでメモリーに陣地が取れると思えばよいかと思う。

 

ここまで理解できるだろうか?わからなければ何度も図を見比べながら反芻しよう。ここまでの知識がポインター理解のための基礎となる。

 

さてここからが本題。結局ポインターってなんなのさ?

もう一度この図を見て欲しい。

f:id:tatekarito:20200112005419j:plain

char str ="a";

を実行したときのPCメモリー内部の様子である。ではこれを

char *str;

としたときどうなるのだろうか?

f:id:tatekarito:20200112011909j:plain

こんな感じになる。値が入ってないので、nullと一旦した。

(正確に言えばこの値が入るとは限らないが、今回は一旦無視。気にしたら負け)

 大事なのはメモリーに場所が確保されただけ!

という点である。

 

そしてもしprint関数で*strを表示したら値は

0x0と

返ってくる。そう、ポインターとは「値の代わりにアドレスにアクセスできる変数」と説明したが、その実態は

PCのメモリー内部に確保した場所の最初のアドレス(先頭アドレス)を返す。

が答えになる。

 

そう。ポインターと変数は全く意味合いが違うことがおわかりいただけただろうか?

たまたま変数でこの説明をしたが

char str[128];

とかだと以下のようにメモリーが確保される

f:id:tatekarito:20200112013141j:plain

char str[0];が黄色、char str[1];が黄緑、char str[2];が緑

char str[3];が青といった形でメモリーの場所を確保していく。

注目すべきは

char *str; と

char str[0]; が

PCのメモリー内部に確保した場所の最初のアドレス(先頭アドレス)を指す。

 ということ。この考え方はメチャ大事。

これに気づければほぼポインターを理解したと言っても良いかもしれない。

 

いかがでしょ?俺はこんな感じでポインター理解したけど、

是非ここは、わかるorわからないとか、

お前は間違っている!!とか

クソ野郎が!!とか、是非意見などが欲しい。

 

とりあえず身の回りでポインターわかんねぇ・・と言ってるチームの同僚にはチャンスが有ればここで説明してみよう・・。理解されるのだろうか??

 

最後の最後に。新人時代C言語の理解を深めるためお世話になったサイトを敬意を込めてご紹介しておこう。

https://9cguide.appspot.com/ 

 では!!

組み込み業界ってどんな業界?

実は事前にtwitterでどんなブログで書いてほしいことを募集していた。

その中のお題の一つ。

「業界的なことを知りたい」

という話があった。難しいことはわからんが、知っている限りのことを書いてみよう。

  • 組み込み業界って何?

めちゃ簡単に言うとマイコンを使用した機器を扱う仕事は大体このカテゴリに入ると思う。じゃあ、

 

マイコンって何?

 

という疑問が出るが、ここはまた今度に致しましょう。これ話すとそれだけでブログネタになるんで。

マイコンは機械の中にちっちゃいPC(パソコン)入ってると思ってくれたら良いぞ!

具体的な例としては

  1. 洗濯機/冷蔵庫等の家電
  2. 携帯電話の中身
  3. 自動ドア等のセンサー
  4. IOT関係する機器

 まあ色々ある。特に上記の中でもIot関係は結構言いたいことあるけど、まあこれもいずれ!

  • この業界どうなん?儲かってるの?

うん、結構儲かってる感じがする※個人の感想です。

なんでそんな事言えるかって?

 

求人の多さ

2018年10月の転職求人倍率を発表。10月は1.68倍(前年同月差 ▲0.20) | プレスリリース | リクルートキャリア - Recruit Career

 

2018年10月時点の求人倍率

とあるエージェントで職種別での 求人倍率

建設エンジニア (4.44倍)

組込・制御ソフトウエア開発エンジニア (4.23倍)

インターネット専門職 (4.09倍) が高い

とあった。オリンピックでめちゃ需要が伸びてる建設エンジニアに負けない求人の多さ、、これは正直びっくりした。お金なきゃ仕事なきゃ、求人なんかしないから、

それなりには儲かってる産業なのは間違いないと思う。

 

技術進化(みんなが安くボードを触れる環境になる)の速さ

Raspberry Piの出現は衝撃だと思う。組み込み業界でLinux乗るマイコンなんて限られてたし、そんな安くなかった(知る限りね。。)。それが、5~6000円で買えるのはすごい。資料も多いし。

これで圧倒的にインターネットに繋げやすくなったのは間違いないと思っている(ネットにつなごうとする発想が安易にできるようになったのも含めて)。

最近はAWSでゴニョゴニョしたら、組み込み機器とつながってデータ取ったりできるらしい。。すまんもう追いつけない。。知ってたら教えて・・エロい人・・今週のジャンプ、アゲルから・・・

そんな感じで今までジメジメしてた組み込み業界が一気にスターダムにのし上がる可能性をこの技術進化?(まあ、正確に言うと違うのかもしれんが・・)の速さは感じさせる

 

  • この業界、なにしてるの?

ここでは組み込みの特徴をあげて置こう。特にソフトウェアから見たときの感想になるけど。。

 

ソフト/ハード両方の知見が必要

Raspberry Piで組み込み業界のHelloWorld、Lチカやろうとすると、普通にやったら、LEDと抵抗をブレッドボードで組んで、それからGPIOのどこで操作するか決定して、レジスター叩くということをしないとイケない。(他にも色々手抜きする方法あるけどw)

やはりちゃんとしようと思うと以下の知識・理解が必要になる

  1. 電気回路の知識
  2. レジスターの知識
  3. GPIOなどPIN配置の知識
  4. マイコンの知識
  5. C言語(Python)の知識

まあ、俗に言うミドルとかアプリ層とかやるならその限りではないけど、基本的には回路図読んで、レジスター表見て、適切な設定にして、オシロで波形確かめるような業界なので当然のように電気系統の知識・知見が欠かせなくなってくる。

デバッグするときもハードに疑いがあるときだってある。それを見つけるのはソフト屋の仕事だったり・・はぁ、めんどうな!!と思う事が多い。

そして多分組み込み入門最大の難関だと思う。ソフトで言語使えればオッケーの世界じゃないからね。

 

何するにもハードがいる

ソフトだけでデバッグできると思った?残念、ハード無いとまーーーーできない!!

シミュレーターなんて組み込み開発で作らないし(任天堂DSとかのゲーム機とか、スマートフォンだとかはまあ、まだあるかも?)、もともと専用性に特化したもの多いから、

ハードがないとソフトが動くかなんて全くわからないといっても過言ではない。

はっきり言ってLチカ一つだってうまく動くかはハードで動かすまでわからない世界なので結局いる。多分普通のソフトウェア開発だと、なかなかない話なのかな?と思う。

ま、本番環境のデータサーバとかでSQL叩くとき、ドジ踏むと、12時間ぐらい帰ってこないとかあるのと一緒だよ、って言うと少しは分かってもらえるんだろうか?

動かさないとわかんないんだよ、基本的には。

組み込みって何それ?美味しいの?

注:私の独断と偏見だ!頑張って正確に伝える努力はするが、全部あってるとは限らないぞ!

 

 

組み込みって何!?

初対面の人とかに会うとこんなこと聞かれる

初対面の人:「どんな仕事されているんですか?」

でこんな感じで返答!

ワシ:「広義ではプログラマー、ちょっと狭く言うと組み込み関連の仕事です」

初対面の人:「組み込み??」

 

そうこんな (゜.゜) 感じになる。

ちなみにエンジニア同士でもかなり珍しがられる(珍獣)

ここでどう答えますか!実はこの業界に入ったときの師匠の言葉をそのまま使ってます!

 

ワシ:「電子レンジとか扇風機とかあるやん?あれってボタン押したら、食べ物温めたり、扇風機なら風を送ったりするやん?」

初対面の人:「うん」

ワシ:「あれナンで動くかって、中にちっちゃいパソコンみたいなんが入っててそいつがボタン押された!とか、時間何秒たった!とかを見張ってんねん。その中身をプログラムで作るのがワシの仕事や!」

初対面の人:「なるほど!」

 

はい。組み込みって簡単に言うとこんなんです。

 

何それ?美味しいの?

美味しいか美味しくないかは、アナタ次第・・・

とりあえず美味しいところと美味しくないところを説明しよう!

美味しいところ

  •   根本的なPCの動きとか理解できるようになる。

何せ理工学部ヨ・ロ・シ・ク、波形取ったり、テスター持ってきて調べたり

から始まってEthernetの規格だ!USBの規格だ!ファイルシステムだ!

となり、はてはRam領域の0x****************からが、変数の宣言していい領域だから、

0x****************番地のレジスターがメモリ破壊起こしてるんじゃね?

とか言い出す人たちが集まる熱き場所である。そりゃ、PCの中身くらいわかるようになりますよ。色んな意味で。

 

  • 応答速度とかめっちゃ気にする

これはとある現場の笑い話だが、業務系の保守系の開発をやってたときにSQL文を

どういうふうに作るかというのを相談したときに、できるだけ早く反応するのが良いと聞いたので、こんな質問した。

「応答速度の仕様とかあるんですか?何msecくらいです?」

これには相手も苦笑した。流石に無いと(笑)だけど、その考え方がメチャメチャ気に入られてすごくエンジニア同士で仲良くなった。だからALLOKだと思っている。

この発想は組み込みエンジニアには必須だったりする。なんせ法律で応答速度決まってたりするし・・業界によっては。。そして待っているものは・・CPU占有率落としてみようか?とか設計するわけですよ。割り込み検証とか色々やって・・

 

  • なんかカッコいい

冒頭で触れたけど結構身近にあるものかつ、人が見ないところを作っているので、それだけで何かカッコいいやん?なんとなく( ・´ー・`)どやっ! ってできるやん?

 

美味しく無いところ

  • 電気的知識が必要

何せ戦う相手はプログラムだけではない・・ハードの不具合でプログラムがエラーするときだってよくある。

そうなってくると電気回路図とか読むですよ。。


こんな感じのやつを・・なんで読むかとかはまた次の機会に・・

 

  • 色々な規格を知る必要がある

美味しいところで触れた、PCの動きとかわかるよって言ったのだが、逆にそれだけソフト面でも多くのことを学ぶ必要がある。しかも一般的にはエンジニアでも、避けたくなるようなことを平気で覚えさせられる。これは良いと見る人は組み込みできると思う

俺はwebエンジニアとかでAPI叩くだけで機能実現できますってのが羨ましくてしょうがない。なんせ提供されてるDrvにバグあって、作り直したりしないといけないこともあるし・・

 

まあ、こんな世界です。ざっくりわかってもらえたかな?

さぁ、まずはRaspberryPiでも買ってレッツチャレンジだ!

頼むから、この業界もうちょっと人増えて・・切実に・・

ジャンプ買ってあげるから・・