Objective-C 基本講座

配列・ポインタを使う

全333コースを10日間無料で

ぜひご覧ください。

無料で視聴する すべての加入プランを見る
または
変数の集合のメモリ上の扱いと、関数への引き渡し時に行われていることを学習します。
講師:
09:48

字幕

このレッスンでは繰り返し処理で よく利用する配列とポインタを学習します まずここに挙げたプログラムは 友達に一万円貸していて その友達が毎日千円ずつ返す行為を 5日間繰り返すというものです 例えば この友達が返す金額を 1日目は100円 2日目は500円 3日目は...といった具合に日によって 変化させるにはどうすれば良いでしょう 1つの答えは if 文の利用です このように変数を利用し else if を続ければ いくらでも自由に変化させることができます もう1つの答が配列を使う方法です 配列は指定された型用の記憶区画を メモリ上に連続して確保したものです 変数宣言時に型と変数名に続けて [ ] と その中に必要とする 個数を書くことで用意されます 例えば int 型なら int 型変数用の記憶区画が 指定された個数分連続して確保され それぞれが1つの変数として 扱えるようになっています 用意された区画はそれぞれを 配列の要素と呼び 先頭から順に0から始まる番号で指定します 値にアクセスするには 配列名に続け [ ] を書き 中に要素の番号を指定します この配列要素を指定する番号のことを 添字と呼びます これでそれぞれの要素を1つの int 型変数として扱えるようになり 値の代入や演算ができます 注意する点として 確保していない要素に アクセスしないようにして下さい 最悪 実行時エラーでアプリが 強制終了することがあります 添字は変数で指定しても構わないので 用意した配列 repayment に対し ループ処理中にday で 添字を指定することで day に対応した値を 取り出せるようになります for 文で day を1から始めているのに対し 添字は0から始まるので 添字として指定する時は-1しています それと配列の値は宣言時の代入のみ [ ] を使って一気に行うことが可能です 配列要素の値を要素の順に カンマで区切って並べます 改行などは無視されるので 望みのレイアウトにすれば良いでしょう もし数が合わない場合は 最初の数だけが設定され 残りは0に設定されます また [ ] 内の数字を省略することで { } 内で指定した値分の要素を 確保するようにもできます 扱う上でいくつかの注意点はありますが 配列を使うことで 長い if 文を作らずに済むわけです 次に この配列を引数で受け取り ループ処理を行う関数を考えてみましょう 名前は loanSimulator とします 戻り値は int 型とし 引数に loan と repayment 配列を 受け取るようにします そして 内部では5日間のループ処理をし 更新された loan の値を 戻り値として返します あとはどうやって配列を渡し 受け取るかですが 関数側の仮引数は int 型や float 型の 引数の時と変わりありません 配列の宣言のように書くだけです 但し [ ] 内に要素数は書きません 書いてもエラーにはなりませんが 後で説明する理由から あまり意味はありません 呼び出す方では配列名だけを 引数に指定します これで配列を引数として渡せるのですが 注意する点が1つあります それは int 型や構造体と異なり 配列の値は引数用にコピーされない点です その代わりに配列の記憶区画の 先頭番地が引数として渡ります 関数側ではこの番地をもとに 呼び出し元の配列の値を 調べるようになっています 例えば 仮引数 repayment の添字に 2が与えられたなら 受け取った番地から int 型で2個分 進んだ所の値と考えアクセスします これは結局呼び出し元の repayment 配列での添字2の要素を示す事になります その為 関数側で配列の値を変更すると 呼び出し側の配列の値も変わります 123 を代入すれば 呼び出し側の repayment の添字2の 要素の値も 123 と変わります この仮引数 repayment は 配列のように振舞っていますが 実際にはポインタと呼ばれるものです 仮引数名の [ ] 追加が仮引数を ポインタにすることを意味しています 仮引数側の [ ] で要素数を指定しても 意味がないと言ったのはこの為です 指し示す番地の記憶区画の型が int 型なので int 型ポインタです もし float 型なら float 型ポインタと呼びます ポインタの指定には型の後ろに *をつける文法もあります その場合 後ろの [ ] は取り外します つけるとポインタのポインタとなって しまうので注意して下さい 本来はこちらが一般的な ポインタの指定方法です 一般に配列を受け渡すなら [ ] を そうでなければ*を使います ここで言う配列を受け渡していない場合とは 変数の記憶区画の番地を 渡される場合です ポインタを関数に渡すことで 自分が持つ変数の記憶区画を 関数に直接変更して貰うわけです この方法だと関数から受け取れる値は 戻り値1つだけという― 制限は無くなります 例えば int 型ポインタを1つ受け取る setZero という関数があったとしましょう この場合 呼び出し側では int 型変数を用意し その変数名の前に&をつけることで 記憶区画の番地を setZero の 引数として渡すことができます 受け取った setZero 側では valuePtr の前に *を置くことで ポインタが指し示す記憶区画に アクセスできるようになり int 型変数と同じように 扱えるようになります 0を代入すれば 呼び出し元の 変数への値が0になります 配列風に添字を使う方法も使えます このようにかなり自由度の高いポインタですが その分慎重に扱って下さい 例えば 添字の範囲はチェックされないので 配列ではない a に対して 0番目以外の要素に値を代入すれば 呼び出し元の関係ない記憶区画が int 型分0になってしまいます この破壊工作は *を使っている場合でも可能です ポインタに1加算してから*をつければ 同じ結果になります 1の加算が番地を1つ進めるのではなく 型が使用している区画の大きさ1つ分 進める点にも注目して下さい その為にポインタは型の指定を 必要とします 例えば int 型と その倍以上の区画を 必要とする double 型では それぞれのポインタに+1の加算で ずれる番地が異なります また ポインタは関数の仮引数だけでなく 変数として宣言することも可能です 但し 利用する際はポイントするべき 記憶区画を与えることを忘れないで下さい 単独の変数の番地なら &を使い代入します 配列の先頭番地を渡すなら 引数の時のように 配列名だけを書いて代入します 因みに 配列を添字を付けた上で &を使うと その添字の要素の番地が取り出せます *をつけた状態ではポイントする変数と 同じように扱えます では OS X コマンドラインツールとして作り 実際に setZero 関数を使った サンプルをお見せします Xcode の画面に切り替えます このレッスンでは繰り返し処理で よく利用する配列とポインタを学習しました

Objective-C 基本講座

このコースはプログラミング初心者でもObjective-CによるiOSアプリ開発の体系的な理解が得られるように構成されています。プログラムの動作の原理、Objective-C言語の役割、そこで利用されるCocoa touchオブジェクトの役割、基本的なiOSアプリの作成方法などを学習します。ぜひこのコースをアプリ開発に踏み出すさいの第一歩としてください!

6時間39分 (69 ビデオ)
現在、カスタマーレビューはありません…
 
ソフトウェア・トピック
価格: 3,990
発売日:2015年11月18日

このコースは、「オンデマンド」でご利用可能であり、ダウンロードすることもオンラインで見ることもできます。

ダウンロードすると、オフラインでコースを使用し、豊富なインターフェースをフルに活用できます。複数のデバイスを使用したり、 一度に全コースをダウンロードしたくない場合は、アカントにログインして、ストリーミング・ビデオとしてコースのレッスンを視聴してください。

ビデオトレーニングをお楽しみいただけますように! お問い合わせは、cs-jp@lynda.com宛までご連絡ください。