42
1 ななしのよっしん
2008/08/11(月) 08:25:53 ID: TL/vA4ecWJ
「ポインタ変数」はCやC++における特徴的な概念かもしれないけど、
ポインタ自体の概念を持っていない言語ってのはあまりないと思う。
例えば、参照型な変数ってのは対象を指し示しているという意味でまんまポインタなわけで、JavaにもC#にもポインタは存在するって言えるじゃないかな。
若干屁理屈気味ではあるけど
2 yamashita
2008/08/11(月) 09:29:20 ID: SU2dHucjW0
>>1
ご指摘痛み入ります。
ただ、ポインタをポインタ変数を指し示す用語として使われている(例:XX言語はポインタが使えない)ようなケースも見られるので、このような形ではいかがでしょうか。
3 ななしのよっしん
2008/08/12(火) 01:17:20 ID: 3C0LKLWSZX
わかりづらいのはポインタ変数の表現形式であって、ポインタ概念そのものは明快だと思う。
ループをGOTOで表現するとわかりづらくなるのといっしょ。
4 ななしのよっしん
2008/08/12(火) 01:22:04 ID: 4a8XecGm0O
ポインタのポインタまでは追えるけど、ポインタのポインタのポインタ以上になるとイラっときますw
5 ななしのよっしん
2008/08/13(水) 01:00:27 ID: yPxoK1kjYk
Javaユーザが参照のことを「ポインタ」と呼ばれるの(概念の説明の際も含めて)を嫌うのは、
「ポインタとは加減算が許されている値なので不正な領域を指しうる」
「Javaの参照には演算が許されていないのでCのポインタより安全である」
という確固たる信念(……と言っておく)が根底にあるのかなと愚考。
まだ可燃性の高い議論なのかな、これ。
6 ななしのよっしん
2008/08/13(水) 01:04:54 ID: YJdq1b2ibc
>>5
Javaで参照といわず、わざわざポインタというとVMの実装の話か?
と思ってしまう。
7 ななしのよっしん
2008/08/13(水) 01:33:51 ID: 8Rwvs/nm5w
私はCでポインタ変数の加算減算と配列表記を使い分けています。
&i[1]とi + 1
この二つは同じ意味でも、わざわざ参照してポインタを取っている分前者の方がわずらわしい作業に見えて仕方なかったり。
ただどちらの形で書いても多くのコンパイラでは配列外のメモリにアクセス出来る事に違いはありませんし。正直ポインタ変数を使わなくても同じ動作をするプログラムは作れるのですが、配列の先頭アドレスを移動させるような事が……
はい、確かに経験浅いです私。
ちなみにC#でも一応ポインタ変数は扱えます。使った事無いですが。
8 ななしのよっしん
2008/08/15(金) 09:42:15 ID: 9BckrtPi1M
これももうすぐポインターになるのかな?
9 ななしのよっしん
2008/10/18(土) 19:38:51 ID: 8Rmv4/4fYi
10 ななしのよっしん
2010/02/11(木) 19:43:19 ID: qhsjX+LeFZ
・変数宣言の時の「int *pointer」
・変数の値を参照するときの表現「*pointer」
この2つが話をややこしくしている主犯だと思うんだ
・変数宣言は「int* pointer」のように*を型の方にくっつける
1行で複数のポインタを宣言しないルールがあれば
int* pointerA, pointerB;
みたいな悲劇も防げてベネ。
・ポインタだけは例外的にシステムハンガリアン記法を使う
・Visual Studioのようなリッチな環境で作る
とすれば若干マシになるけれども…
11 ななしのよっしん
2010/07/15(木) 02:08:41 ID: aSiVzy5CrS
構造体の中にchar型変数の配列array[]にポインタ演算子つけて文字
列"abc"表示するソースがあったとして文字列にはアドレスがあって文字は
値にもなってあれ?文字列が格納されてる変数がない?でも文字列の名前は
アドレスを表しててポインタにアドレス代入してなくてわかんないからまあ
いいや。でもprintf(array[])ってデバックしてみたらあ!そうか文字列
って配列なんだ。え?違うてか配列に文字列が代入されててそれでポインタ
でけれどポインタいつ代入したのかなと思ったけどもう最初に初期化されて
ポインタだから文字列を指しててでもcharで1バイトで1バイトなのに文字
列っておかしいでもポインタだから嗚呼嗚呼ああああああああああああああ
あああああ
12 ななしのよっしん
2011/05/22(日) 02:13:43 ID: mYG1CqlKoi
おい、白菜ポインタとIKKOポインタが無いとはどういうことだ
13 ななしのよっしん
2011/08/26(金) 12:57:11 ID: MUx/tuX7Y1
int arrays[10];
int* pointer = &arrays[0];
は別の書き方で
int* pointer = arrays;
と同じです。
14 ななしのよっしん
2011/08/27(土) 22:34:30 ID: LlviXN16q6
15 ななしのよっしん
2011/12/03(土) 16:51:01 ID: osXoxcL6Gk
RPGツクール2000の「変数の番号の変数」と同じかな?
16 ななしのよっしん
2013/10/09(水) 20:51:14 ID: DKqoyQil+L
ウルトラセブンのポインター号が抜けてる。それとレ「イ」ザーポインタよりレ「ー」ザーポインタの方が字面としてはしっくりくるな。
17 ななしのよっしん
2013/10/21(月) 14:57:39 ID: 4jEBwznN4V
ポインタって要するに
実際のデータのメモリアドレスを格納してる(orする)変数
ってことでおk?
18 ななしのよっしん
2013/11/04(月) 17:40:51 ID: LhyvYfmvxO
>>17
メモリアドレスだけでなく「型」情報も一緒に持ってる
例えばインクリメントやデクリメントするとき、その型のデータがメモリ上で占めるサイズに合わせたアドレス移動ができるのは型情報も持ってるから
19 ななしのよっしん
2015/10/06(火) 02:33:07 ID: c/XWukpYXi
>C言語の初心者が挫折しやすい概念
・・・という触れ込みが必ず出てくるのだけど、多重ポインタでややこしいケースをのぞけばポインタ自体が難しいとは思えんのよね。ポインタができない人は根本的に低レベルべったりのC言語をよく分からず使ってるだけだと思う。
20 ななしのよっしん
2015/10/12(月) 13:26:19 ID: pnJYHCDwQc
コンパイルエラーと実行時エラーの区別すらつかない初心者が
エラーメッセージ無しで強制終了・ハング・意味不明な挙動にぶつかった時に
原因も対処法もわからなくてお手上げになるんだよ
そこからもう一歩踏み込んで初めてポインタとの戦いになるんだよ
21 ななしのよっしん
2015/12/23(水) 20:36:51 ID: Wkdi5Ha6HN
近代的な言語しか知らない奴に、システマティックなメモリ思考を身に着けてほしいという意味をこめて「Cをやれ」と言う人は多い
でもそれは逆も言えていて、Cしか知らない奴は変態言語としてのCの成分(ポインタ周りの謎記法)を頭から抜くために一度Javaか何かをやるべき
22 ななしのよっしん
2016/07/17(日) 18:36:05 ID: g2q64jYKCX
組み込み系触ればポインタとか一発だろと思わなくもない
ハードウェア上でのやり取りを理解せずにプログラム触るから理解できないだけだよ
まあその辺り意識しなくても書けちゃったりするしな(処理時間は別として)
23 ななしのよっしん
2016/11/01(火) 15:16:30 ID: KVOpdE3qY8
24 ななしのよっしん
2017/01/29(日) 22:54:47 ID: Wkdi5Ha6HN
再帰とかお願いだから挫折したままいてくれ
習得せんでいい
25 ななしのよっしん
2017/04/30(日) 01:27:19 ID: c/XWukpYXi
26 ななしのよっしん
2017/12/07(木) 09:05:58 ID: YKDime+395
「"int* ptr" が正規表現。"int *ptr"は許容表現。」
って言えば、初心者がつまずくことなんてなくなるんだろう
int型とint*型の違いだと説明すりゃほとんどの子は納得する
「int*型には、int型が占有するメモリアドレスが入る」
int x;//int型の変数x
int* ptr;//int*型の変数ptr
ptr=&x;//ptrにxのアドレスを代入
「現アドレス上を操作するときはポインタ変数にして行う」
*ptr=5;//ポインタptrに5を代入(これはx=5と同義)
これなら中学生でも余裕でいける
27 ななしのよっしん
2017/12/07(木) 10:36:08 ID: YKDime+395
>>25
再帰は直感的に理解しやすいが正確な値を脳内演算しづらいデメリットがあるからなぁ
それならforループで同じ処理すりゃ読みやすいだろって話じゃないかな>>24が言いたいことは
消費メモリ節約できるとかいう具体的なメリットがないなら慣れ親しんだ表現のが好ましいよ
28 ななしのよっしん
2018/06/27(水) 19:21:18 ID: wIv8gWIWxx
>>26
int* が本来正しい表現だったんだけど、
例えば3つ宣言するときとかいちいちint*を書くの面倒だから
変数名の前に書いてもOKになってます、でいいのかしら。
29 ななしのよっしん
2018/11/07(水) 21:37:22 ID: mIU2hA7IUv
10年経っても理解できない
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言語。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。