C言語のポインタが未だに利点が分からないんだが

1: 2019/07/27(土) 04:23:40.799 ID:bBXWf2DQ0
実際何に使うんだ?
そもそもリスト形式を作るのにしか使ったことないんだがリスト形式って何がいいの?

2: 2019/07/27(土) 04:24:27.764 ID:JoUv3lC80
ぬる

3: 2019/07/27(土) 04:25:20.343 ID:TY68jO2G0
抽象化だろ

4: 2019/07/27(土) 04:26:01.515 ID:f04sfz9nr
大学がRAM上のアドレス知識を教えずにプログラミングやらせようとするから
ポインタごときでコケる 
 

5: 2019/07/27(土) 04:26:09.009 ID:59nCJP8t0
複数個の出力を持つ関数を作れる
大きなサイズを持つデータをコピーせずに参照すればRAM使用量が減る

とか

11: 2019/07/27(土) 04:29:09.346 ID:f04sfz9nr
>>5
これ
RAM領域の節約が本来の使用目的
でもそれは8MBのRAMが5万円した時代の話
今の64GB時代だと意味がない

14: 2019/07/27(土) 04:30:19.136 ID:bBXWf2DQ0
>>11
これしかないんか?
ポインタを使ってしか出来ないアルゴリズムがあったりしないもんなんか?

17: 2019/07/27(土) 04:32:37.408 ID:f04sfz9nr
>>14
あとはRAMメモリのロックを切って他のアプリケーションのアドレス情報を取得したり改竄したりするクラッキングぐらいやろ

28: 2019/07/27(土) 04:37:13.165 ID:bBXWf2DQ0
>>17
なるほど、たしかにそういう使い方も出来るか
別な視点で見るとメモリの値いじれるって結構いいかもしれない

ゲームでよくある本来入手できないアイテムを手に入れるメモリ操作バグみたいな

34: 2019/07/27(土) 04:42:42.505 ID:f04sfz9nr
>>28
その代わりメモリのロックを切ると
Windows7以降に警告されるけどな
アンチウィルスソフトも実行データをシークするのにアドレス拾ってる

75 05などを90 90にしてif文やwhile文をぶっ壊してクラッキングするのはパソコンの基本

23: 2019/07/27(土) 04:34:46.153 ID:xXR6y8P80
>>14
複数の戻り値を返す

7: 2019/07/27(土) 04:26:27.820 ID:WXf6Z4q00
知らんけど
次の塊って事か

8: 2019/07/27(土) 04:26:51.600 ID:AqopiygTa
住所だと思えばいい

10: 2019/07/27(土) 04:27:59.753 ID:bBXWf2DQ0
ポインタの概念と使い方は知ってるよ
ただメモリ使用量を減らす以外で画期的なアルゴリズムってあるの?って思って

12: 2019/07/27(土) 04:29:12.255 ID:bBXWf2DQ0
今まで色々作ってきて仕事で役に立ったのは連想配列
ただのハッシュアルゴリズムだけど、完全一致って速度的に神なんやって感動した

13: 2019/07/27(土) 04:30:13.066 ID:xaB7k+fW0
頼むからもうしゃべるなよ
本当に本当に理解したいならアセンブラやれ

16: 2019/07/27(土) 04:31:37.542 ID:bBXWf2DQ0
>>13
アセンブラもやったことあるで
CASLだけど
それをさらに機械語に直してZ80に手打ちで入れたこともある

15: 2019/07/27(土) 04:30:31.556 ID:ecvTvOZ+0
線形リスト構造だろ
一般的なランダムアクセス可能な動的配列より挿入や削除などが高速に出来るってところか

18: 2019/07/27(土) 04:32:42.004 ID:BoiLLdio0
利点もクソもポインタ使わなかったら関数の外の変数をいじれねーじゃにーかよ!

28: 2019/07/27(土) 04:37:13.165 ID:bBXWf2DQ0
>>18
それはCだけの話やろ?
他言語だと基本値渡しやからな
同じ変数名の話してるならクソプログラムになるけどグローバル変数あるし

19: 2019/07/27(土) 04:32:54.944 ID:WXf6Z4q00
Z80だとHLレジスタの事かな?

28: 2019/07/27(土) 04:37:13.165 ID:bBXWf2DQ0
>>19
あれ、HLレジスタって言うのか

21: 2019/07/27(土) 04:34:01.014 ID:HILwMSRq0
ポインタを使えば効率良いアルゴリズムの実装できると思うが、ポインタ使わないと実装できないアルゴリズムなんてないと思うが

26: 2019/07/27(土) 04:35:35.174 ID:xXR6y8P80
>>21
・メモリの動的確保
・再帰

29: 2019/07/27(土) 04:38:16.509 ID:HILwMSRq0
>>26
メモリの確保はアルゴリズムじゃないし
再帰処理もポインタなしで実装可能だぞ

32: 2019/07/27(土) 04:40:52.219 ID:xXR6y8P80
>>29
アルゴリズムですらない時点で必要なんだから、
動的確保が必要なアルゴリズム全てで必要ってことだぞ

ついでに、再帰処理は末尾最適化でループにできる場合を除いて、絶対にポインタ必須だぞ
スタックポインタ引いてるわけだからな

35: 2019/07/27(土) 04:44:02.718 ID:ecvTvOZ+0
>>32
アルゴリズムにメモリの動的確保を前提に書いてあるのなんて見たことないが
例えばなんてアルゴリズムに必要なんだ?

36: 2019/07/27(土) 04:45:18.032 ID:xXR6y8P80
>>35
入力と同じサイズのバッファを必要とするソート処理はメモリを動的確保するだろうが

40: 2019/07/27(土) 04:47:51.947 ID:ecvTvOZ+0
>>36
十分大きいサイズを静的に取るだけでいい
動的にしなければならない理由は?
具体的なアルゴリズム名を教えてくれ論文探すから

44: 2019/07/27(土) 04:50:09.566 ID:xXR6y8P80
>>40
まあそれもそうか

で、関数の再帰呼び出しの際にポインタが必要だってのは?

48: 2019/07/27(土) 04:53:46.573 ID:f04sfz9nr
>>44
にわかだろ
相手にすんな
変数のスコープも理解してないぞそいつ

27: 2019/07/27(土) 04:36:19.649 ID:vbnWUGPOd
Fortran病ってポインタを一切使わずにC言語を書くプログラマがいたそうだからポインタ使わないのは可能だろうな
クソみたいコードになるだろうけど

30: 2019/07/27(土) 04:38:37.811 ID:f04sfz9nr
>>27
その場合は限定のシステムになるから
そもそもアドレスが数えるほどしかない

31: 2019/07/27(土) 04:39:52.261 ID:59nCJP8t0
話をCに限らないのならもう終わりにした方がいい
原始人の石器に画期的な使い方見せてみろって言うのと同じ
何らかの制約があってCを使う中ではポインタに利点はあるけど、それ他の言語でもできるよねって話なら画期的な点などない

37: 2019/07/27(土) 04:46:18.948 ID:h4ywcy1v0
ちょうど俺もポインタとか勉強しようと思ってたから助かる

38: 2019/07/27(土) 04:46:59.327 ID:BoiLLdio0
他の言語では値渡しとか言ってる時点でなにか勘違いをしている
C言語も値渡ししか存在しない
渡されたポインタをいくら書き換えても関数の中でしか書き換わらないんだから

39: 2019/07/27(土) 04:47:03.803 ID:f04sfz9nr
アルゴリズムにポインタは関係無い
無くても全てのアルゴリズムは作れる

ポインタ関係すんのは
バイナリとアセンブリいじくる時だけ
アルゴリズムって言葉を履き違えるな
ハードウェアレベルの操作はアルゴリズムとは言わない

43: 2019/07/27(土) 04:49:47.988 ID:HILwMSRq0
>>39
だよな
アルゴリズムとポインタは全くの別物なのにな

41: 2019/07/27(土) 04:48:12.053 ID:xXR6y8P80
確かに「アルゴリズムに必要」じゃなくて「アルゴリズムの実装に必要」でしかなかったな、すまん

42: 2019/07/27(土) 04:49:11.328 ID:e7O/8ZUYd
C言語のポインタとハードのアドレスが混ざってるスレ

46: 2019/07/27(土) 04:52:35.311 ID:f04sfz9nr
>>42
混ざってねーよ
同じものだよ

45: 2019/07/27(土) 04:51:45.087 ID:f04sfz9nr
動的にアドレス切り換えても高速化は期待できない
高速化するならアフィン変換のほうがいい

アドレス理解してない日本人大卒まみれの会社でポインタ乱用すんのは、ただただスパゲッティシステムを増やしていたずらに混乱させるだけ

50: 2019/07/27(土) 05:05:01.800 ID:BoiLLdio0
なんか勘違いしてた
ポインタの存在意義ね

C言語の黎明期は今みたいに潤沢なハードウェアリソースが無かったから
しかかしそれはプログラムの実行が遅いからソースコード上で最適化しやすくしようとかいう以前に
コンパイル自体が当時はとても大変で、コンパイラを複雑にするとメモリもCPUも食うから
ポインタをソースコード上に明記させることで当時としてはコンパイラのメモリが節約できた
というふうに記憶してる

52: 2019/07/27(土) 05:08:33.240 ID:DzuUZ/VX0
関数ポインタ便利だろべ

53: 2019/07/27(土) 05:14:40.157 ID:BoiLLdio0
というよりコンパイラの最適化がしやすかったと言ったほうが正しいか
まあ少なくともアルゴリズム的な意味では利点は別にない
当時にすでにSmalltalkとかリッチな言語があったわけで
ポインタをプログラマに見せる(ポインタ演算ができる)ことが必然だったわけではないが
まあ作者がコンパイラを最適化するのが単に面倒くさかっただけすらありうる
しかし言語仕様が単純でコンパイラの設計が簡単だったから
様々なハードウェアで採用されたのではないだろうか

54: 2019/07/27(土) 05:15:10.211 ID:092BGx8I0
関数ポインタのジャンプテーブルって便利?

55: 2019/07/27(土) 05:22:25.207 ID:pZtpy7+30
人類が直接ポインタを触れるのっておかしいでしょ
コンパイラが頑張ればいいじゃん、って思ったけど順序が逆なんか

58: 2019/07/27(土) 05:45:36.185 ID:C9amWw/F0
メモリの節約って認識でいいよ