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
探検
C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ b375-rVGZ)
2017/10/27(金) 21:28:08.20ID:pAogLeJi0158デフォルトの名無しさん (ワッチョイ e18a-Dqmo)
2017/11/05(日) 21:09:58.63ID:oA1U3DCD0 putsだと自動的に改行されんのか
>>155
printf() は重い。puts() の方が軽いしコード量も少ない
printf() は重い。puts() の方が軽いしコード量も少ない
160デフォルトの名無しさん (ワッチョイ 9d7f-lboT)
2017/11/05(日) 21:19:49.85ID:Z/yFjIMy0 >>157
stdoutがline bufferedなら、どっちもwriteが3回呼ばれる
言語規格的には解析処理のあるprintfのほうが遅そうだけど
これぐらい単純なprintfだと、gcc/clang辺りでコンパイルするとputsに最適化される
副作用諸々でputs自体の呼び出し回数を減らすことはないから、puts1回の呼び出しで済むprintfのほうが早い
stdoutがline bufferedなら、どっちもwriteが3回呼ばれる
言語規格的には解析処理のあるprintfのほうが遅そうだけど
これぐらい単純なprintfだと、gcc/clang辺りでコンパイルするとputsに最適化される
副作用諸々でputs自体の呼び出し回数を減らすことはないから、puts1回の呼び出しで済むprintfのほうが早い
161デフォルトの名無しさん (ワッチョイ e175-e3AS)
2017/11/05(日) 21:26:10.62ID:pE+6s3oz0 すっげー
物知りだなぁ
物知りだなぁ
>>160
それはさすがになさそうだ…
printf()/vfprint() のCのコードを#include しているわけではなく、単にリンカがランタイムのコードをリンクしているだけなのでは?
いいかえると、printf() がCで書かれており、printf() もコンパイルするのなら最適化がかかるだろうが、さすがにそうじゃないだろう?
それはさすがになさそうだ…
printf()/vfprint() のCのコードを#include しているわけではなく、単にリンカがランタイムのコードをリンクしているだけなのでは?
いいかえると、printf() がCで書かれており、printf() もコンパイルするのなら最適化がかかるだろうが、さすがにそうじゃないだろう?
163デフォルトの名無しさん (ワッチョイ e175-e3AS)
2017/11/05(日) 21:31:03.45ID:pE+6s3oz0 もうさぁ実測でいいよね
164片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-y/PZ)
2017/11/05(日) 21:34:36.83ID:nRtobml0d >>162
はい、時代遅れ発見。LLVMとGCCはお互いに競争する形で最適化の技術を進化させているんだよ。
はい、時代遅れ発見。LLVMとGCCはお互いに競争する形で最適化の技術を進化させているんだよ。
165デフォルトの名無しさん (ワッチョイ 9d7f-lboT)
2017/11/05(日) 21:41:12.14ID:Z/yFjIMy0 gccはビルトイン関数のprintfを持ってるのに、ライブラリをリンクとか何言ってんだコイツ
166デフォルトの名無しさん (ワッチョイ 9d7f-lboT)
2017/11/05(日) 21:43:19.65ID:Z/yFjIMy0 ランタイムのコードをリンクか、どっちにしろアホ晒してるのは変わらんか
168デフォルトの名無しさん (ワッチョイ 2ee8-Q/5A)
2017/11/06(月) 01:36:37.31ID:ixOJFcN/0 いやいや勉強になるわ
169デフォルトの名無しさん (ワッチョイ 4193-ZDq4)
2017/11/06(月) 06:37:53.91ID:uTTN+kxR0 >>167 のリンク先を読んだのだが…
printfで色々条件、最後が改行だったらputsに置き換え、は分かったけど
最後が改行でない場合はfputs( , stdout)に置き換えるわけにいかんのじゃろか?
printfで色々条件、最後が改行だったらputsに置き換え、は分かったけど
最後が改行でない場合はfputs( , stdout)に置き換えるわけにいかんのじゃろか?
170デフォルトの名無しさん (ワッチョイ ad8a-5Y2u)
2017/11/06(月) 08:19:42.45ID:a7D2X9T80 stdoutがフラッシュされるタイミングが改行だから拙いんじゃね
171デフォルトの名無しさん (ワッチョイ 06a1-156W)
2017/11/06(月) 09:46:39.21ID:2hip9t+X0 PC で組むなら、たいした問題にならないリソースの心配よりも、
統一して見やすいように気を使うべきだろうね。
統一して見やすいように気を使うべきだろうね。
172デフォルトの名無しさん (ワッチョイ ad23-nsS3)
2017/11/06(月) 15:24:45.69ID:TqJSXF8C0 >>167
詳しい解説サンクス!
詳しい解説サンクス!
173デフォルトの名無しさん (ワッチョイ 798a-z6xU)
2017/11/06(月) 16:24:18.19ID:Z2s1OQfZ0 fputs(
"文字列1\n"
"文字列2\n"
"文字列3\n"
, stdout
);
"文字列1\n"
"文字列2\n"
"文字列3\n"
, stdout
);
174デフォルトの名無しさん (ワッチョイ 4150-lboT)
2017/11/06(月) 17:25:31.98ID:f1KpQ6jU0 みなさんありがとうございます。
末尾の改行程度しかないprintfはputsに置き換えられるんですね。
ググってみたりもしたんですが、最近のPCであれば速度にほとんど違いが出ない様なことも書いてありました。
171さんの言う通り速度やリソースよりも見やすさや読みやすさの方が大事になりそうですね。
勉強になりました。
末尾の改行程度しかないprintfはputsに置き換えられるんですね。
ググってみたりもしたんですが、最近のPCであれば速度にほとんど違いが出ない様なことも書いてありました。
171さんの言う通り速度やリソースよりも見やすさや読みやすさの方が大事になりそうですね。
勉強になりました。
175デフォルトの名無しさん (ワッチョイ 4502-S32u)
2017/11/07(火) 05:32:04.97ID:2eQgtTM30 塵も積もれば何とやらで
すぐ砂時計だの輪っかだのになるのが
M$の作風
すぐ砂時計だの輪っかだのになるのが
M$の作風
176デフォルトの名無しさん (ワッチョイ 46e7-M99L)
2017/11/07(火) 18:15:10.39ID:pVSOD8mN0 入力が入れる前に厳密にされてないとprintfは怖くて使いたくないなエラーになるし
プログラミング問題とかなら入るの制限されてるから使う時もあるけど
プログラミング問題とかなら入るの制限されてるから使う時もあるけど
177デフォルトの名無しさん (ワッチョイ 99b3-tWDu)
2017/11/08(水) 00:52:24.03ID:+F77Ugxq0 自動で実行ファイルが作成されてその実行ファイルが新しく実行ファイルを作ってその実行ファイルが…
みたいな無限増殖するウイルス的なやつって理論上作れるの?
作る気はないがファイル名を自動で生成して上書きするようしていったら全ファイルが空ファイルになるってのも可能なのか?
みたいな無限増殖するウイルス的なやつって理論上作れるの?
作る気はないがファイル名を自動で生成して上書きするようしていったら全ファイルが空ファイルになるってのも可能なのか?
178デフォルトの名無しさん (ワッチョイ e175-e3AS)
2017/11/08(水) 00:53:30.71ID:Fypp0IbQ0 可能
179片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-y/PZ)
2017/11/08(水) 00:55:32.02ID:TZ5JAUzSd >>177
GetModulePathName+CopyFileで誰でも作れる。違法。
GetModulePathName+CopyFileで誰でも作れる。違法。
180片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-y/PZ)
2017/11/08(水) 02:35:25.82ID:TZ5JAUzSd >>177
全ファイルが空になるというのは、イカタコウイルス。可能だが違法。
全ファイルが空になるというのは、イカタコウイルス。可能だが違法。
181片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-y/PZ)
2017/11/08(水) 02:50:08.78ID:TZ5JAUzSd やり方は直接は教えられないから、Win32APIスレで個別の処理のやり方を細かく質問するといい。
182デフォルトの名無しさん (ワッチョイ 4150-lboT)
2017/11/08(水) 10:05:36.22ID:2J8ZwtJ20 なにこのスレ怖い
183デフォルトの名無しさん (ワッチョイ 5fb3-QPNr)
2017/11/09(木) 00:14:51.16ID:th5mXoJq0 プログラミング全体に言えることだがreturnがよくわからない
戻り値とかはなんとなくわかる
戻り値を表示するわけだからprintf要らずなわけ?
戻り値とかはなんとなくわかる
戻り値を表示するわけだからprintf要らずなわけ?
184デフォルトの名無しさん (ワッチョイ df8a-AcTI)
2017/11/09(木) 00:20:42.43ID:BpTh9vVd0 日本語でok
185デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
2017/11/09(木) 01:05:19.54ID:dSouu86q0 >>177
fork() してプロセス作るの繰り返すだけでいいのでは?ファイル作る必要あるか?
作ったとしてもそのファイルの内容は元のやつと同じなんだろ?
Windows の場合はどうするか知らない。fork() と同じような動きをするAPIがあるなら
それ使えばいい。(cygwinのライブラリ使えばいいか)
fork() してプロセス作るの繰り返すだけでいいのでは?ファイル作る必要あるか?
作ったとしてもそのファイルの内容は元のやつと同じなんだろ?
Windows の場合はどうするか知らない。fork() と同じような動きをするAPIがあるなら
それ使えばいい。(cygwinのライブラリ使えばいいか)
186デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
2017/11/09(木) 01:06:21.38ID:dSouu86q0 >>183
君は return を何か別のものと勘違いしてはいないか?
君は return を何か別のものと勘違いしてはいないか?
187デフォルトの名無しさん (ブーイモ MM83-15/i)
2017/11/09(木) 01:15:30.78ID:ibgaV5zkM188デフォルトの名無しさん (ワッチョイ 5fb3-QPNr)
2017/11/09(木) 01:31:12.69ID:th5mXoJq0 >>187
じゃホント適当なの
int main(void){
int a,b;
scanf("%d %d",&a,&b);
a=a+b;
return a;
}
適当に
基本自分はa=a+bの後の行にprintf("%d",a);って入れるけど戻り値を表示するだけならreturnで十分なの?って聞きたい
じゃホント適当なの
int main(void){
int a,b;
scanf("%d %d",&a,&b);
a=a+b;
return a;
}
適当に
基本自分はa=a+bの後の行にprintf("%d",a);って入れるけど戻り値を表示するだけならreturnで十分なの?って聞きたい
189デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
2017/11/09(木) 01:44:44.36ID:kZJdPPiU0190デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
2017/11/09(木) 01:52:12.46ID:dSouu86q0 >>188
それどこにも何も出力してないよ。一応 main() での return はプログラムを実行した側に
ステータスとして返されたりするがその辺はOSやmain()を呼ぶ側のコード依存だ。
で、それはプログラムの実行中で起きたエラーを伝えるためによく使われている。
0ならエラーなしで1ならエラーみたいに。つまり普通は計算結果を返すためには使わない。
それどこにも何も出力してないよ。一応 main() での return はプログラムを実行した側に
ステータスとして返されたりするがその辺はOSやmain()を呼ぶ側のコード依存だ。
で、それはプログラムの実行中で起きたエラーを伝えるためによく使われている。
0ならエラーなしで1ならエラーみたいに。つまり普通は計算結果を返すためには使わない。
191デフォルトの名無しさん (ワッチョイ 5fb3-QPNr)
2017/11/09(木) 01:52:57.21ID:th5mXoJq0192デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
2017/11/09(木) 02:31:24.91ID:dSouu86q0 >>191
固定と言うか、昔からの慣習で普通は0返すように書くんだよ。UNIXでの慣習ね。Linuxでも同じ。
UNIXではシェルスクリプトで動かした時にエラーかどうかを判定するのに使うことがある。
(シェルの if 文等で直接使える。Windows のコマンドプロンプトでもほぼ同じ)。
0が返されたら正常終了で0以外がエラーね。
まあとにかく歴史的な問題でそうなっていると思って良い。そういう意味では main() からの
return だけは特殊なものだと思っていい。
固定と言うか、昔からの慣習で普通は0返すように書くんだよ。UNIXでの慣習ね。Linuxでも同じ。
UNIXではシェルスクリプトで動かした時にエラーかどうかを判定するのに使うことがある。
(シェルの if 文等で直接使える。Windows のコマンドプロンプトでもほぼ同じ)。
0が返されたら正常終了で0以外がエラーね。
まあとにかく歴史的な問題でそうなっていると思って良い。そういう意味では main() からの
return だけは特殊なものだと思っていい。
193デフォルトの名無しさん (ワッチョイ 5f93-B4G6)
2017/11/09(木) 06:59:07.81ID:tZYUBTdz0 >>188
return a; と書いても基本的にはaの値は表示されないよ。
returnは関数内で計算した結果を呼び出し側に返すだけ。
値を見たければprintf等を使って表示する必要がある。
呼ばれた関数内で(途中経過として)表示するか、
呼び出した側で(関数の結果として)表示するか、は目的次第だが。
main() はOS(WindowsとかLinuxとか)からコマンドとして呼び出される関数、
と考えると分かりやすいかも。
main() 関数のreturnの値はOSに返される。
返された値をどう扱うかはOS側の問題だわね。
return a; と書いても基本的にはaの値は表示されないよ。
returnは関数内で計算した結果を呼び出し側に返すだけ。
値を見たければprintf等を使って表示する必要がある。
呼ばれた関数内で(途中経過として)表示するか、
呼び出した側で(関数の結果として)表示するか、は目的次第だが。
main() はOS(WindowsとかLinuxとか)からコマンドとして呼び出される関数、
と考えると分かりやすいかも。
main() 関数のreturnの値はOSに返される。
返された値をどう扱うかはOS側の問題だわね。
194デフォルトの名無しさん (ワッチョイ 5fb3-AgpC)
2017/11/09(木) 07:02:59.09ID:HmHTv3HB0 return は表示装置に値を戻す(表示する)機能ではない
195デフォルトの名無しさん (ワッチョイ 5f50-TPjW)
2017/11/09(木) 07:18:13.98ID:/m6aHr1P0 >>191
「自作関数を作る」あたりのページで出てくるsum関数でしょ?
あれってただ単に今までmain関数で return 0 しかしていないから、例として同じように書いているだけだと思うよ。
「関数から数値を返す」のページまで行けば return num してるsum関数が出てくるよ。
「自作関数を作る」あたりのページで出てくるsum関数でしょ?
あれってただ単に今までmain関数で return 0 しかしていないから、例として同じように書いているだけだと思うよ。
「関数から数値を返す」のページまで行けば return num してるsum関数が出てくるよ。
196デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
2017/11/09(木) 13:19:13.30ID:U5AasQBn0 print関数だけで表示するだけの関数とかならreturn0するけど衝突判定とかならbool型返したりするからな
197デフォルトの名無しさん (アウーイモ MM23-0J0R)
2017/11/10(金) 15:35:52.06ID:VD/o6LfMM 何ができれば、c使えるって言っていい?
198デフォルトの名無しさん (ガックシ 064f-OZYs)
2017/11/10(金) 15:40:07.94ID:ZWtrLrii6 mallocの実装
199デフォルトの名無しさん (ワッチョイ 5f8a-j5yg)
2017/11/10(金) 15:43:10.76ID:u7W9Owtb0 自分が使っているPCなんかで、
処理を自動で行いたいなと思った時に、
それをC言語を使って実現出来るなら
処理を自動で行いたいなと思った時に、
それをC言語を使って実現出来るなら
200デフォルトの名無しさん (JP 0H53-15/i)
2017/11/10(金) 15:58:26.05ID:VNjqndEHH >>199
それ、OS固有のAPIの知識だらけで、Cがきちんと使える能力は測れない
それ、OS固有のAPIの知識だらけで、Cがきちんと使える能力は測れない
201デフォルトの名無しさん (ワッチョイ 5f8a-j5yg)
2017/11/10(金) 16:06:39.20ID:u7W9Owtb0 実装は知識だけでは出来ないからね
202デフォルトの名無しさん (アウアウカー Sad3-UELA)
2017/11/10(金) 16:34:50.57ID:TjdUuruGa >>197
数年かけてLinuxカーネルを読破できたら
数年かけてLinuxカーネルを読破できたら
203デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/10(金) 16:50:46.00ID:3LbNPw0Wp コールバック関数の型宣言とか、
関数ポインタの扱いを難無く出来るか?
とかかな?
関数ポインタの扱いを難無く出来るか?
とかかな?
204デフォルトの名無しさん (ブーイモ MM83-Q9AV)
2017/11/10(金) 18:00:36.54ID:Dvtc6/jjM Cの限界を感じたら習得したといえる
205デフォルトの名無しさん (ワッチョイ 5fb3-AgpC)
2017/11/10(金) 18:32:02.73ID:23yuj+zi0 p = p() で駆動するようなステートマシンで
自分のポインタを返す関数 と それを保持するポインタの宣言とか
自分のポインタを返す関数 と それを保持するポインタの宣言とか
206デフォルトの名無しさん (ワッチョイ ffe7-bKAn)
2017/11/10(金) 19:29:46.79ID:xd+jRbDd0 Cコンパイラをインストールしまくる。
207デフォルトの名無しさん (ワッチョイ df8a-AcTI)
2017/11/10(金) 19:31:16.24ID:YeFpRpYh0 LISPかforthを作る
208デフォルトの名無しさん (ワッチョイ 7f06-TYjb)
2017/11/10(金) 20:07:11.53ID:f7hdF1Yr0 use the force luke
209デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
2017/11/10(金) 20:08:56.37ID:KTiHfL4P0 Ubuntuをインスコできる。
210デフォルトの名無しさん (ドコグロ MMe3-kkiU)
2017/11/10(金) 20:23:37.84ID:MIqJX5DTM >>200
「きちんと」とか書いてない要件を作り込んでバグだらけのコードを量産する自称玄人乙
「きちんと」とか書いてない要件を作り込んでバグだらけのコードを量産する自称玄人乙
211デフォルトの名無しさん (バットンキン MM73-NkgO)
2017/11/10(金) 21:03:47.59ID:UsP+TtJIM ポインタがわからないです
メモリのアドレスの最初を配列に入れて
呼び出すときそのアドレスの最初を読み込んでデータを引き出すということなんでしょうか?
メモリのアドレスの最初を配列に入れて
呼び出すときそのアドレスの最初を読み込んでデータを引き出すということなんでしょうか?
212デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
2017/11/10(金) 21:09:11.01ID:7i6+bCDW0 配列?
213デフォルトの名無しさん (バットンキン MM73-NkgO)
2017/11/10(金) 21:14:49.24ID:UsP+TtJIM すいません
本当に無知なのでアドレスがよくわかりません
バカにもわかるように教えていただけると嬉しいです
本当に無知なのでアドレスがよくわかりません
バカにもわかるように教えていただけると嬉しいです
214デフォルトの名無しさん (ワッチョイ df61-cd7v)
2017/11/10(金) 21:15:04.33ID:JEFbhK0N0 ポインタの説明で、何かに例えて説明しようとすると余計に混乱する宿命。
215デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/10(金) 21:24:06.37ID:3LbNPw0Wp アドレス=住所
216デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/10(金) 21:24:52.41ID:3LbNPw0Wp 巨大な集合住宅を想像してごらん?
217デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/10(金) 21:25:53.22ID:3LbNPw0Wp しかも1階建ての超長い長屋な。
218デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/10(金) 21:28:10.51ID:3LbNPw0Wp じゃあ、貨物列車の方が良くね?
219デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/10(金) 21:29:46.76ID:3LbNPw0Wp やっぱ、列車だと動くからダメだな。
220デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/10(金) 21:33:05.26ID:3LbNPw0Wp …すまん、まとまらないから誰か頼むわ。
221デフォルトの名無しさん (ワッチョイ 5f93-B4G6)
2017/11/10(金) 21:53:36.59ID:mQGNgvjy0 コンピュータの中には何百メガとか何ギガとかのバイト数のメモリがあって、
データ(数値や画像や文字列、プログラム自体も)はメモリに記憶されていて、
メモリには1バイトごとに連番のアドレスが割り振られている。
…程度のイメージなら現代じゃ誰でも共有してると思うんだけど。
女学生が携帯電話機を使ったり、子供がゲームをする時だって、
「メモリカードの容量が足りなくなった」とか言うでしょ。
それとも、容量としてのメモリ(どれだけ入れられるのか)は飲み込めても
アドレスという概念(どこに入ってるのか)になると飛躍が必要なのかな。
データ(数値や画像や文字列、プログラム自体も)はメモリに記憶されていて、
メモリには1バイトごとに連番のアドレスが割り振られている。
…程度のイメージなら現代じゃ誰でも共有してると思うんだけど。
女学生が携帯電話機を使ったり、子供がゲームをする時だって、
「メモリカードの容量が足りなくなった」とか言うでしょ。
それとも、容量としてのメモリ(どれだけ入れられるのか)は飲み込めても
アドレスという概念(どこに入ってるのか)になると飛躍が必要なのかな。
222デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/10(金) 21:56:49.72ID:3LbNPw0Wp アドレスが住所の意味で、小人さんひとりひとりが住んでる場所を表してて、お手紙を出したりもらったりするのに使うんだよ?
でok?
でok?
223デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
2017/11/10(金) 22:04:11.83ID:bPzBG0Jo0 いわえる宅急便で品物の上に貼るあれよあれがないとどこに送れないか解らないっていうあれ
224デフォルトの名無しさん (ワッチョイ 7f0c-zl2n)
2017/11/10(金) 22:06:56.78ID:k49jiBoo0 RAMやROMにデータがどう書き込まれているのかイメージ出来ているのかな?
225デフォルトの名無しさん (アウアウウー Sa23-P3MY)
2017/11/10(金) 22:19:39.46ID:jSzmIFsta226デフォルトの名無しさん (ワッチョイ 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と書く
じゃあまあざっくりと集合住宅で例えるか
例えば 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と書く
227デフォルトの名無しさん (アウアウウー Sa23-P3MY)
2017/11/10(金) 23:20:18.63ID:jSzmIFsta >>213
一応考えてみた
アドレス= 住所だと考えて
どこでもドア = ポインタ変数そのもの
行きたい場所 = 参照先のアドレス
として
・自分の部屋にどこでもドアを置く = ポインタ変数を宣言する
この時のポインタ変数のアドレス(ドアの置かれてる場所)は自分の部屋
今はまだドアの向こうはどこにも繋がっていない
・どこでもドアの向こう側をしずかちゃんの風呂場にする = ポインタ変数の中身を参照先(しずかちゃんの風呂場)のアドレスに書換える
これでポインタ変数の中身(=ドアの向こう側)はしずかちゃんの風呂場と繋がる
・ドアを開けて風呂場を見る = *を付けてポインタ変数にアクセスする
・ドア自体がどこに置かれてるかを知る = &を付けてポインタ変数にアクセスする
ポインタの嬉しい点はわざわざしずかちゃん家に行かなくても自分の部屋に居ながら
どこでもドアを介して風呂場を覗く事が出来るので移動の時間が省けて時短になる
一応考えてみた
アドレス= 住所だと考えて
どこでもドア = ポインタ変数そのもの
行きたい場所 = 参照先のアドレス
として
・自分の部屋にどこでもドアを置く = ポインタ変数を宣言する
この時のポインタ変数のアドレス(ドアの置かれてる場所)は自分の部屋
今はまだドアの向こうはどこにも繋がっていない
・どこでもドアの向こう側をしずかちゃんの風呂場にする = ポインタ変数の中身を参照先(しずかちゃんの風呂場)のアドレスに書換える
これでポインタ変数の中身(=ドアの向こう側)はしずかちゃんの風呂場と繋がる
・ドアを開けて風呂場を見る = *を付けてポインタ変数にアクセスする
・ドア自体がどこに置かれてるかを知る = &を付けてポインタ変数にアクセスする
ポインタの嬉しい点はわざわざしずかちゃん家に行かなくても自分の部屋に居ながら
どこでもドアを介して風呂場を覗く事が出来るので移動の時間が省けて時短になる
228デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
2017/11/11(土) 00:39:20.61ID:4HyMUlDc0 初心者はたとえ話するのが好き。
229デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
2017/11/11(土) 01:09:56.98ID:QwHnz2ZY0 >>227
そんななげーの覚えれねーよ
そんななげーの覚えれねーよ
230デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
2017/11/11(土) 01:16:01.20ID:4HyMUlDc0 ヘネパタ読破してからプログラミングに進め。
231デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
2017/11/11(土) 01:32:47.13ID:cTWJmMx00232デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
2017/11/11(土) 01:33:46.86ID:cTWJmMx00233デフォルトの名無しさん (ワッチョイ 5f8c-l80d)
2017/11/11(土) 02:43:48.01ID:OXx9+Toc0 ポインタを説明するときにアドレスで説明するのって、初心者による初心者向けの説明に多いけど
それはアドレスを知ってる人向けで、ここからさらにアドレスを一生懸命別の何かで
例えるのはかえって分かりにくいだけにしか思えない
それはアドレスを知ってる人向けで、ここからさらにアドレスを一生懸命別の何かで
例えるのはかえって分かりにくいだけにしか思えない
234デフォルトの名無しさん (ワッチョイ 7f87-ckd2)
2017/11/11(土) 04:15:47.28ID:qvyXx+2n0 喩えるんじゃなくてメモリそのものを教えたほうがいい
235デフォルトの名無しさん (ワッチョイ 7f87-ckd2)
2017/11/11(土) 04:17:53.56ID:qvyXx+2n0236デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
2017/11/11(土) 04:30:42.45ID:3tqm8fVd0 >>211
マイコン小僧的な意味での理解が必要かもしれないなあ
ポインタ定義した時点で、コンパイラが「アドレスを入れるためのメモリ領域」なり
「CPUのレジスタ」なりを使うようにしてくれる
貴方が int* a = 300; とか書いたら、 コンパイラは300という数字をどこかに保存しておいてくれる
CPUのレジスタか、特定のメモリ領域かは処理系次第だが
で、計算やるってなったら「CPUの間接参照機能」を利用する
アセンブラ側で「間接参照機能を使え」って感じのコードを吐くのよ
そういうオペコードがある
で、間接参照機能を使った場合、CPUはメモリの内容を2バイトか4バイトか見るでしょ
CPUは「今読んだ数字はメモリの番地である」と判断して
CPU側でいてあるメモリ番地の内容を読み込む
で、読んだデータはコンパイラが吐いたアセンブラのコード次第だが
とにかくCPUには「ある数字をメモリなりレジスタから読み、次にそこに書いてた数字をアドレスと判断し、別のメモリアドレスを読む」って機能がある
それを使うのがポインタ
そんな感じ
マイコン小僧的な意味での理解が必要かもしれないなあ
ポインタ定義した時点で、コンパイラが「アドレスを入れるためのメモリ領域」なり
「CPUのレジスタ」なりを使うようにしてくれる
貴方が int* a = 300; とか書いたら、 コンパイラは300という数字をどこかに保存しておいてくれる
CPUのレジスタか、特定のメモリ領域かは処理系次第だが
で、計算やるってなったら「CPUの間接参照機能」を利用する
アセンブラ側で「間接参照機能を使え」って感じのコードを吐くのよ
そういうオペコードがある
で、間接参照機能を使った場合、CPUはメモリの内容を2バイトか4バイトか見るでしょ
CPUは「今読んだ数字はメモリの番地である」と判断して
CPU側でいてあるメモリ番地の内容を読み込む
で、読んだデータはコンパイラが吐いたアセンブラのコード次第だが
とにかくCPUには「ある数字をメモリなりレジスタから読み、次にそこに書いてた数字をアドレスと判断し、別のメモリアドレスを読む」って機能がある
それを使うのがポインタ
そんな感じ
237デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
2017/11/11(土) 04:33:00.54ID:3tqm8fVd0 そんな間接参照なんてないです、って処理系もあろうが
Cコンパイラがアセンブラレベルで ご ま か し ま す
ってな話かと
Cコンパイラがアセンブラレベルで ご ま か し ま す
ってな話かと
238デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
2017/11/11(土) 04:36:10.38ID:3tqm8fVd0 眠い時に書くとろくでもねぇ文章になるわーすまん
とりま「CPUの間接参照」で調べてくれ、そっちのほうが早いかも知らん
とりま「CPUの間接参照」で調べてくれ、そっちのほうが早いかも知らん
239デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
2017/11/11(土) 04:46:59.68ID:3tqm8fVd0 アドレスについては……
Q: たとえばここに 1 2 3 4 って数字があるとするでそ
二番目を起点にして、二つ指差してみて、起点は指差しの対象に含むよ
A: 指差す箇所を[]でくくると 1 [2] [3] 4 になるかと
そんな感じのテキトーさでいいと思います、これがただ例えば0x000F34824になるだけで
Q: たとえばここに 1 2 3 4 って数字があるとするでそ
二番目を起点にして、二つ指差してみて、起点は指差しの対象に含むよ
A: 指差す箇所を[]でくくると 1 [2] [3] 4 になるかと
そんな感じのテキトーさでいいと思います、これがただ例えば0x000F34824になるだけで
240デフォルトの名無しさん (ワッチョイ 7f87-1iEE)
2017/11/11(土) 04:57:58.31ID:WAa7vu/G0 アドレスはアドレスだろ。何にもたとえちゃいねーよ。まんまだよ。
241デフォルトの名無しさん (ワッチョイ 7f87-1iEE)
2017/11/11(土) 04:58:31.67ID:WAa7vu/G0 アドレス=住所な。
242デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
2017/11/11(土) 04:58:49.86ID:3tqm8fVd0 なお、ポインタのだいたいの使い道は
・クソでかいデータを複数の関数で参照せなあかんとき(画像処理とか)に先頭アドレスだけ渡してあとよろしこって奴
・呼び出し「先」側でなんかセットアップしてもらわなあかんとき、Win32APIあるある
・関数テーブル(30だか50だか、個別に使う関数の先頭アドレスと、そこに飛ばす条件をペアにした配列があるの)
・無名関数もどきのことをやりたいとき、一部分だけ後付け処理やりたいんでそこだけjmpさせて戻る系の奴というか、sortみたいなの
のどれかやな、こんくらいの説明でいいんだろうか? イミフすぎて正直すまんかった
・クソでかいデータを複数の関数で参照せなあかんとき(画像処理とか)に先頭アドレスだけ渡してあとよろしこって奴
・呼び出し「先」側でなんかセットアップしてもらわなあかんとき、Win32APIあるある
・関数テーブル(30だか50だか、個別に使う関数の先頭アドレスと、そこに飛ばす条件をペアにした配列があるの)
・無名関数もどきのことをやりたいとき、一部分だけ後付け処理やりたいんでそこだけjmpさせて戻る系の奴というか、sortみたいなの
のどれかやな、こんくらいの説明でいいんだろうか? イミフすぎて正直すまんかった
243デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
2017/11/11(土) 13:17:40.59ID:cTWJmMx00 コンピュータの内部構造をどの程度知っている人が相手なのかで説明方法を変えた方が良いように思う。
244デフォルトの名無しさん (ササクッテロレ Sp33-1iEE)
2017/11/11(土) 13:21:55.51ID:Qyuy+YBPp TTLロジックICでアキュムレーター組めるくらいなら…
…あ、多分説明自体不要かw
…あ、多分説明自体不要かw
245デフォルトの名無しさん (ワッチョイ df61-sJj3)
2017/11/11(土) 13:41:35.27ID:6HxAQryE0 初心者は一度バイナリーエディタやメモリエディタを弄ってみることを進める・・・と無責任に言ってみる。
246デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
2017/11/11(土) 15:25:23.65ID:cTWJmMx00 8bitマイコンみたいなやつだと説明は少し楽になるな。メモリ空間が64KBしかないし。
まあ昔はそれでもバンク切り替えして沢山メモリ使えるようにしていたが、考える上では楽だ。
今はメモリ空間も広大になってメモリブロック切り替えてアドレス変わるのは当たり前だったりして説明が面倒だ。
まあ昔はそれでもバンク切り替えして沢山メモリ使えるようにしていたが、考える上では楽だ。
今はメモリ空間も広大になってメモリブロック切り替えてアドレス変わるのは当たり前だったりして説明が面倒だ。
247デフォルトの名無しさん (ワッチョイ df8a-AcTI)
2017/11/11(土) 15:28:20.12ID:ljWP0iHz0 >>245
debug.exe ですね
debug.exe ですね
248デフォルトの名無しさん (ワッチョイ df61-sJj3)
2017/11/11(土) 17:00:50.95ID:6HxAQryE0 MON
*■
*■
249デフォルトの名無しさん (ワッチョイ 5f81-n7le)
2017/11/11(土) 17:08:09.72ID:HnFKgro40 おじいちゃん・・・
250デフォルトの名無しさん (ワッチョイ 7fb3-kkiU)
2017/11/11(土) 17:25:03.39ID:TdmokUpS0251デフォルトの名無しさん (ワッチョイ ffd5-bKAn)
2017/11/11(土) 18:27:36.19ID:2S6WQY7h0 &h■
252デフォルトの名無しさん (ワンミングク MMdf-AcTI)
2017/11/11(土) 18:34:58.95ID:tdhPifsQM CALL -151
253デフォルトの名無しさん (ワッチョイ dfcc-TYjb)
2017/11/11(土) 19:57:56.44ID:Hv/PaJUT0 >>252
懐い...
懐い...
254デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
2017/11/11(土) 23:12:19.01ID:4HyMUlDc0 CASL→C→Java→C++の順でどうぞ。
255デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
2017/11/12(日) 02:33:10.79ID:0YSprajH0 >>252
な、なぜそれを知っているw
な、なぜそれを知っているw
256デフォルトの名無しさん (ワッチョイ dfcc-TYjb)
2017/11/12(日) 05:22:01.75ID:yBBP+7vl0 SWEET16
257デフォルトの名無しさん (ワッチョイ 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が入る
アドレス=メモリ上の位置、だよ
例えば64kbのメモリを積んだ機械ならアドレスの全範囲は0x0000〜0xffffだが
そんなこと気にしなくても使えるようにしたから高級言語なのよ
int a;
int *pa;
としたとき、コンパイラはaとpaそれぞれを上記範囲の"どこか"に割り当てる
その"どこか"をaやpaという名前で呼ぶことにするよ、という宣言だから
ただし「変数は"どこか"のアドレスの別名である」ということを"利用"することはできる
pa = &a;
とすれば、paには「aの実際の場所(=アドレス)」が入り
*pa = 123;
とすれば、paが現在指しているアドレス、即ち「aの実際の場所」に123が入る
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【速報】気象庁は津波注意報すべて解除 [蚤の市★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 働いて参ります
- ( ・᷄ὢ・᷅ )あ?
- 地震
- こんぺこ!こんぺこ!こんぺこ!🐰🏡
- 早大名誉教授「高市内閣の高支持率はデータ操作か、支持している日本人がアホなのか」👈核心を突いてしまう [868050967]
- ブタをぶったたく
