X



C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ b375-rVGZ)
垢版 |
2017/10/27(金) 21:28:08.20ID:pAogLeJi0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

前スレ
C言語なら俺に聞け 142
http://mevius.2ch.net/test/read.cgi/tech/1502364083/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0208デフォルトの名無しさん (ワッチョイ 7f06-TYjb)
垢版 |
2017/11/10(金) 20:07:11.53ID:f7hdF1Yr0
use the force luke
0209デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/10(金) 20:08:56.37ID:KTiHfL4P0
Ubuntuをインスコできる。
0212デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
垢版 |
2017/11/10(金) 21:09:11.01ID:7i6+bCDW0
配列?
0221デフォルトの名無しさん (ワッチョイ 5f93-B4G6)
垢版 |
2017/11/10(金) 21:53:36.59ID:mQGNgvjy0
コンピュータの中には何百メガとか何ギガとかのバイト数のメモリがあって、
データ(数値や画像や文字列、プログラム自体も)はメモリに記憶されていて、
メモリには1バイトごとに連番のアドレスが割り振られている。

…程度のイメージなら現代じゃ誰でも共有してると思うんだけど。
女学生が携帯電話機を使ったり、子供がゲームをする時だって、
「メモリカードの容量が足りなくなった」とか言うでしょ。

それとも、容量としてのメモリ(どれだけ入れられるのか)は飲み込めても
アドレスという概念(どこに入ってるのか)になると飛躍が必要なのかな。
0223デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
垢版 |
2017/11/10(金) 22:04:11.83ID:bPzBG0Jo0
いわえる宅急便で品物の上に貼るあれよあれがないとどこに送れないか解らないっていうあれ
0226デフォルトの名無しさん (ワッチョイ 5f71-UELA)
垢版 |
2017/11/10(金) 22:21:46.83ID:WKyXN66O0
>>213
じゃあまあざっくりと集合住宅で例えるか

例えば char hoge; と宣言したとする
するとコンピュータは空いてる部屋を1つ、hogeのために割り当ててくれる
仮に部屋番号を301号室としようか
広さは四畳半のワンルーム
君はこの部屋に、'a' でも 'x' でも好きな文字を入れることができる
次に char piyo; と宣言したとする
そしたらやっぱりコンピュータは部屋を割り当ててくれる
部屋番号はhogeと別にしないと被っちゃうから401としよう
間取りは同じ、四畳半のワンルーム
君がchar型の変数を宣言する限り、広さは常に四畳半だ

更に、int foo; と宣言してみよう。
同じように部屋を割り当ててみるが、困ったことにfooは身体が大きくて四畳半に収まりきらない
これはfooがchar型ではなくint型だからだ
そこでコンピュータは隣の3部屋の壁を取っ払って、計4部屋分の広さにしてfooに割り当てる
最初に与えられた部屋番号を501とすると、fooは501,502,503,504の4部屋を占領することになる

このそれぞれの部屋番号が、いわゆるアドレスだ
つまりまずコンピュータに膨大な数の部屋が用意されてて、変数宣言や関数宣言などをするごとに適宜空いてる部屋を割り当てていく
そのときに割り当てられた部屋の部屋番号が、その変数なり関数なりのアドレスとなる
fooみたく複数のアドレスにまたがってる場合は、その先頭アドレス(今回でいうと501)がfooを指定する際のアドレスになる

変数名からその変数に割り当てられたアドレスを知るには、&を使い&hogeや&fooと書く
0227デフォルトの名無しさん (アウアウウー Sa23-P3MY)
垢版 |
2017/11/10(金) 23:20:18.63ID:jSzmIFsta
>>213
一応考えてみた
アドレス= 住所だと考えて
どこでもドア = ポインタ変数そのもの
行きたい場所 = 参照先のアドレス
として
・自分の部屋にどこでもドアを置く = ポインタ変数を宣言する
この時のポインタ変数のアドレス(ドアの置かれてる場所)は自分の部屋
今はまだドアの向こうはどこにも繋がっていない
・どこでもドアの向こう側をしずかちゃんの風呂場にする = ポインタ変数の中身を参照先(しずかちゃんの風呂場)のアドレスに書換える
これでポインタ変数の中身(=ドアの向こう側)はしずかちゃんの風呂場と繋がる
・ドアを開けて風呂場を見る = *を付けてポインタ変数にアクセスする
・ドア自体がどこに置かれてるかを知る = &を付けてポインタ変数にアクセスする
ポインタの嬉しい点はわざわざしずかちゃん家に行かなくても自分の部屋に居ながら
どこでもドアを介して風呂場を覗く事が出来るので移動の時間が省けて時短になる
0228デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/11(土) 00:39:20.61ID:4HyMUlDc0
初心者はたとえ話するのが好き。
0229デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
垢版 |
2017/11/11(土) 01:09:56.98ID:QwHnz2ZY0
>>227
そんななげーの覚えれねーよ
0230デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/11(土) 01:16:01.20ID:4HyMUlDc0
ヘネパタ読破してからプログラミングに進め。
0233デフォルトの名無しさん (ワッチョイ 5f8c-l80d)
垢版 |
2017/11/11(土) 02:43:48.01ID:OXx9+Toc0
ポインタを説明するときにアドレスで説明するのって、初心者による初心者向けの説明に多いけど
それはアドレスを知ってる人向けで、ここからさらにアドレスを一生懸命別の何かで
例えるのはかえって分かりにくいだけにしか思えない
0234デフォルトの名無しさん (ワッチョイ 7f87-ckd2)
垢版 |
2017/11/11(土) 04:15:47.28ID:qvyXx+2n0
喩えるんじゃなくてメモリそのものを教えたほうがいい
0236デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
垢版 |
2017/11/11(土) 04:30:42.45ID:3tqm8fVd0
>>211
マイコン小僧的な意味での理解が必要かもしれないなあ

ポインタ定義した時点で、コンパイラが「アドレスを入れるためのメモリ領域」なり
「CPUのレジスタ」なりを使うようにしてくれる
貴方が int* a = 300; とか書いたら、 コンパイラは300という数字をどこかに保存しておいてくれる
CPUのレジスタか、特定のメモリ領域かは処理系次第だが

で、計算やるってなったら「CPUの間接参照機能」を利用する
アセンブラ側で「間接参照機能を使え」って感じのコードを吐くのよ
そういうオペコードがある

で、間接参照機能を使った場合、CPUはメモリの内容を2バイトか4バイトか見るでしょ
CPUは「今読んだ数字はメモリの番地である」と判断して
CPU側でいてあるメモリ番地の内容を読み込む
で、読んだデータはコンパイラが吐いたアセンブラのコード次第だが

とにかくCPUには「ある数字をメモリなりレジスタから読み、次にそこに書いてた数字をアドレスと判断し、別のメモリアドレスを読む」って機能がある
それを使うのがポインタ

そんな感じ
0239デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
垢版 |
2017/11/11(土) 04:46:59.68ID:3tqm8fVd0
アドレスについては……

Q: たとえばここに 1 2 3 4 って数字があるとするでそ
二番目を起点にして、二つ指差してみて、起点は指差しの対象に含むよ

A: 指差す箇所を[]でくくると 1 [2] [3] 4 になるかと

そんな感じのテキトーさでいいと思います、これがただ例えば0x000F34824になるだけで
0242デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
垢版 |
2017/11/11(土) 04:58:49.86ID:3tqm8fVd0
なお、ポインタのだいたいの使い道は

・クソでかいデータを複数の関数で参照せなあかんとき(画像処理とか)に先頭アドレスだけ渡してあとよろしこって奴
・呼び出し「先」側でなんかセットアップしてもらわなあかんとき、Win32APIあるある
・関数テーブル(30だか50だか、個別に使う関数の先頭アドレスと、そこに飛ばす条件をペアにした配列があるの)
・無名関数もどきのことをやりたいとき、一部分だけ後付け処理やりたいんでそこだけjmpさせて戻る系の奴というか、sortみたいなの

のどれかやな、こんくらいの説明でいいんだろうか? イミフすぎて正直すまんかった
0246デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
垢版 |
2017/11/11(土) 15:25:23.65ID:cTWJmMx00
8bitマイコンみたいなやつだと説明は少し楽になるな。メモリ空間が64KBしかないし。
まあ昔はそれでもバンク切り替えして沢山メモリ使えるようにしていたが、考える上では楽だ。
今はメモリ空間も広大になってメモリブロック切り替えてアドレス変わるのは当たり前だったりして説明が面倒だ。
0253デフォルトの名無しさん (ワッチョイ dfcc-TYjb)
垢版 |
2017/11/11(土) 19:57:56.44ID:Hv/PaJUT0
>>252
懐い...
0254デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/11(土) 23:12:19.01ID:4HyMUlDc0
CASL→C→Java→C++の順でどうぞ。
0255デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
垢版 |
2017/11/12(日) 02:33:10.79ID:0YSprajH0
>>252
な、なぜそれを知っているw
0256デフォルトの名無しさん (ワッチョイ dfcc-TYjb)
垢版 |
2017/11/12(日) 05:22:01.75ID:yBBP+7vl0
SWEET16
0257デフォルトの名無しさん (ワッチョイ 5f8a-gxuN)
垢版 |
2017/11/12(日) 06:32:07.24ID:61B/9ygA0
ポインタの前にアドレスが理解できないってどういうことよ…
アドレス=メモリ上の位置、だよ
例えば64kbのメモリを積んだ機械ならアドレスの全範囲は0x0000〜0xffffだが
そんなこと気にしなくても使えるようにしたから高級言語なのよ

int a;
int *pa;
としたとき、コンパイラはaとpaそれぞれを上記範囲の"どこか"に割り当てる
その"どこか"をaやpaという名前で呼ぶことにするよ、という宣言だから

ただし「変数は"どこか"のアドレスの別名である」ということを"利用"することはできる
pa = &a;
とすれば、paには「aの実際の場所(=アドレス)」が入り
*pa = 123;
とすれば、paが現在指しているアドレス、即ち「aの実際の場所」に123が入る
0258デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 10:09:12.41ID:H0u2BwIs0
お前らが箱とか部屋とか変なこと言いだすから初学者が混乱するんだろ。
0259デフォルトの名無しさん (ワッチョイ 7fa2-Ud84)
垢版 |
2017/11/12(日) 10:18:34.45ID:pV+DiiLQ0
変じゃない説明よろしく
0260デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 10:24:13.57ID:H0u2BwIs0
CASLが基本。
0261デフォルトの名無しさん (ワッチョイ 5fd2-cd7v)
垢版 |
2017/11/12(日) 10:34:03.82ID:534592TW0
ニモニック表片手にハンドアセンブルしてみろ
そうすりゃアセンブラやコンパイラがなにしてるか
馬鹿でもない限りいろいろ分かる
0263デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:23:06.41ID:H0u2BwIs0
アドレスにアドレスは入らないだろ。
0264デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:28:32.94ID:H0u2BwIs0
アドレスを記録位置と言い換えてみたらどうだろうか。
0265デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:30:59.32ID:H0u2BwIs0
メモリーを記録装置、メモリー上のバイトを記録素子、アドレスを記録位置。
どうだい。
0267デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:33:44.56ID:H0u2BwIs0
記録位置の入った素子の位置が入った記録素子。
これなら有りえるとすぐわかる。
0268デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:35:10.76ID:H0u2BwIs0
>>266
ポインタはアドレスではない。
0269デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:40:26.83ID:V8vWJYoP0
物理的な描像にするな。
論理的な本質部分を説明しろ。
0270デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:41:52.30ID:H0u2BwIs0
Cから物理を取り除いたら役に立たない古代文明。
0271デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:43:40.40ID:V8vWJYoP0
ハートは抽象的モデル化しろ。
0272デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:44:09.30ID:V8vWJYoP0
x ハート o ハード
0273デフォルトの名無しさん (ワッチョイ 7f87-ckd2)
垢版 |
2017/11/12(日) 14:48:35.92ID:w0XJ4hAE0
>>265
メモリー上の位置でいいんじゃね?
これがイメージできなきゃ無理
0276デフォルトの名無しさん (ワッチョイ 5f8a-gxuN)
垢版 |
2017/11/12(日) 15:11:05.31ID:61B/9ygA0
○重ポインタという言葉はあまりオススメしない
いくら重ねようが「〜へのポインタ」だ

int a = 123;
int *pa = &a; /* 「int型」へのポインタpa */
int **ppa = &pa; /* 「int型へのポインタ」へのポインタppa */
int ***pppa = &ppa; /* 「int型へのポインタへのポインタ」へのポインタpppa */

参照のイメージ([アドレス][値])
[a][123]
[pa][&a] -> [a][123]
[ppa][&pa] -> [pa][&a] -> [a][123]
[pppa][&ppa] -> [ppa][&pa] -> [pa][&a] -> [a][123]
0277デフォルトの名無しさん (ワッチョイ 5f9f-/Aoa)
垢版 |
2017/11/12(日) 17:57:06.14ID:dvIcUwwY0
確かにポインタは2重以上はなるべく使いたくないな。混乱するし。
0278デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
垢版 |
2017/11/12(日) 18:01:39.60ID:C1sLEmf00
そうだなポインタを文字列の格納だけに使うならアドレスは関係ない
int型で変数を操作するとかなら話は別だけどな
0279デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:02:47.18ID:H0u2BwIs0
二重以上には二重も入るのだが、本当にそれでいいのか?
0281デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:20:47.35ID:H0u2BwIs0
ポインタは型ではないので、二重のポインタという言い方はあり得るのではないか。
0285デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:25:59.93ID:H0u2BwIs0
int型へのポインタに対するchar型へのポインタとかあるのなら紛らわしいという主張も理解できるが。
そんなものは無いので。
***を三重のポインタというのは合理的に見える。
どうだい。
0291デフォルトの名無しさん (ワッチョイ 5fb3-AgpC)
垢版 |
2017/11/12(日) 18:42:31.96ID:VcNgV3aF0
3次元配列を生成して引数に書き戻すような構造なのか
4次元配列を生成して戻すようなのか
各次元で大きさが固定なら 1次元配列にして 添え字演算で4次元にしちゃうな
0294デフォルトの名無しさん (ワッチョイ 5f9f-/Aoa)
垢版 |
2017/11/12(日) 20:33:06.12ID:0YSprajH0
>>280
階層の方が良いか?
0297デフォルトの名無しさん (ワッチョイ 5f8c-JIcl)
垢版 |
2017/11/12(日) 22:26:52.43ID:5J9eZD000
>>294
多分、階層の方がわかりやすいだろうね

int ***p; というポインタ変数pで p[x][y][z] とすると、
*(*(*(p + x) + y) + z)
を参照する。このあたりを分かりやすく言えるといいんだけど
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況