C言語 プログラミング

改めてC言語のポインタの基本操作や使い方についてサンプルコードを交えてまとめてみます。

スポンサードリンク

ポインターの作成と間接参照

Type型へのポインタの宣言は、型名 *変数名と記述して宣言する。

ポインタ型に変数のアドレスを代入する場合にはアドレス演算子&を用い、ポインタが参照する値を取り出す場合には、間接演算子*を利用する。

 

main関数はsort関数にint型変数のaとbのポインタを与える。

関数に変数のポインタを与える際にはアドレス演算子を利用する。

sort関数からswap関数に変数のポインタを渡す際には、xとyはint型へのポインタとして定義されているためアドレス演算子は必要ない。

 

ポインターと配列

配列名を与えられたポインターは、配列の先頭の要素のアドレスを指す。

 

配列の各要素にアクセスする方法は何通りもの記述形式がある。

 

配列の受け渡しにはタイプAやタイプBのような記述もできるが、最終的にはタイプCのように処理系は解釈される。

そのため引数で渡される配列の要素数は意味を成さないため、要素数が必要な場合は別の変数として用意することになる。

引数の要素数以上の配列を渡してもコンパイルエラーは発生しない。

ポインタと文字列

*pはあくまでcharへのポインタ型であるため、とあるメモリ番地のchar型配列に”abc”を格納しその配列の先頭番地のポインタを得る。

また普通にchar型配列を宣言して文字列を格納した場合と比べて、ポインタ型の分メモリを多く使用する。

intへのポインタ型などをprintf関数で表示する場合は間接演算子を用いたが、配列の場合は先頭アドレスを渡すだけなのでポインタに間接演算子を付ける必要はない。

 

ポインタpは要素型がchar[]型へのポインタ型で要素数が3の配列になる。

pの各要素には文字列配列の先頭のポインタが格納される。

 

配列の要素を指すポインタはインクリメントやデクリメントされることで、1個後方の要素や1個前方の要素を指す。

ポインタを利用する場合は、配列の時のような制御変数を必要としないため、記憶領域の節約や実行効率の向上が期待できる。

 

メイン関数で作成したcharへのポインタ型のアドレスを3回に分けて確認しています。

呼び出し先の関数上でポインタを加算減算しても、呼び出し側に戻れば元のポインタを保持していることが分かります。

配列操作にポインターを利用していることが分かっていると、このような結果になることも分かるような気がします。

呼び出し先の関数上で加算減算されたポインタがそのまま呼び出し元に返されると、配列の先頭アドレスが異なってしまい困ったことになります。

参考にさせて頂いたWebサイトや書籍

目指せ! Cプログラマ(11):ポインターを理解しよう – @IT

柴田望洋 (2014). 新・明解C言語 入門編 SBクリエイティブ株式会社

【C言語】ポインタの基本と使い方
Tagged on:

コメントを残す