ポインタ単語

ポインタ
  • 2
  • 0pt
掲示板へ

ポインタ、ポインター(英:pointer)とは、何かをし示すもののこと。

  1. プログラミングの分野において、メモリ上のアドレスデータ。本稿で解説する。
  2. マウスポインタカーソル)→マウスカーソル
  3. レイザーポインタ
  4. 獲物の位置を示す役割の猟。またそのために良された種の一つ。

 概要

ポインタは、メモリ上のアドレスデータのことである。その変数であるポインタ変数のことをポインタと呼ぶこともある。C言語やその生言で使われる。

C言語初心者が挫折しやすい概念のひとつトリッキーコーディング跋扈していることもそれに拍をかけている。このため、概念のひとつに過ぎないにも関わらず、ポインタの話題に特化した書籍が多数出版されている。

C言語においては、文字列操作や動的なメモリ確保(malloc)を行うとき、避けて通れない。そのため、ポインタはC言語を使いこなすためには、もが習得しなければならない概念といえる。

ポインタと参照

ポインタは加減算の対になり、整数との変換をも行うことができる。そのため、効なアドレスを容易に作り出すことができ、バグの温床となりやすい。また、メモリアドレスが入っているからといって必ずしも物理メモリアドレスであるとは限らず、近代的なOSであればほぼ間違いなく論理アドレスであろう。

ポインタに似たような概念に参照がある。参照はNULLにならない、加減算ができないといった点でポインタと異なり、ポインタのフリーダムさを自重した感じになっている。

叫び

 

カッコ悪いと思っているかもしれないが、[]演算子が使える局面では積極的にこれを使おうよ保守担当の心の叫び)。

関連動画

関連商品

関連項目

【スポンサーリンク】

  • 2
  • 0pt
スマホ版URL:
https://dic.nicovideo.jp/t/a/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

ポインタ

30 ななしのよっしん
2018/12/04(火) 20:10:40 ID: c/XWukpYXi
>>28
すべてはCのポインタ宣言がアレなせいだと思われる。
int* a,b;
と宣言した時、これはint*2つではなく、int* a と int bと解釈する。だからポインタ2つを宣言したければ int* a, * b; とするしかない。とはいえ* bの空白キモいので*bにしたくなるのが人情で、こうなると心理学的に言っても *a もそれにえたくなる。
ということで、構文上は変数の方に * が付くのが自然と理解せざるを得ないorz

現実に出回っているAPIリファレンスなどを見ても*は変数側につくのが当たり前で、の側に付けてるものはほぼ見ない。関数引数が個別だからそうしなくてもいいんだけど、もうどうしようもないとしか。
ちなみにだが、これを反省してちゃんと int* にしたのがD言語
31 28
2020/04/28(火) 21:25:13 ID: wIv8gWIWxx
>>30
遅くなりましたがありがとうございました
本来なら int* a, bで両方ともポインタ変数になってほしいところを、といった部分が今日やっと理解できました。
ポインタキャストするところで(int *)などとしているので、なるほどな、と。
変数名に*をつけるものと考えてしまっていたので、宣言時と数式内で動きが逆じゃねえかと何年も拒絶反応を起こしていて覚えられなかったようです。
32 ななしのよっしん
2020/06/22(月) 20:10:41 ID: wIv8gWIWxx
ポインタポインタに詰まってます。
乱暴に書くと、ポインタ配列(char *str[9] 等)と扱いはまり変わらんとのことですが、今の所うまく染んでくれない様子。
main関数の(int argc, char **argv)
というのを見てると、コマンドライン引数などに使うのかな、と理解はできるのですが。
33 32
2020/06/24(水) 18:38:24 ID: wIv8gWIWxx
乱暴に書いた例が乱暴すぎてなんか違うわ、ゴメソ。
リテラルの配列char2次元配列で使うときに、特定文字を探すときとかに使うでいいのかな。
あと、理にポインタ演算((**hoge)++ とか)も覚えようとしてしまっているから混乱しているのかもしれないです。今はあまり使わないからあまり気にしなくていいよね?

下駄文。*でポインタ変数アドレスを参照するところを、他の記号(@等)にできなかったのだろうかと。今言っても遅いけどw
34 32
2020/06/24(水) 18:44:23 ID: wIv8gWIWxx
(**hoge)++は参照先をインクリメントで
**hoge++が正しいポインタ演算でした。
何度も汚しスマソ
35 ななしのよっしん
2020/07/18(土) 08:24:18 ID: Wkdi5Ha6HN
配列と変わらんというのは「ポインタへのポインタ」とはあまり関係ない
Cでは式の中に配列を書くと「配列の先頭要素へのポインタ」に置換されるので、要するに配列は宣言した後はポインタとして使っている…というお話
配列に使っているhoge[3]みたいな[]で中身を見る参照も実はポインタに対する演算子

配列メモリ領域を確保すると同時にその領域へのポインタを宣言するもので、ポインタとして宣言されたポインタは不定領域をし示す
そういった区別はあるが、配列宣言によって宣言されたポインタポインタとして宣言されたポインタも参照に関する限り用途は同一ではある
もちろん、動的メモリ確保した場合は最後に開放するという違いはあるけどな

ということで問題は定義された多次元配列を受け取るときで、externするかポインタとして受け取るかという感じになる
ポインタへのポインタを開発現場で実際見たのは、どっかにマスタデータ構造として定義された構造体の多次元配列ポインタで持ち回してるシステムだった


(省略しています。全て読むにはこのリンクをクリック!)
36 32
2020/07/21(火) 20:56:27 ID: wIv8gWIWxx
>>35
ありがとうございます
とりあえずポインタ全制覇の本を読んで、シンタックスシュガーという概念を理解できました。ただ、ポインタポインタの使い所がうまくつかめないので、業務で使わないと身につかなさそうですな。
一応ポインタ関数へのポインタの宣言方法まではなんとかできましたが、そこからまたになってるかもしれません。
ポインタ演算から[]への々は、組み込みじゃない限り今のコンパイラだと最適化されるので、実行速度は変わらんから人間にわかりやすく書こうぜ、と苦Cに書いてありましたね。
37 ななしのよっしん
2020/07/24(金) 11:08:36 ID: Wkdi5Ha6HN
例えばリンクリストみたいなデータデータがつながったデータ構造を構築する場合、リンクリスト全体を保持したい時はだいたいが先頭要素へのポインタを保持する感じになるんだ
例えば連絡網というリストがあったとしたら連絡網の最初の人へのポインタとして持ち回す
この場合「連絡網」を引数に受け取る関数は「連絡先へのポインタ変数「連絡網」を受け取る事になる

で、リストそのものが複数あって同じの場合はまとめて配列で持つ事がある
例えば定時連絡の連絡先リストと緊急障の連絡先リストが同じ構造体「連絡先」だったとしたら、その二つを「連絡先へのポインタ」のサイズ2の配列に持って、その配列を「連絡網全体」と呼んだりする
この場合「連絡網全体」の実体は「連絡先」へのポインタ2個からなるサイズ2の配列となるわけだが、関数に渡すと配列ポインタに化けるので「連絡先へのポインタへのポインタ」として渡される事になる

大体こんな感じで、まず配列ができて配列関数渡しでポインタに化けて…という流れでポインタへのポインタが多重参照され
(省略しています。全て読むにはこのリンクをクリック!)
38 ななしのよっしん
2020/07/27(月) 20:40:54 ID: c/XWukpYXi
ダブルポインタの使い所は極論すれば2つぐらいかなぁ。
一つは不特定複数のデータ関数に渡したい時。main引数はこれね。一つ一つの文字列がそれぞれ別のアドレスにあって、それらを配列に並べてワンセットで総数と一緒に渡すことで、引数がいくつでもそれぞれがどこにあっても対応できるようにしてる。

もう一つは別の関数アドレスそのものを操作したい時。
Cの関数は値呼びだから引数に渡るのは数値のコピーで、ポインタで渡さないと値の変更が呼び出し元に反映されないというのは入門書に出てくると思うけど、例えば何かのデータをmallocしたいんだけど返り値をエラーステータスに使いたいんでデータ引数経由で返さなければならないなんてことがある。
そういう場合にアドレスを書き込むためのアドレスというのが必要になってくる。
39 ななしのよっしん
2020/08/19(水) 11:18:02 ID: rlCOTjOrcY
ポインタ
概念の理解より構文や人間が管理するのが大変とかの方が厄介な気がする