プログラミングC言語の学習者にとって、**ポインタ(pointer)**の理解は大きなハードルと言われています。
例えば「C言語 ポインタ」だけを専門に扱う入門書籍は、これまでにも大量に刊行されています。
C言語における「ポインタの難しさ」はどこから来ると思われますか?
(具象的な疑問解決ではなく、ご意見募集というニュアンスです。対象はC言語に限定します。)
以下は私の考える理由候補です:
- ポインタ関連の文法の分かりにくさ(特に変数宣言)
- ヌルポインタ(NULL)の意味
- 動的メモリ管理(malloc/free)の難しさ
- 配列とポインタの関係性
- 関数ポインタ
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答31件
0
最も基本的なことですが
・ポインタとメモリアドレスの関係が高級言語(?)だけを扱っていると理解しにくい。
・・・アセンブラから入ると処理(関数)もデータも同じメモリに格納されているのだから当然アドレスが存在する・・・というのが判るのですが・・・
#学校でアセンブラ教えないのかなぁ
投稿2015/04/25 06:13
総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/03 22:31
2015/06/26 12:12
2015/07/14 10:30
2019/06/04 00:23
0
個人的な考えですが、利便性と利用目的がわからないのではないでしょうか。初心者がプログラムをする際にあまり関数やクラスを使用しないために、どのような場合に使いどういった利便性があるという認識がないため理解できず、さらにそこにハードウェア的なメモリの番地が〜といった話が入ることで、必要ないもの+知らない言葉で理解するのを放棄していると思います。
投稿2015/04/28 07:55
総合スコア127
0
ここまでの回答と重複する点も多いかと思いますが、
ご質問(の題)の要因を箇条書きで整理してみます。
・C言語が比較的シンプルでプログラミング初学者向きだから、
難しいと発言する人の数自体が多い(だから需要が多く書籍も多い)。
・ポインタ自体より、ポインタを使ったメモリ管理全体や
アルゴリズムが難しいのだが、ポインタが難しさの象徴になっている。
・機械は難しい。機械語は難しい。機械語ほどではないけどアセンブラも難しい。
そしてCは、中水準言語とか高級アセンブラと称されるように機械寄りの言語で、
機械(のメモリ)と接する部分のポインタが、ほかの高級言語であまり出てこないから。
・ポインタが難しいというより、ポインタ関連、メモリ関連のバグの原因特定が難しい。
Cの開発環境のレガシーさもあって、ポインタが難しいというよりデバッグが苦しい。
・既知の学習モデルでないから。変数は数学の変数の応用だから、すんなり理解できる。
四則演算や論理演算もつまづかない。それらがやさしいというより、数学で習うから。
しかしポインタは学校で習わず、Cではじめて習うから、つまずきやすい。
・イメージしにくいから。IF文やFor文などのフローチャート的な制御構造は、
一般的な作業の手順と同じだから、すんなりイメージできる。
ポインタも番地のたとえはともかく、ポインタのポインタとか、
関数ポインタとか、発展的なものはすんなりイメージできない。
このように複合的な要因があると思います。
投稿2015/07/16 20:43
総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
広く言えば、多分、単純にアドレス指し示し先という解釈以上に、凝った処理の事例が多いからでは。
※ことの本質レベルが分かってないと、その処理系が読み取れない。ポインタのポインタとか、関数へのポインタとか…
狭く言えば、教科書レベル(狭義の変数レベル)でポインタを見ていると、右辺値、左辺値も一緒くたに扱うので、右辺値、左辺値を意識しないことから発生するのではと思います。
投稿2015/04/25 11:12
総合スコア116
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/27 03:27
2015/04/27 06:14
2015/04/27 13:54
0
- 計算機の仕組みを理解しないまま入門するケースがある
ノイマン型の基本的な仕組みをほとんど理解していないプログラマーがいきなりポインターをやるのは無謀かも知れません。
私も計算機科学を体系的に学んだわけではないのですが、機械語を少しやっていたおかげで理解不能のレベルではありませんでしたね。
- 文法が直感的でない
未だに慣れません。
メインがC言語ではないので、久しぶりにやってみるとたまに混乱します。
- ポインターの応用、データ構造の実装
ポインターを何のために使うのかという点で、データ構造について学んでいない人はここでつまずく気がします。
ポインター自体とは別の話だとは思いますが、ポインターの難解さと一緒くたにされることも多いのではないでしょうか。
投稿2015/04/26 07:33
総合スコア9394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/27 03:49
2015/04/27 04:31
2015/10/23 12:53
2015/10/23 13:07
0
私はポインタの理解で苦労した記憶がほとんどありません。これは「初心者のころによいお手本に出会えたから」というのが、最大の理由だと思います。
新人教育でC言語を初めて勉強した時当然ポインタも出てきましたが、解っていたつもりになっていただけでした。業務で先輩方のプログラムを読んで初めて、「どういう時にどのように使えばよいか」が解るようになりました。(感謝感謝です)
その後の業務を通じて他の人が書いたプログラムを読む機会も多くありましたが、ポインタの乱用・誤用も多々あります。初心者のころにこういうプログラムに出会ってしまっていたら、私も「ポインタは解らない」という一人になっていたかもしれません。
(ポインタに限った事ではありませんが)「プログラミングの勉強」=「覚えること」だと思っている人もいますね。
if やループ程度ならパターンを覚えるだけでも対応できるのかもしれませんが、ポインタの扱いは「覚えきれない」ものでしょう。
・ポインタ関連の文法の分かりにくさ(特に変数宣言)
確かにそうです。しばらくC言語から遠ざかっていて戻ってきた時、一番忘れていたのはポインタ周りの記述方法でした。
投稿2015/06/26 08:46
総合スコア229
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
1.「ポインタが分からない」と言う人のレベルが様々だから
「動的メモリ管理(malloc/free)の難しさ」については、「効率的な」と言う枕詞を入れるだけで永遠の課題とも言えるものになってしまいます。そんなものに効率的な解があるなら、メモリリークやバッファオーバフローは起きません。
2.周りが難しい難しいと言いすぎるから
人間の心理として、難しいと言ってる連中が多い物をムリに理解しようと言う気にはなれないのかもしれません。ポインタの機能自体は理解出来ている人は多いはずです。ですが、1の理由により「その程度で理解したつもりになるな」と言う連中が少なからず出て来るので、まじめな人ほど、自分はまだ「ポインタが分かってない」と思うわけです。
3.アルゴリズム(およびデータ構造)が理解出来ていないことを「ポインタが分からない」と言っている。
ポインタを利用するアルゴリズム(およびデータ構造)は極めて多い(そして扱うことができるレベルも高くなる)わけですが、それを理解出来ていないのを「ポインタが分からない」と言っているわけです。「C言語 ポインタ」だけを専門に扱う入門書籍と呼ばれるものは、殆どこれらの解説に終始しています。本当に「C言語 ポインタ」だけを解説した専門書は見たことがありません。
投稿2015/05/30 17:32
編集2015/05/30 17:44総合スコア14
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/06 16:54
0
変数の値が扱っているデータそのものではない、とか。
データそのものの参照のしかたに癖がある(ヌル文字とかメモリサイズを意識しないとメモリリークしたり)、とか。
確保しているメモリサイズをプロパティ的な所に持っていないので、確保したメモリサイズを意識しないといけない点もあります。
実データを処理するだけでも処理手順などを考えなければいけないのに、実データにアクセスするだけのために考えることがいくつもあるのって結構面倒くさいです。
とは言いつつ、メモリ管理をイメージできると色々な考え方ができて他の言語にも応用できるので苦労しますが勉強する価値はあると思います。
投稿2015/04/25 06:56
総合スコア85
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/27 13:59
2015/04/27 15:30
0
この問題の根本的な原因は、説明に携わる立場の人間
(教育者、出版関係者、書籍執筆者、中堅以上の技術者)
の多くが、一つの勘違いをしていることに起因していると思います。
つまり、
低レベル(ハードウェアに近い)な話は人間には難しく、
高レベル(高次概念に抽象化された)な話は人間に分かりやすい、
わかりやすく説明するためには、低レベルの話を避けて高レベルの概念で説明しなければならない
という誤解です。
アドレスとメモリ空間で説明すれば簡単に済む説明を
「そういうハードウェアに近い説明をするのは、説明者として芸が無いという事になり沽券にかかわる」
とでも思っているかのように無理やりアドレスとメモリ空間を使わずに説明しようとしているから、
わけがわからなくなるのです。
C言語の登場当初は、アセンブラの熟練者から「Cは難しい」という話を聞くことがありました。
「コンピュータの初心者にも分かり易い説明」を目指した結果、
コンピュータの熟練者で概念の本質が理解できている人間にさえ意味が通じなくなった説明で、
初心者が本当の理解を得られるわけがないのです。
同様の理由で本来以上に難しいとされてしまっている事柄には、
- オブジェクト指向
- JavaやPerlにおける参照
などがあると思います。
投稿2016/02/20 16:29
総合スコア1193
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/09 02:23
2016/08/06 15:45
0
こんにちは。
今更で申し訳ないのですが、興味深いテーマなので、意見を述べさせて下さい。
私自身はアセンブラから入ったので苦労は無かったのですが、娘が今、学校で苦労してます。
新しいことを教える際には、既に理解していることと照らしあわせて説明すると説明しやすいです。
そこで、娘にポインタの概念を教える際に、現実世界に照らしあわせてみようと思ったのですが、それができないのです。
C言語のポインタを無理やり現実世界に対応させようとすると、例えば「あのりんご」になると思います。
「りんご」が型で、「ある1つのりんご」が変数ですね。そして、「あのりんご」と指し示すことがポインタに当たると思います。
C言語のポインタは遠隔操作の達人で、ポインタが指す変数を自由に操作できます。中身を取出したり、インクリメントしたりなど。
しかし、「あのりんご」のままでは遠隔操作できないです。「あのりんご」を食べたいならそこまで行くか、「あのりんご」を手元に持ってくる必要があります。
つまり、現実の世界では変数(りんご)を直接操作することしかできず、ポインタで指し示した変数を操作することってできないです。
メモリやアドレスの概念が難しいことが最大の原因と思いますが、アナロジーを使えないことも理解しづらい原因の1つと考えてます。
【閑話休題】
ところで、高級言語だとポインタの概念を理解する必要が無いとよく聞きますが、これは誤りと思います。
JavaやC#はポインタの概念を排除し、「参照」と呼んでますが、実装はポインタです。
代入文でオブジェクトをコピーしたつもりが、実はポインタがコピーされているだけなので、実体は1つのままです。ある変数を修正したら、いつの間にか他の変数まで変わるってことが普通におきます。
以前C#でハマりました。分かっていてもデバッグは超たいへんです。全てのクラス・オブジェクトが参照なので、他と共有されている可能性があるのです。
ですので、JavaやC#でさえも、ポインタの概念を理解しないままだと、この落とし穴にハマったら最後、なかなか抜け出せないと思います。
投稿2015/10/23 04:37
編集2015/10/23 04:43総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/26 04:57
2015/10/26 09:13
0
高級言語っぽく見えても、根本的にはアセンブラで書くことと変わらない考え方が必要なことが原因のように思います…
他のモダンな言語は、概ねそれぞれに意識しているプログラミング・パラダイムがありますよね。
プログラミング・パラダイムを意識するということは、なにかしら作りたい処理があって、それを表記し易くする為に言語側の機能にいろいろ手が尽くされています。
でもC言語は元々OSを効率良くメンテナンスする為に開発されたプロツールで、初心者は想定していないような作りです。また、アセンブラのコードを生成する為のツールですし、ほとんど最低限の機能しか与えられていません。(最悪アセンブラで書き足せばいい、って話もあります。)
ツールとして考えると、ひどくローレベルのものがむき出しで、下手に弄ればなにが起こるかわからない。「触るな危険」て札をぶら下げているようなものではないかと。(ライブラリの呼び出しでも一歩間違うと、初心者にはなんで止まったか分からない状態にハマります。)
学校の先生あたりからすると、アセンブラとセットで覚えて欲しい言語かもしれませんが、これをろくにプログラミングをしたことのない人がいきなり覚えろと言われたらやっぱり難行だろうなぁ、と思ってしまいます。
自分は、BASIC, アセンブラ, Cの順に覚えたので、特にポインタが理解不能ではありませんでしたが、ポインタを利用した様々な実装にはやっぱり閉口しました。
実装方法を見ただけだと実現される機能がほぼイメージできないものも結構あります。そういったものは、提供される機能の概念と実現するアプローチに対して(場合によっては記述様式に対しても)深い理解が不可欠になってきます。(最近の言語ってそういうことをスマートに解決していて、わりとイメージできるところに上手に落とし込んでいますが。)
ポインタ自体は、抽象的に捉えメモリなどを指し示すだけのもの…とシンプルに考えられれば、特に悩む問題ではないわけですけども。
C言語の自由度の高さ。縛りのなさ。記述様式の難解さ。というのは、初心者にとって言語に実現できる範囲を全くイメージできなくさせる原因になっていて、(どこまで分かれば分かったことになるのか…というジレンマも含めて)そういう事柄がネックになっているのではないかと。
というわけで…
最初に書いたことが原因かなぁ、と考えます。
その、イメージできなくさせる原因が具体的になにか、って聞いてるんだ。
…というツッコミもあるかと思いますが「数学が難しくて理解できない。」と思う人が何故いるのか、という問いと似たようなもので、どちらもある程度物事を抽象化して、順序よく組み立てるスキルの問題。ということかと思います。(アセンブラライクな処理の組み立てと考えると、実現度合いがローレベルすぎるのもかえって厄介ではないかと思います。)
投稿2015/07/18 16:10
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ポインタが難解だ、と言われるのは、ポインタ操作を重視する教育上の問題が大きいと思います。
yohhoyさん含め他の何人かの人が言うように、ポインタの加減算がわかりづらいです。
しかも実質上業務では必要ない。にも拘わらず、そこを気軽に教えることがおかしな気がします。
アドレスに対する演算と、それ以外を上手く区別できる人とできない人で、ポインタの難度が大きく変わっています。
「ポインタの値(アドレス)を変更してみる」ところを早い時期から学習に組み込むケースをよく見ます。
どんなにそれでコードがシンプルになろうが、(ポインタに格納された)アドレスの値を直接変更するを教えることは最初は避けるべきだと思います。そもそもプログラムを作る上でそれらの知識は必要無いはずです。
多くの場合、プログラマーはあるアドレスに対する書き込み/読み取り操作をしたいだけです。
yohhoyさんが上げた難解な理由にあたりそうなものも、ポインタとの関係はアドレスの取得・保存に限るものが殆どです。
ポインタを通じて変数や配列の値を書き換えることにだけ注力すれば、ポインタの問題はずっとシンプルになります。
Cでは配列で学ぶ(sizeof等を除く)殆どの操作がポインタに適用でき、またポインタの操作もその多くが配列に適用できますね。
この理由も、アドレスに対する書き込み/読み込みを軸に考えればシンプルに説明できます。
変数はメモリ上に確保されます。その確保された位置をアドレスと言いますよね。だから変数のアドレスは後から変更できません。配列も変数ですからそれは同じです。配列が普通の変数と違うのは、変数はアンパサンド(&)をつけることでアドレスを取得するのに対し、配列は名前を指定することで先頭要素のアドレスを取得することができることです。
これが、ポインタがアドレスを取得する時と同じ記述になるので人によっては混乱します。
lang
1int a[10]; 2int b*; 3b = a; // 簡単に代入できる 4//a++; // しかしこれはエラーになる、なぜか 5b++;
このことは、「取得したアドレスに対する操作なので同じことができる」と簡潔に説明できます。
ポインタのみインクリメントできる理由は、ポインタはアドレスを新たに書き込むことが可能だからと説明できます。
・変数/配列 アドレスについて読み取りのみ可能=アドレスは変更不可能
・ポインタ アドレスについて書き込み・読み取り双方が可能
ポインタの加減算と配列の添え字は方言みたいなものです。
そのため、私はポインタでも配列で使う添え字の方を重用した方が良いと思っています。
アドレスの開始位置の変化しない、配列の記法の方がずっと理解しやすいからです。
投稿2015/06/03 12:36
編集2015/06/03 12:48総合スコア1593
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自分が始めてC言語を学んだときを思い返すと、ポインタ=アドレスという概念自体はすんなり受け入れられたような気がします。
しかし、構造体などと組み合わせたときにデータ構造同士の参照が複雑になってくると理解が及ばなくなった記憶がありますね。(例:木構造、キュー、リンクリスト等)
投稿2015/04/26 05:44
総合スコア1430
0
考えることが多い
ポインタはどこを参照するか(ポインタ型変数の値そのもの)と参照先(間接参照演算子*
で得られるもの)の2つが変更可能なので、cv-qualifierもその双方に対して修飾ができたりで、そこら辺が理解を妨げる要因かなと思います。それだけ思考が増えるので。C++の参照は参照先しか変更できず、どこを参照するかは変更できないので思考が節約できるかもしれません。
配列とポインタの兼ね合い
やむを得なかったとはいえ、配列が3つの例外を除きポインタに読み替えられるのはいろいろと理解を妨げているかな、と思います。コンテナとイテレーターと参照が合体しているようなもんですからね、後発言語的に考えれば。
ひどいのが、入門本における配列の説明ですね。「配列とポインタは密接な関係にある」と書くお馬鹿がいたり(全くの別物)、添字演算子[]
も配列の機能とか大嘘書いている馬鹿がいたり(それはポインタ演算のsyntax sugerだ)。
初心者にとっては出会う本を間違えると一生ポインタが理解できません。Yahoo!知恵袋で回答者をしているのですが、ここが理解できない質問者がものすごく多い。(そもそも独習Cの説明が腐っている、苦しんで覚えるCはましな説明だけど)
セキュリティ
あとはポインタはなんでも出来てしまうので、少しでも設計や実装を誤るだけでバッファーオーバーランからくるメモリー破壊を起こしてしまいます。C標準関数もそのへんうまく扱えないというか、それどころかgets
みたいにどうやっても安全に使えない関数があったりしますし。(C11で_s
付き関数が追加されてましになった)
文法の汚さ
c
1int* p1, p2;//p2はint型
あとコレや、HogeAnimalLoverさん指摘の
c
1int* p; 2int *p;//同じ
や関数ポインタ
c
1typedef int (*func_t)(int, double, const char*, size_t);//型名はfunc_t
に代表されるように文法が絶望的に汚い。
C99のrestrict、C11で配列の最低要素数を関数の引数に指定できるようになったことで少しずつマシになってきてはいますが、残念ながら、C99はともかく、C11に対応した入門書はないに等しい現状があり・・・
教育の問題
授業で教える側の人間の知識がヘタするとC言語標準化以前でストップしていたりするのが「ポインタ分かんない」の間接的な要因かなと。未だにbcc32 5.5.1使っている連中はいい加減滅びてください。
投稿2016/08/06 15:40
編集2016/08/06 15:49総合スコア5852
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
先入観のせいってのもある気がします。
ポインタは難しいってやたら誇張されてる気がします。それによって、ポインタを学ぶときに身構えてしまうんじゃないかと思います。
投稿2016/08/06 15:05
総合スコア20
0
私もポインタ苦手でした。
ポインタの苦手理由のパターンを考えてみました。
パターン1:
使い道がわからない。
パターン2:
通常の変数とポインタの違いがわからない。
パターン3:
ポインタはアドレスっていうけれど...
データ入っているじゃん!?
パターン4:
動的確保
パターン5:
使わなくてもプログラミングできる。
( ただし、グローバル変数等のように、エラー原因になることもよくある。 )
といったところでしょうか。
なぜ、変数があるのにポインタを使うかっていうのがわかりにくい。
私の認識では、
■ データは取得したりした場合、メモリ上に配置される
■ ポインタはコインロッカーの鍵のようなもの
■ 変数の場合は、コインロッカーから荷物を取り出してカゴに入れた状態
っていう感じ。
これなら、すんなり理解できるが、
「ポインタはアドレスである」とか、実際のアドレスを見たりとか。
訳わからん。
となります。
投稿2016/05/18 05:10
総合スコア4962
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
個人的にはポインタを習った後に理解が曖昧なまま構造体へ進み, そのまま構造体のポインタがでてきて
p->x, p->yのような記述を学ぶことでワケがわからなくなるのだと思いますw
他にもポインタと構造体の比較で
int p[5] について単なるpが先頭のアドレスを指す
int q について q はアドレスの入れ物, 実態を使う時はq ポインタ自体にもアドレスがあって...
といったようにいろいろな表記を学ぶせいでワケがわからなくなるのでしょうね
投稿2016/04/22 16:14
退会済みユーザー
総合スコア0
0
例えば、256バイトのデータエリアに、257バイト書き込みをして、プログラムエリアに割当てられていた1バイト破壊や、環境の要素はあるかと思いますが、奇数バイト参照による1バイト桁ずれなど、原因不明に陥りやすい不具合が出やすい点ではないかと思います。
ただデータエリアを、ポインタで参照する分には、高速参照が出来るため重宝します。
なので、ポインタは読み取りだけに使う様に心がけていますが、
C言語の教則本では、配列とポインタを同義語のように受け取ってしまいがちなため、メモリ割当していないポインタを配列代わりに使ってプログラムクラッシュを引き起こしてしまって、原因がよくわからない。
そういったところではないでしょうか。
投稿2015/06/04 07:42
総合スコア440
0
なぜプログラミング言語が必要なのか考えたことがある方はあまりいないと思います。
コンピュータに置けるプログラムとは単なる数値のやりとりを行うだけのものです。
コンピュータの内部動作を知らずにいきなりプログラミングを行おうとすると必ずつまずきます。
特にC言語はコンピュータの数値操作が得意な言語なのでなおさらです。
ポインタとは何か。
ーーーーーーーーーー
◯×◯×◯◯◯◯◯◯
ーーーーーーーーーー
1 2 3 4 5 6 7 8 9 10
メモリには上記のように細かい仕分けに電圧がそれぞれかかっている状態です。
(◯は電圧かかかっている状態、×は電圧がかかっていない状態)
このそれぞれの仕分けにはそれぞれアドレス(番地)が割り振られています。
この仕分けを指し示すのがポインタです。
(Pointerには指針と言う意味があるみたいです。)
そしてポインタを操作するというのがこの仕分けの中の電圧を操作するために使われています。
例えば1番の電圧をなしにする場合は
char *pointer; // アドレスを入れる入れ物を用意
pointer = 1; // 実際にアドレスを入れる
*pointer = 0; // そのアドレスの電圧を0にする
このような操作をすることにより以下のような状態になります。
ーーーーーーーーーー
××◯×◯◯◯◯◯◯
ーーーーーーーーーー
1 2 3 4 5 6 7 8 9 10
たったこれだけのことです。
結論:ポインタは難しくない。
質問者様の質問の意図とは違ったものになったと思いますが、
ポインタに関しての苦手意識を払拭していただけると幸いです。
私の文章に関しまして、間違いなど発見されたらぜひご指摘いただきたいと思います。
乱文・長文失礼致しました。
投稿2015/05/30 03:54
総合スコア50
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/30 12:57
2015/06/01 12:23
2015/06/01 13:14
2015/06/01 13:27
2015/06/01 13:28
2015/07/16 14:29
0
アセンブラをやったことがない人は、ポインタを使うべき場面を想像できないので、なぜこんなものがあるのか...しかもわかりにくいし...となるのではないでしょうか。私は先にアセンブラをやってたので、すんなりわかりましたが。
投稿2015/04/25 08:14
総合スコア973
0
私が思うに、「アドレス」の概念から欠落していると感じます。
そして多くの場合、「アドレス」の必要な場面が思い浮かばないのでモチベーションが上がらないというのもあると思います。
そしてこの概念を導入している(意識しなくてはならない)言語の少なさも影響していると思います。
私は組み込みソフトからソフトの道に入った人間なので、アセンブラをまず覚えねばなりませんでした。しかしアセンブラを知っていると、C言語のポインタなどは拍子抜けするほど簡単です。
でもそのアセンブラはさらに習得困難な言語として知られています。
- ポインタの難しさ
・「アドレス」とは何ぞや、をきちんと説明できる人が少ない
・ある程度ハードウェアの知識がある人が少ない(上記と併せて、教育が充実しない)
・取っつきにくさから苦手意識を「食わず嫌い」で持ってしまう人が多い
・構文にも意味があることを理解しにくい
まとめるとこんな感じでしょうか。ハード周りから触っているようなレガシーなソフト屋がベテランになってきており、新人教育に関わるほど時間が取れないというのも大きい気がします。
投稿2016/08/06 22:09
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ポインタが難しいと言われるのは宣言時と参照時で記号「*」の意味が違うからだと思う。
投稿2016/05/18 05:15
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/18 13:56
2016/05/18 18:13
2016/05/18 20:30
0
ポインタを理解しようとすると、まずアドレスについては理解がいると思います。
次にコーディングするとき、ポインタが分かりにくい直接の原因ではないですが、そもそも構文についてどういう解釈をしているかも関係しているのではと思います。
1.変数宣言を左から解釈する。 int a; /* intのa */
ポインタが分からない人には、宣言について右から解釈するようにと説明してました。
int a; aという名前の器があって、そこにはint型の値が入る
int a; aという名前の器があって、そこにはアドレス()の値が入る。更にそのアドレスにはint型の器がある。
2.インクリメントは1増。 a++; /* 1なら2 */
インクリメントは、aの中身を「型の1単位分増」。
宣言が int a; int(整数)なので、0なら1。
宣言が int *a; *(ポインタ)なので、次のアドレス。元のアドレスにはint分のサイズが必要なので、intが4バイトの場合、0なら4。
更に、a+=2; は2単位分増やす。
あとは配列を理解して、ポインタのポインタ、構造体のポインタ、関数ポインタとか少し練習すれば、だいたい大丈夫な気がします。
投稿2015/06/07 16:13
総合スコア24
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
どなたかの回答にもありますが、C言語のポインタを完全に理解し、人に教えられるまでの
知識を得るにはアセンブラ・アーキテクチャーの理解なくして達成されません。
また、言語の歴史的な背景でいつのまにか許されてしまっている表現なども多く、
組み込み用コンパイラではポインタの概念がアーキテクチャーに依存するため、
「この本を読めば」という本は存在しません。
投稿2015/06/07 08:30
総合スコア33
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
変数に値が1つしか入らないて概念から、
変数アドレス、メモリーアドレスが出てきて、
2つ値をもってるて概念に急に変わるからじゃないですか?
なので、アドレスを指してるのか、中身の値を指してるのか
*の使い方で指してるものが変わるので、何を指してるのかが解れば難解でもなんでもないですね。
ポインタはただの矢印ですよ。
投稿2015/06/04 08:01
総合スコア1021
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。