- 1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ]
- なぜポインタで引っかかる人が多いのか
引っかかる人は何に困惑しているのか
- 255 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:02:06 ]
- >>252
>ポインタが分かりづらいのはCの文法が悪いから、とか >それなりのコト言うのかと思えば、ただのアホかよ。 え?それって同じことですよね? 「ポインタが分かりづらいのはCの文法が悪いからだ!」 という意見を煮詰めて行ったら、どのみち 「では、文法をこのように変えたらどうだろうか(例えば232-234のように)」 という意見にならざるを得ないでしょ?
- 256 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:09:36 ]
- // それぞれが読みやすい
typedef int (*PFUNC)(char); typedef PFUNC T[N]; // 混在すると分かり辛い typedef int (*T[N])(char);
- 257 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:48:51 ]
- 混在してると分かりづらくなる文法が悪い?どっちが悪い?混在が悪い?文法が悪い?
- 258 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:58:37 ]
- >>255
ならんよ。 だってその表記を見ても、Cのポインタが 理解できるようになりそうにないもの。 言語変えて済む話ならポインタのない言語を選べばいい。
- 259 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 00:17:00 ]
- >>258
言ってることが矛盾してませんか?あなたにとって、 >ポインタが分かりづらいのはCの文法が悪いから、とか ↑この意見は"それなりの意見"なんですよね?(>>252にそう書いてあるし。) でも、これは「Cの文法を改良すればポインタが分かるようになる」と 言っているのと同じことですよ。 一方であなたは >言語変えて済む話ならポインタのない言語を選べばいい。 と言ってますから、結局あなたは 「Cの文法を改良すればポインタが分かるようになる」 という意見を全否定しているわけです。つまり、あなたは >ポインタが分かりづらいのはCの文法が悪いから、とか ↑この意見を"それなりの意見"としつつも全否定しているわけです。
- 260 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 00:22:48 ]
- ●Cのポインタの文法は分かりづらい
●文法を変えたらもはやCではない これは矛盾しないぞ
- 261 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 00:38:11 ]
- >>260
これはひどいww というのはさておき、 >●Cのポインタの文法は分かりづらい これは単に文法の煩雑さを嘆いているだけであって、 >ポインタが分かりづらいのはCの文法が悪いから、とか ↑この意見とは全く別物ですよね。
- 262 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 06:58:00 ]
- >>259
それなりの意見というのは、少なくとも ポインタで引っかかる理由を言っている点においてそれなり。 それを解決する方法として、別の文法を考えるという アプローチは全否定してるよ。 理由はCのポインタの理解に役立たないから。 そんなに矛盾してる?
- 263 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 07:16:57 ]
- 全否定はつられて言いすぎた。
なにがしかのモデル的に、理解の役に立つならいいんじゃないの? 「僕の考えた宣言の文法はスバラシイんです」 だから何なんだよ?
- 264 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 07:26:12 ]
- Cを普通に勉強すれば済む話。
どっかの馬の骨の自分ルールはもうお腹一杯。しかも読みやすくなってないし。
- 265 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 07:48:01 ]
- >>263
>「僕の考えた宣言の文法はスバラシイんです」 >だから何なんだよ? それだけです。少なくとも>>235みたいな人の役には立ちますよね。 まあ、文法なんて結局は慣れの問題ですが。 >>264 あなたはCの文法に毒されすぎです。結局は慣れの問題に終始しますが、 それにしてもCの文法は「変」ですよ。誰でも一度はそう思うはずです。 熟練するほど忘れていく感覚ですが。
- 266 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 08:11:43 ]
- >>264
>どっかの馬の骨の自分ルールはもうお腹一杯。 「自分ルール」と呼べるほど独りよがりな書き方では無いでしょう。 日本語読みの語順に忠実な表記を採用しているだけです。 ていうか、日本語読みの単なる省略記法です。 ポインタの宣言を日本語読みしたら、「intへのポインタ」 「(戻り値int,引数charの関数)へのポインタ」のように、 必ず「Tへのポインタ」という言い回しをするわけです。よって、 日本語読みに忠実なポインタ宣言の表記法は「T$ p;」とか 「T* p;」になります。 配列の宣言は必ず「Tの配列」という言い回しをしますから、 「T[N] a;」とか「T[ ] a;」という表記法が忠実です。 C#の場合は、配列の宣言はT[ ]ですよね(採用した理由は違うでしょうけど)。 関数の宣言は「戻り値T,引数U1,U2,…,Unの関数」と言いますから、 「T(U1,U2,…,Un) func;」という表記法が忠実です。 これがそんなに「自分ルール」ですかね?
- 267 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 08:16:40 ]
- (長文ゴメンナサイ)
さて、どのような宣言の日本語読みも、構文解析のように分解すれば 「Tへのポインタ」「Tの配列」「戻り値T,引数U1,U2,…,Unの関数」に 分解できますから(ただし、ここでは構造体やクラスは考えないことにします)、 これらに忠実な表記を採用すれば、自動的に日本語読みと同じ語順の宣言になります。 この過程をよく見ると、単に日本語読みの省略記法を作っているだけの話ですよね。 >>229が良い例ですが、宣言されたポインタを理解するとき、あるいは相手に説明するとき、 やっぱり"日本語読み"に直して理解するわけです。それは「>>232-234の表記法に直して理解する」 と言っているのと同じことです。なぜなら、232-234は日本語読みの省略表記だからです。 僕は232-234を強要するつもりはありません。 でも、232-234を無闇に否定する人は、日本語を否定してるのと同じことですよ。
- 268 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 08:54:37 ]
- >それだけです。
だから無意味だっつってんの >少なくとも>>235みたいな人の役には立ちますよね。 立たない。 結局Cの宣言は読めないまま。
- 269 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 09:18:04 ]
- 日本語でしか通用しない新規ルールイラネ。世界中で通用するCをマスターした方がいい。終了。
- 270 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 09:27:21 ]
- Cの文法はよくわからない。たぶん頭のよくない人が作ったんだろう。
よし頭のいい俺がもっといいルールを作ってやろう。 ↓ 出来た!これで皆便利になるし、俺に感心するはずだ。 たぶんこういう思考回路なんだろうな・・・。 まさしく中二病ってやつだな。 見てるこっちが恥ずかしくなるよ。
- 271 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 09:30:46 ]
- 他人のオナニーを見たいわけがない罠
- 272 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 09:42:31 ]
- 俺は目に入るコード量が減るからtypedef使うけど、最初からC言語がその文法だったらと思うな
日本語読みというより、型の遠い順だね(Cもそうなんだけど見ため的に)
- 273 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 10:03:28 ]
- >>232が得意げに自分ルールを披露したら賞賛されるどころか袋叩きにあっててワロタ
- 274 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 10:41:00 ]
- Cの時代は終わってる
- 275 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 11:12:03 ]
- すきにすりゃいいんだけどな
typedefしようがスマートポインタ使おうが 他人が使う事になれば苦労するって話
- 276 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 11:40:44 ]
- 確かにコーディング規約も命名規則もないところで、typedefは使ってほしくはないな
- 277 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 11:57:47 ]
- 個人的はtypedefを探すのにかかる時間次第かな。
2、3分くらいで見つかるようならtypedefして貰う方が読みやすい。
- 278 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 12:44:57 ]
- > typedefを探す
意味が分かんないんだけどどういうこと?
- 279 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 13:05:09 ]
- >>278
日本人ではないな? だからどう、ということもないが
- 280 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 16:04:04 ]
- >>278
ある定義名について、それをtypedefで宣言している文を探す、ということ
- 281 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 16:05:08 ]
- >>279
日本人だよ IDEなら言うまでもなく 非IDEでもタグファイルを作っておけば一瞬 最悪Grepしてもそんなに時間が掛かるものじゃない 探すという感覚が分からないんだよね 強いて言えば coする程ではないが少し気になるものを Webブラウザ上で眺めてるときかな? と思ったりもしたけどそれはtypedefに限った話ではないしなぁ
- 282 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 21:17:44 ]
- 元の定義読んで意図理解する必要があるのは変わらないからな
メモリ確保がごっそり独自になってる事なんて よくある事なんだけど 仕様読んで実装全部書き直して 移植したりとかめんどくせーから嫌いです
- 283 名前: ◆QZaw55cn4c mailto:sage [2010/07/08(木) 23:06:14 ]
- >>265
Cの文法のどの点が変なのかわからない。多分毒されすぎたんですね。 さしつかえなければ教えてください。
- 284 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 23:33:48 ]
- >>268
>だから無意味だっつってんの まあ、ポインタ自体の話をしたい人には無意味でしょうね。 >結局Cの宣言は読めないまま。 ああ、そういう意味なら確かに。あなたは正しい。でも、>>235の >あれ何とかならんかったんか この部分への1つの回答には なってますよね。 >>269 新規ルールではなく、既存のルールです。あなたは既に このルールを使ってます。なぜなら、232-235は日本語読みの 単なる簡略表記に過ぎないからです。 あなたが日本語の語順で関数ポインタなり何なりを捉えたとき、 それは232-235を使っているのと全く同じことです。 あと、英語読みとも親和性は高いですよ。 日本語読みの語順を逆順にしたのが英語読みですから。
- 285 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 23:37:28 ]
- アンカミス...
× 232-235 ○ 232-234 >>270 賞賛される必要はありませんが、無闇に否定されるのは おかしいです。なぜなら、232-234は日本語読みの単なる 簡略表記だからです。これを否定するのは>>229の説明方法を 否定するのと同じことですよ。 >>271 オナニーと言えるほど独りよがりな文法では無いでしょう。 intがN項の配列 a; 戻り値int,引数charの関数へのポインタ pfunc; このような日本語のベタ書きと全く同じ表現をしているのが232-234です。 こういう表現形式を無闇に否定するのは、>>229の説明方法を否定するのと 同じことですよ。
- 286 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 23:50:46 ]
- >>283
関数ポインタ周辺の宣言における表記の語順が、 自然言語の語順から かけ離れているところ。 日本語読みの語順と全然違うし、英語読みの語順とも全然違う。
- 287 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 01:36:19 ]
- 語順はどうでもいいけど
その定義の通るコンパイラ(またはプリコンパイラ)はもう実装出来てんの?
- 288 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 06:35:18 ]
- 反論かと思ったら同じこと繰り返すだけのキチガイか
- 289 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 07:19:55 ]
- 使用と宣言を一致させる、ってのはスルーなの?
- 290 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 10:31:20 ]
- ポインタがわからなくてこのスレ開いたが
もう嫌だ何これorz
- 291 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 12:50:36 ]
- このスレって何について話すスレなの?
- 292 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 13:44:36 ]
- >>281
IDEの機能や、grepを使うのは充分「探す」だろう
- 293 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 16:05:01 ]
- >>290
たとえば、どんな所がわからないの? 引っかかってるところを(それがどうして分からないのか)知る為に、色々教えてくれると思うが
- 294 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 18:23:46 ]
- >>149はいい線いってるね
最終的に型につくならよかった
- 295 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 18:39:53 ]
- >>292
後者はそうだね、自業自得だけど。 でも前者は違うな。 >>292 ↑というアンカーに対し292のレスを探すとは言わないでしょ? カーソル合わせりゃToolTipが表示される(IDE) ← 探すとは言わない クリックすればリンクに飛ぶ(tag) ← 探すとは言わない ページ内を検索する(Grep) ← 探すとは言うかもしれないけど自業自得
- 296 名前: ◆QZaw55cn4c mailto:sage [2010/07/09(金) 19:31:47 ]
- >>286
演算子の結合順位が頭に入っていないと、たしかに読みづらいかもしれません。
- 297 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 19:33:05 ]
- 覚えられなくてカッコを多用
- 298 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 19:50:24 ]
- >>294
int* p;は型についてるように見えるけど int *p;はそう見えない 後者はどう解釈したらいいん?
- 299 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 19:55:23 ]
- 型は宣言から識別子抜いたものだって教わりませんでした?
- 300 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 20:08:56 ]
- >>299
識別子抜いても意味合いは同じじゃない? (int*) int (*) 後者は型についてるように見えない
- 301 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 20:25:53 ]
- 「括弧内の宣言子は、括弧なしの宣言子と同一となるが、
複雑な宣言子の結合が括弧によって変更されることがある。」 演算子の結合順序を変えるような括弧じゃない限り 論じるのは無駄。何を言いたいのかさっぱり不明。
- 302 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 20:47:48 ]
- >>301
記号操作の話ならそれでいいけど、俺は意味論的な話をしてるんだが どうレスしたらいいものか
- 303 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 20:56:16 ]
- セマンティクスとも違う別の何かだろ。
ポインタの話ですらない。
- 304 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:01:15 ]
- 括弧の位置なら単なる文法論の話じゃないのかな。
意味論なんて言うなら、ますます括弧なんて重要じゃない。 要するにどうでもいいような文字の置き方に さも意味があるような話を意味論って言ってるんじゃないのかね。
- 305 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:24:51 ]
- ポインタより重大なのが、
#define N 1 という使用方法。 N かまわず置き換える。
- 306 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:26:55 ]
- 定数なら定数でいいし、文にまで使うのは分かりにくくなると思うけどな
- 307 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:30:21 ]
- >>305へのレスですか?
定数Nを #defineするのは、辞めた方が良いよ。 関数名や、変数名で大文字のNが含まれたら全替えする。 これにより、マクロを含めて#define全面禁止をモットーにした。
- 308 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:32:16 ]
- 本当の意味の定数でいったら、
constは変更不可能なだけで定数じゃない。 #defineが定数にあたるけど、別にどうだっていいよねー。
- 309 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:43:55 ]
- >>302
意味論てのが何か分からんけど、識別子を評価する方法も 型で表現しようとしてるから、*が右に寄るんじゃないか? 言葉遊びするなら、int *pは intへのポインタな変数p、ではなく、 *pとして評価すると(実体があれば?)intの値が得られる識別子p、 という解釈。 関数や配列の宣言も全てそう。 規格の文面なんて後付けだしな。 今テキトーに考えた。
- 310 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:47:39 ]
- >>308
C言語乙
- 311 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:52:45 ]
- >>307
あなたの日本語は間違いではありませんが、内容は嘘ですね。
- 312 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:53:45 ]
- >>298
型を明示する陽表式ではなく、 「この条件を満たす何らかの型」という 陰伏式で解釈したらどうでしょう。 >int *p;はそう見えない ・識別子はpである。 ・pの型は「演算子*による戻り値 *(p) の型がint型であるような、何らかの型」である。…(1) この解釈だと、*は直接的には型に付きません。 ただし、(1)を満たす型はまさに(int*)ですから、 結果的には(int*)型の変数を宣言していることになり、 *は間接的には型についてると言えます。
- 313 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:56:17 ]
- >>309が既に同じこと言ってましたorz
- 314 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 22:17:50 ]
- そんな話してたらまたあのキチガイが出てくるぞ
- 315 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 22:27:15 ]
- >>313
一緒にすんな
- 316 名前:302 mailto:sage [2010/07/09(金) 23:04:10 ]
- >>309,>>312
これだ!!!こんな解釈がほしかった やっと腑に落ちたわ、ありがとう 意味論ってのはあれだ、すまんかった 言葉のアヤってことでw
- 317 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 23:38:07 ]
- >>298
int a,b; a*b a * b a* b a *bすべて同じであるように int* c; int *c; ・・・も同じint * cになる みんなするどいね 例)int *a,b;は結合規則により(一度*が右結合して、型になる) (int ((*a),)b) → int (*a), b;→ int *aと(,)int b int *a→ int *(a)→(a)を評価するとint *が返り値つまり型となる
- 318 名前:デフォルトの名無しさん mailto:sage [2010/07/10(土) 01:04:04 ]
- 昔のCではint *p;のみでint* p;はダメじゃなかったっけ?
- 319 名前:デフォルトの名無しさん mailto:sage [2010/07/10(土) 01:28:20 ]
- >>128でも言われてるな
- 320 名前:デフォルトの名無しさん mailto:sage [2010/07/10(土) 01:52:09 ]
- >>318
存じませんが、K&Rあたりでそう記述されてたからとかそのあたりでしょうか? >>319 ありがとうございます、笑われただけで禁止はされていないみたいですね wikiには方言もあったと書いてるので、これかもしれませんよ まぁ、寝ます
- 321 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 16:06:31 ]
- ひさびさの2ちゃんなんだけどそろそろ前橋ポインタ本を越える文章って出てきた?
- 322 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 16:14:20 ]
- で、そろそろポインタでひっかかるポイント分かったのか?
- 323 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 17:03:51 ]
- ・変数とメモリの関係がイメージ出来ない
・ポインタを絡めた宣言が理解出来ない(しづらい?) 今のところ出て来たポイントはこの辺?
- 324 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 17:22:57 ]
- >>323
よく挙げられる理由の典型例じゃん これじゃ他のポインタスレと変わらんなあ…
- 325 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 17:56:25 ]
- >>322はポインタとポイントを掛けたかっただけでは
- 326 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 18:24:49 ]
- >>
↑ これがポインタ
- 327 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 19:01:40 ]
- C言語のポインタがわかりやすい言語ってある?
- 328 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 19:06:38 ]
- アセンブラへの展開見れば一目瞭然。
- 329 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 21:36:43 ]
- 文法はそう記述したら、そうなるわけだから、詰まる要素ではないだろう
ポインタを知る為にメモリの状態とアドレスをPrintfとか使ってチマチマ やってた時、頭が沸騰しそうだったな 覚える為に、ここら辺の関係ない所で時間がかかり過ぎるのが問題じゃないかな
- 330 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 21:57:43 ]
- 俺はそんなところで時間かから無かったよ
- 331 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 22:05:30 ]
- 文法を理解しているというのなら、
ポインタの中身なんて理解する必要なっしんぐ。 C言語のプロトコルに従って書いてりゃどこでも動くコードのいっちょ上がり。 と言いたいところだが、そうもうまくいかないと思う。
- 332 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 22:15:05 ]
- TOEIC満点のやつは英語で嘘をつかない、なんて保証があると思う?
- 333 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 22:21:55 ]
- 誰か翻訳頼む
- 334 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 23:32:31 ]
- 指を見るな
月を見ろ
- 335 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 01:52:01 ]
- 文字列処理や勉強の時のscanf()で何度も不正な処理起こしたC言語初心者時代
普通の高級言語なら実行時エラー、エラーメッセージで分かる内容のところを いきなりOSからエラー返されたらビビるって
- 336 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 02:21:19 ]
- いや
エラーでりゃましなほうさ
- 337 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 10:28:09 ]
- ポインタ挫折歴3年の俺が来ましたよっと
char *s = "test"; なんでこういうことが出来るのかいまだに理解できない char s[] = "test"; とは違うの?
- 338 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 10:41:38 ]
- >>337
前者と後者は本質的に違う。 前者は読み取り専用領域に置かれた文字列へのポインタを保持している。 後者は【文字の配列】そのもの。 まず、C言語のFAQでも見ようか。 www.kouno.jp/home/c_faq/c6.html#0 www.kouno.jp/home/c_faq/c1.html#32
- 339 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 10:54:02 ]
- どのレベルで分からんのかが分からんなぁ。
ちょっと嘘を交えて言うと "test"は、プログラム開始時にOSが用意してくれる5バイトの 書き換え不可な配列として解釈される。 char *s = "test"; は、アドレスを指す4バイト変数sを作って OSが用意した"test"の先頭のアドレスを代入する。 char s[] = "test";は、OSが用意した"test"と同じサイズの(5バイト) 配列を作って、"test"の内容をコピーする。 違いは大体こんなもん。 どこが嘘かは、興味があるならまた別途。 何故そう書けるのか、と言われると、Cが文法として、 そういう機能を持ってるから、としかよう言わんなぁ。
- 340 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 11:12:20 ]
- int main(int ac, char **av)
{ char *a = "test"; char *b = "test"; char c[] = "test"; char d[] = "test"; printf("%d", a == b); printf("%d", c == d); printf("%d", a == c); return 0; }
- 341 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 11:37:13 ]
- 俺の彼女をボインだ!って言われるようにするにはどうすればいいですか?
- 342 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 12:11:05 ]
- >>337
前者 _s: dc.l __lbl __lbl: dc.b 'test', 0 後者 _s: dc.b 'test', 0
- 343 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 12:11:56 ]
- 引っかかりそうな所には近づかない・逃げるという方法もあるな。
scanfとか初期化式とかは、ポインタと少しは関係あるが、 関係ない部分で引っかかってる感じもする。 あまり関係ない所に全力でぶつかったり、教える側も全力で教えようとしていたら それは学習コストは高くつくに決まっている。 自ら望んで全力で引っかかるのは構わないが、 「なぜ引っかかることを望んだのか」を他人に問い詰めるのは迷惑だ。
- 344 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 12:26:25 ]
- >>341
まず童貞を捨てる。
- 345 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 12:55:12 ]
- char *s="test";
sprintf(s,"Hello world"); 正常に動くようですがこのまま使って大丈夫でしょうか?
- 346 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 12:57:49 ]
- はいはい、ネタは自分の頭の中でやってくれ
それが嫌なら窓を捨ててペンギン村にようこそ
- 347 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 13:00:39 ]
- >>345
だめです。 というより char *s = "test"; という使い方はほとんどしないから忘れてもいいかと。
- 348 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 13:07:40 ]
- const char *s = "fuck me please!!"
ならいいよ
- 349 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 13:39:11 ]
- そこはfackだろ
- 350 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 14:12:44 ]
- >>345
char *s="test"; *s="Hello world"; でいいじゃん
- 351 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 15:00:55 ]
- s="Hello world";
- 352 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 15:11:27 ]
- 配列は関数に渡すとポインタに変換される
ポインタはprintfされるとアドレスに変換される 暗黙に二度の変換を受けるという理不尽な仕様
- 353 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 15:24:41 ]
- おいおい。
全て間違ってる。
- 354 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 16:13:29 ]
- #include <stdio.h>
int main(int ac, char **av) { char *a = "test"; char *b = "test"; char c[] = "test"; char d[] = "test"; printf("%d\n", a == b); printf("%d\n", c == d); printf("%d\n", a == c); c[0] = 'C'; printf("%s\n", c); try{ a[0] = 'A'; printf("%s\n", a); }catch(...){ printf("catch\n"); } return 0; } どうしたら Segmentation fault を出さないように出来ますか?
- 355 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 16:16:22 ]
- cでtrycatchとかありえない
|

|