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/
前
http://echo.2ch.net/test/read.cgi/tech/1487757355/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
探検
C言語なら俺に聞け 140 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 6f8c-8ulf)
2017/05/11(木) 22:20:03.99ID:cn414UR90680デフォルトの名無しさん (ワッチョイ b16f-pT0u)
2017/07/01(土) 14:26:57.37ID:jAe4uSb20 出力先のファイルポインタがクックドモードの時だけ変換される
681デフォルトの名無しさん (スップ Sd62-HpRm)
2017/07/01(土) 15:56:17.04ID:9IpZzPucd682デフォルトの名無しさん (ワッチョイ 1911-CicO)
2017/07/04(火) 18:08:24.69ID:K9JgJTrT0 [[[C++]]]
}
001-GOM#\%71/#1,16,2,M,BL,SAJ%\*%U,615325,6,11,62,364,3,21,673,!\0.1,11.5,78,21,6%<<<\BSA\>0>>>%11.27,21,0,73.561,2,3,4,6,1,{\!end
}
001-GOM#\%71/#1,16,2,M,BL,SAJ%\*%U,615325,6,11,62,364,3,21,673,!\0.1,11.5,78,21,6%<<<\BSA\>0>>>%11.27,21,0,73.561,2,3,4,6,1,{\!end
683デフォルトの名無しさん (ワッチョイ 6997-hy1C)
2017/07/04(火) 23:36:19.93ID:ydrc2aV60 テキストファイルは、CR + LFでも読み込んだらLFだけになる。書き込むときCR + LFになる
バイナリファイルは、そんなことにならない
テキストエリアで改行するなど、ファイルとは関係ない場合、CRが必要になる場合がある
バイナリファイルは、そんなことにならない
テキストエリアで改行するなど、ファイルとは関係ない場合、CRが必要になる場合がある
684デフォルトの名無しさん (ドコグロ MM0a-oSf6)
2017/07/05(水) 12:59:27.11ID:63hLHVD1M 初心者の誤った回答の典型
685デフォルトの名無しさん (ワッチョイ 6e1c-4/kT)
2017/07/05(水) 15:35:27.26ID:4h6UtxrL0 ファイルの属性じゃねえもんな
686デフォルトの名無しさん (ワッチョイ 7723-Y2Kr)
2017/07/06(木) 04:58:28.75ID:pM9IP2NJ0 教えて下さいm(_ _"m)
size_t n;
n = (int)n < 0 ? -n : n; /* quick absolute value check */
"<" や "? :" の演算子は調べて分かったのですが、(int)n の部分は
どういう処理を行いますか?
intって宣言するものが、かっこで囲まれていて、なんだこれ!
っていう状態です。
size_t n;
n = (int)n < 0 ? -n : n; /* quick absolute value check */
"<" や "? :" の演算子は調べて分かったのですが、(int)n の部分は
どういう処理を行いますか?
intって宣言するものが、かっこで囲まれていて、なんだこれ!
っていう状態です。
687デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/06(木) 05:47:36.98ID:CwAIhoRS0 キャストだよ
本来size_t型のnを、その場だけintてことにしてくれって要求
ただし本当にintになっちまうわけじゃないから
(int)n = n < 0 ? -n : n; みたいに
代入先にしようとするとエラーだ
コンパイラによっては通るのがあるけどそれは非標準
本来size_t型のnを、その場だけintてことにしてくれって要求
ただし本当にintになっちまうわけじゃないから
(int)n = n < 0 ? -n : n; みたいに
代入先にしようとするとエラーだ
コンパイラによっては通るのがあるけどそれは非標準
688デフォルトの名無しさん (ワッチョイ 7723-Y2Kr)
2017/07/06(木) 05:57:41.52ID:pM9IP2NJ0689デフォルトの名無しさん (ワッチョイ d79a-0UkT)
2017/07/06(木) 08:10:55.85ID:rcg+ZZ7N0 何がしたいコードなのか意味がわからない
690デフォルトの名無しさん (ブーイモ MMbf-w3/P)
2017/07/06(木) 08:12:31.54ID:TeNYF/iwM nが負になりうるならなんでsize_tで宣言するんだろ
691デフォルトの名無しさん (ワッチョイ 9f8f-gRQY)
2017/07/06(木) 08:30:53.10ID:KLsItAo20 ssize_t が標準に欲しいところだよね。
692デフォルトの名無しさん (ワッチョイ 176f-Fmay)
2017/07/06(木) 08:36:29.39ID:c6kgU9bA0 キャストを覚えろ
キャストしない事を覚えろ
キャストをすこしだけする事を覚えろ
キャストしない事を覚えろ
キャストをすこしだけする事を覚えろ
693デフォルトの名無しさん (ドコグロ MMdf-d65a)
2017/07/06(木) 08:37:13.77ID:kIxohS2+M694デフォルトの名無しさん (ドコグロ MMdf-d65a)
2017/07/06(木) 08:41:41.93ID:kIxohS2+M >>691
sizeof と言うコンパイラ組込演算子の戻り値の型がコンパイラに組み込まれていない違和感
sizeof と言うコンパイラ組込演算子の戻り値の型がコンパイラに組み込まれていない違和感
695デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/06(木) 09:45:19.82ID:CwAIhoRS0696デフォルトの名無しさん (JP 0Hab-inuj)
2017/07/06(木) 11:03:13.91ID:TUAsW00PH >>693
出典はここだな。
https://stackoverflow.com/questions/10204471/convert-char-array-to-a-int-number-in-c
問1: この回答者がnの絶対値をとりたくなったときの気持ちを3行で答えよ。
出典はここだな。
https://stackoverflow.com/questions/10204471/convert-char-array-to-a-int-number-in-c
問1: この回答者がnの絶対値をとりたくなったときの気持ちを3行で答えよ。
697デフォルトの名無しさん (ドコグロ MMdf-d65a)
2017/07/06(木) 12:41:49.84ID:kIxohS2+M >>695
> いや組み込まれているが
「コンパイラ(プリプロセッサじゃなくて)」には組み込まれてないだろ
> それが具体的に何型なのかを
> コンパイラの実装者が明らかにせよと
> 規格が要求しているということだ
だからなに?
> いや組み込まれているが
「コンパイラ(プリプロセッサじゃなくて)」には組み込まれてないだろ
> それが具体的に何型なのかを
> コンパイラの実装者が明らかにせよと
> 規格が要求しているということだ
だからなに?
698デフォルトの名無しさん (ワッチョイ f76c-QYYo)
2017/07/06(木) 12:58:54.02ID:Ot0nxXPI0 size_tは__darwin_size_tでトドのつまり、unsighed longだって。
699デフォルトの名無しさん (ドコグロ MM2b-AvV2)
2017/07/06(木) 13:20:12.73ID:SSOSMdMWM700デフォルトの名無しさん (ワッチョイ b7db-TZYB)
2017/07/06(木) 14:53:10.10ID:m/Ia1fy10 >>691
反物質のサイズでも記述する気か?w
反物質のサイズでも記述する気か?w
701デフォルトの名無しさん (アウアウウー Sa5b-pw7F)
2017/07/06(木) 15:09:30.84ID:F+RVqvnpa 【環境】
CS+ + RX62N + E1エミュレータ
【言語】
C言語
上記にてprintf()でCS+のデバッグウィンドウに出力するにはどうすればいいですか?
CS+ + RX62N + E1エミュレータ
【言語】
C言語
上記にてprintf()でCS+のデバッグウィンドウに出力するにはどうすればいいですか?
702デフォルトの名無しさん (スッップ Sdbf-0UkT)
2017/07/06(木) 15:37:45.25ID:H/fupZr5d ここできくないようか?
703デフォルトの名無しさん (アウアウウー Sa5b-pw7F)
2017/07/06(木) 15:51:10.46ID:F+RVqvnpa >>702
printf()ってCの標準関数でしょ?ここでいいのでは?
printf()ってCの標準関数でしょ?ここでいいのでは?
704デフォルトの名無しさん (ワッチョイ d76f-rmcQ)
2017/07/06(木) 16:28:30.82ID:hwRP8VqJ0 ターゲットデバイス上でプログラムを実行するのであって、開発マシン上でプログラムを実行するのではない
705デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/06(木) 17:11:22.36ID:CwAIhoRS0 >>697
おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ
# cl.exeではsize_tがいきなり使えるが、それがおまえの理想か
おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ
# cl.exeではsize_tがいきなり使えるが、それがおまえの理想か
706デフォルトの名無しさん (ドコグロ MMdf-d65a)
2017/07/06(木) 19:16:01.36ID:kIxohS2+M >>705
> # cl.exeではsize_tがいきなり使えるが、それがおまえの理想か
どこの cl.exe なのか知らんけど手元の Visual Studio 2015 Express では未定義の識別子だぞ
> # cl.exeではsize_tがいきなり使えるが、それがおまえの理想か
どこの cl.exe なのか知らんけど手元の Visual Studio 2015 Express では未定義の識別子だぞ
707デフォルトの名無しさん (ワッチョイ 977f-KuRC)
2017/07/06(木) 20:40:37.21ID:fTFUdLH00 >>700
size_tの差を記述したいんだろう。
size_tの差を記述したいんだろう。
708デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
2017/07/06(木) 21:53:15.95ID:GBHzG+Z/0 何も入力されずにenterが押されたらループを終了する方法が分かりません・・・
誰か教えてください・・・
やはりscanfでは出来ませんかね
fgetsだったらできますか?
誰か教えてください、お願いします
誰か教えてください・・・
やはりscanfでは出来ませんかね
fgetsだったらできますか?
誰か教えてください、お願いします
709片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdbf-R88v)
2017/07/06(木) 22:01:35.45ID:TwV4dW80d プロとしては、scanf単独で使うのではなく、fgetsとsscanfの組み合わせをオススメする。
Enterキーのみが入力されたときは、fgetsのバッファには\nが入る。
Enterキーのみが入力されたときは、fgetsのバッファには\nが入る。
710デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/06(木) 22:02:15.40ID:CwAIhoRS0711デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/06(木) 22:03:10.59ID:CwAIhoRS0 つーか+Mはメインの質問に答えてないんだが
712デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/06(木) 22:04:47.65ID:CwAIhoRS0713デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
2017/07/06(木) 22:08:15.36ID:GBHzG+Z/0714デフォルトの名無しさん (ワッチョイ ff4b-zXdO)
2017/07/06(木) 22:13:42.82ID:btC8Tydl0 http://www.c-tipsref.com/reference/stdio/fgets.html
読み取ったものが空だったときfgetsはNULLを返すらしいのでそれを使えばいいかと
読み取ったものが空だったときfgetsはNULLを返すらしいのでそれを使えばいいかと
715デフォルトの名無しさん (ワッチョイ ff4b-zXdO)
2017/07/06(木) 22:17:43.51ID:btC8Tydl0 あ
確かにfgets(s, N, stdin)は改行を含めて読み取るな
じゃあ戻り値をsに格納したときにs[0] <= 0x1fのときループを終了させればいいか
確かにfgets(s, N, stdin)は改行を含めて読み取るな
じゃあ戻り値をsに格納したときにs[0] <= 0x1fのときループを終了させればいいか
716デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
2017/07/06(木) 22:18:05.33ID:GBHzG+Z/0 >>714
ありがとうございます!
ありがとうございます!
717デフォルトの名無しさん (ワッチョイ ff4b-zXdO)
2017/07/06(木) 22:24:35.28ID:btC8Tydl0718デフォルトの名無しさん (ワッチョイ 9f11-d65a)
2017/07/06(木) 22:58:55.19ID:Ksmyoljx0 >>710
スレタイも読めないアホは黙っとけ
スレタイも読めないアホは黙っとけ
719デフォルトの名無しさん (ワッチョイ b7e3-rvkC)
2017/07/06(木) 23:10:54.32ID:mkYh7+Rt0720デフォルトの名無しさん (ワッチョイ b7e3-rvkC)
2017/07/07(金) 00:50:35.73ID:eIaxM4+K0721デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/07(金) 04:21:12.07ID:WdR7zyOW0722デフォルトの名無しさん (アウアウエー Sadf-X9Wr)
2017/07/07(金) 05:29:44.02ID:1OiH67XQa723デフォルトの名無しさん (ドコグロ MMdf-d65a)
2017/07/07(金) 06:45:35.54ID:URSZRmHsM >>721
スレタイも話の流れも読めないアホは黙っとけ w
スレタイも話の流れも読めないアホは黙っとけ w
724デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/07(金) 08:07:53.36ID:WdR7zyOW0725デフォルトの名無しさん (ドコグロ MMdf-d65a)
2017/07/07(金) 08:12:35.70ID:URSZRmHsM アンカーついてるのに誰だよとか
さらにアホさが増してるやん w
さらにアホさが増してるやん w
726デフォルトの名無しさん (ブーイモ MMfb-61p1)
2017/07/07(金) 08:22:53.74ID:o9CZFWTBM 説明不足と読解不足の両方だおまえら
もういいからどっちも黙れ
もういいからどっちも黙れ
727デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
2017/07/07(金) 09:38:36.86ID:WdR7zyOW0728デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 19:49:06.92ID:9n40FStT0 質問です。
http://fast-uploader.com/file/7054979858432/
このプラグラムで関数
void InsertList(struct LIST **ptr ,char *newname,char *newpref,double newdistance);
の部分のポインタのポインタ**ptrを普通のポインタ*ptrにするとコンパイラが通らないのは何故でしょうか?
*ptrに直してコンパイラがエラーとして指摘する場所は
newcell->nextptr=*ptr; /* いままでの先頭ポインタを次ポインタに変更 */
*ptr=newcell; /* 新しいデータ領域を先頭ポインタに変更 */
で、「「struct LIST」型の変数の値を「struct LIST *」型の変数に自動的に変換することはできない」とのことです。
自分の頭の中では**ptrを*ptrにしてもアドレスを渡すという役目はできそうに思うのですがよく解りません。
**ptrと*ptrで型が違うとは具体的にどういう意味で**ptrと*ptrでは何がどう違うんでしょうか?
http://fast-uploader.com/file/7054979858432/
このプラグラムで関数
void InsertList(struct LIST **ptr ,char *newname,char *newpref,double newdistance);
の部分のポインタのポインタ**ptrを普通のポインタ*ptrにするとコンパイラが通らないのは何故でしょうか?
*ptrに直してコンパイラがエラーとして指摘する場所は
newcell->nextptr=*ptr; /* いままでの先頭ポインタを次ポインタに変更 */
*ptr=newcell; /* 新しいデータ領域を先頭ポインタに変更 */
で、「「struct LIST」型の変数の値を「struct LIST *」型の変数に自動的に変換することはできない」とのことです。
自分の頭の中では**ptrを*ptrにしてもアドレスを渡すという役目はできそうに思うのですがよく解りません。
**ptrと*ptrで型が違うとは具体的にどういう意味で**ptrと*ptrでは何がどう違うんでしょうか?
729デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 19:54:32.46ID:w6YiLhhJM 単純に型が違うんどすえ
int a, *b, **c;
これ全部違うんどすえ
a = 728;
b = &a;
c = &b;
int d, *e, **f;
f = c;
e = *c;
d = **c;
どすえ
int a, *b, **c;
これ全部違うんどすえ
a = 728;
b = &a;
c = &b;
int d, *e, **f;
f = c;
e = *c;
d = **c;
どすえ
730デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 20:42:03.04ID:9n40FStT0 >>729
今回のプログラムに当てはめたらどうなるんでしょうか?
int a, *b, **c;
a = 728; = ?
b = &a; = root=NULL
c = &b; = ?
int d, *e, **f;
f = c; = ?
e = *c; = newcell
d = **c; = ?
それとも
a = 728; = ?
b = &a; = ?
c = &b; = root=NULL
int d, *e, **f;
f = c; = ?
e = *c; = newcell
d = **c; = ?
なのでしょうか?
根本的な回答を戴いたようで嬉しいのですが、なにぶん頭が悪くて理解が追いつきません・・・
*1つで型が変わる概念がいまいち理解できません
今回のプログラムに当てはめたらどうなるんでしょうか?
int a, *b, **c;
a = 728; = ?
b = &a; = root=NULL
c = &b; = ?
int d, *e, **f;
f = c; = ?
e = *c; = newcell
d = **c; = ?
それとも
a = 728; = ?
b = &a; = ?
c = &b; = root=NULL
int d, *e, **f;
f = c; = ?
e = *c; = newcell
d = **c; = ?
なのでしょうか?
根本的な回答を戴いたようで嬉しいのですが、なにぶん頭が悪くて理解が追いつきません・・・
*1つで型が変わる概念がいまいち理解できません
731デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 20:59:30.90ID:w6YiLhhJM ごめん、今回のプログラムとやらを一回も見てない
ポインタなんてのはCやる上で基礎の基礎
かつ、ポインタは一生大事に使っていけるお友達なんで
一時間でも二時間でも集中して時間とって
いろいろ調べるなり試すなりして一気に理解してほしい
あと、変数のポインタを渡すっていうのは定番
void foo() {
int x = 100;
bar(&x); // ここで&をつけて…
// ここでxが200になってる
}
void bar(int *p) {
*p = 200; // こっちで*付きで左辺に置いて代入する
}
こうやって呼び出し元の変数の中身を触るのはCでは定番(?)
今回は元のがint xとしたけど、
これがint x, *y, **zでも全部やることは同じ
&yしておいて*y = する
&zしておいて*z = する
ポインタなんてのはCやる上で基礎の基礎
かつ、ポインタは一生大事に使っていけるお友達なんで
一時間でも二時間でも集中して時間とって
いろいろ調べるなり試すなりして一気に理解してほしい
あと、変数のポインタを渡すっていうのは定番
void foo() {
int x = 100;
bar(&x); // ここで&をつけて…
// ここでxが200になってる
}
void bar(int *p) {
*p = 200; // こっちで*付きで左辺に置いて代入する
}
こうやって呼び出し元の変数の中身を触るのはCでは定番(?)
今回は元のがint xとしたけど、
これがint x, *y, **zでも全部やることは同じ
&yしておいて*y = する
&zしておいて*z = する
732デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 21:03:22.53ID:9n40FStT0 もう1週間ぐらいこのプログラムとにらめっこしててそれなりに思いついたワードでググったりはしてるんですが
状況にあってると思えるものが見つからないんです
状況にあってると思えるものが見つからないんです
733デフォルトの名無しさん (アウアウエー Sadf-X9Wr)
2017/07/07(金) 21:35:03.37ID:eVPhxI3Pa 一週間って。。。
才能無いか最低限の文法も理解してない気がする。
一回腰を据えて入門サイトなり入門書読んだ方がいい。
猫でもわかるC言語とかサンプル多くて良いぞ。
才能無いか最低限の文法も理解してない気がする。
一回腰を据えて入門サイトなり入門書読んだ方がいい。
猫でもわかるC言語とかサンプル多くて良いぞ。
734デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 21:36:13.31ID:w6YiLhhJM void InsertList(struct LIST **ptr); // ←このとき
newcell->nextptr=*ptr; // struct LIST *にstruct LIST *を代入している
*ptr=newcell; // struct LIST *にstruct LIST *を代入している
void InsertList(struct LIST *ptr); // ←こうしちゃったとき
newcell->nextptr=*ptr; // struct LIST *にstruct LISTを代入しようとしてエラー
*ptr=newcell; // struct LIST *にstruct LISTを代入しようとしてエラー
int a, *b, **c; // int, int *, int **
a = 728; // int
b = &a; // int *
c = &b; // int **
int d, *e, **f; // int, int *, int **
f = c; // int **
e = *c; // int *
d = **c; // int
変数の宣言と、式の中で*つけたり&つけたりする挙動については
自分でいろいろいじってみて納得いくまで確かめてみてほしい
newcell->nextptr=*ptr; // struct LIST *にstruct LIST *を代入している
*ptr=newcell; // struct LIST *にstruct LIST *を代入している
void InsertList(struct LIST *ptr); // ←こうしちゃったとき
newcell->nextptr=*ptr; // struct LIST *にstruct LISTを代入しようとしてエラー
*ptr=newcell; // struct LIST *にstruct LISTを代入しようとしてエラー
int a, *b, **c; // int, int *, int **
a = 728; // int
b = &a; // int *
c = &b; // int **
int d, *e, **f; // int, int *, int **
f = c; // int **
e = *c; // int *
d = **c; // int
変数の宣言と、式の中で*つけたり&つけたりする挙動については
自分でいろいろいじってみて納得いくまで確かめてみてほしい
735デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 21:39:10.74ID:w6YiLhhJM 逆ぅ!
誤:*ptr=newcell; // struct LIST *にstruct LISTを代入しようとしてエラー
正:*ptr=newcell; // struct LISTにstruct LIST *を代入しようとしてエラー
誤:*ptr=newcell; // struct LIST *にstruct LISTを代入しようとしてエラー
正:*ptr=newcell; // struct LISTにstruct LIST *を代入しようとしてエラー
736デフォルトの名無しさん (ワッチョイ d79a-0UkT)
2017/07/07(金) 21:44:11.61ID:l2MEk1rK0 久々にCを見るとウザいな
737デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 22:02:46.24ID:9n40FStT0 型を合わせるために**ptrにしなければいけないところまでは解ったんですが
頭が悪いものですみません
**ptrだとstruct LIST *になって
*ptrだとstruct LIST になるところがよく解りません・・・
頭が悪いものですみません
**ptrだとstruct LIST *になって
*ptrだとstruct LIST になるところがよく解りません・・・
738デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 22:11:27.39ID:w6YiLhhJM void foo(struct LIST **ptr) {
struct LIST **a = ptr; // struct LIST **型の変数aを宣言して、struct LIST **型の値を代入
struct LIST *b = *ptr; // struct LIST *型の変数bを宣言して、struct LIST *型の値を代入
struct LIST c = **ptr; // struct LIST 型の変数cを宣言して、struct LIST 型の値を代入
}
へんすーの宣言時にくっついてる*と、
へんすーが式の中にでてきてるときにくっついてる*は役割がべつだよ!
分けて考えたほうが多分理解しやすいよ!
struct LIST **a = ptr; // struct LIST **型の変数aを宣言して、struct LIST **型の値を代入
struct LIST *b = *ptr; // struct LIST *型の変数bを宣言して、struct LIST *型の値を代入
struct LIST c = **ptr; // struct LIST 型の変数cを宣言して、struct LIST 型の値を代入
}
へんすーの宣言時にくっついてる*と、
へんすーが式の中にでてきてるときにくっついてる*は役割がべつだよ!
分けて考えたほうが多分理解しやすいよ!
739片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdbf-R88v)
2017/07/07(金) 22:12:23.98ID:TNY1f3mCd 変す〜
740デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/07(金) 22:30:21.67ID:a0p8X5TA0 >>737
マジレスするとお前はCをあきらめたほうがいい。
C言語においてハマりポイントはポインタだと言われてはいるが、
実際は10秒で通過する奴と、永久にはまる奴という感じだ。スクリーニングに近い。
昔みたいにC言語しか選択肢がないのならともかく、現在は他の言語もある。
そこをすんなり理解出来ない奴がCにこだわってもどうせ付いていけない。
てか、あんまり真面目に話を聞いたことはないんだが、
ポインタが分からないって言う奴らは、こいつがはまっているケースじゃないよな?
ちなみに俺が疑問なのは関数ポインタの表記方法で、
俺の感覚は以下ブログ主と全く同じ。
http://fa11enprince.hatenablog.com/entry/2015/11/15/135056
内容は要するに以下。
現行:void (*signal(int sig, void (*func)(int))) (int);
希望:(void (*)(int)) signal(int sig, void (*func)(int));
何で現行の文法になってるのか分かる人いる?
昔、「入れ子だとマクロでも対応できる(キリッ」って聞いたんだけど、
以前考えたら上記「希望」でもマクロ対応出来る感じだったので、謎になってる。
マジレスするとお前はCをあきらめたほうがいい。
C言語においてハマりポイントはポインタだと言われてはいるが、
実際は10秒で通過する奴と、永久にはまる奴という感じだ。スクリーニングに近い。
昔みたいにC言語しか選択肢がないのならともかく、現在は他の言語もある。
そこをすんなり理解出来ない奴がCにこだわってもどうせ付いていけない。
てか、あんまり真面目に話を聞いたことはないんだが、
ポインタが分からないって言う奴らは、こいつがはまっているケースじゃないよな?
ちなみに俺が疑問なのは関数ポインタの表記方法で、
俺の感覚は以下ブログ主と全く同じ。
http://fa11enprince.hatenablog.com/entry/2015/11/15/135056
内容は要するに以下。
現行:void (*signal(int sig, void (*func)(int))) (int);
希望:(void (*)(int)) signal(int sig, void (*func)(int));
何で現行の文法になってるのか分かる人いる?
昔、「入れ子だとマクロでも対応できる(キリッ」って聞いたんだけど、
以前考えたら上記「希望」でもマクロ対応出来る感じだったので、謎になってる。
741デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/07(金) 22:47:31.37ID:a0p8X5TA0 一応ポインタ周りについてググってみた。
> C言語のポインタが難解とされる理由
> https://teratail.com/questions/9058
以前から言われており、上記URL内でも散見されるが、
アセンブラをCよりも先にやった連中は誰一人としてポインタで躓かない。
だからポインタで引っかかる奴は
・ポインタの物理イメージがつかめないから
だと俺は理解していて、そいつが引っかかっているデリファレンス周りではないはず。
ただ、共用体がない言語なら物理イメージを持たずにプログラミングできるから、
それで問題ないとも思う。だから他言語にしろって話にしてる。
> C言語のポインタが難解とされる理由
> https://teratail.com/questions/9058
以前から言われており、上記URL内でも散見されるが、
アセンブラをCよりも先にやった連中は誰一人としてポインタで躓かない。
だからポインタで引っかかる奴は
・ポインタの物理イメージがつかめないから
だと俺は理解していて、そいつが引っかかっているデリファレンス周りではないはず。
ただ、共用体がない言語なら物理イメージを持たずにプログラミングできるから、
それで問題ないとも思う。だから他言語にしろって話にしてる。
742デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 22:51:15.64ID:9n40FStT0 >>738
void foo(struct LIST *ptr)だとどうなるんですか?
void foo(struct LIST *ptr)だとどうなるんですか?
743デフォルトの名無しさん (ワッチョイ d79a-0UkT)
2017/07/07(金) 22:52:13.92ID:l2MEk1rK0 fooとかhogeとかウザい
744デフォルトの名無しさん (ワッチョイ b7db-TZYB)
2017/07/07(金) 22:54:49.07ID:UOx3xuNS0 >>707
そりゃsizediff_tじゃないか?
そりゃsizediff_tじゃないか?
745デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 22:58:53.18ID:w6YiLhhJM >>742
void foo(struct LIST *ptr) {
struct LIST **a = &ptr; // struct LIST **型の変数aを宣言して、struct LIST **型の値を代入
struct LIST *b = ptr; // struct LIST *型の変数bを宣言して、struct LIST *型の値を代入
struct LIST c = *ptr; // struct LIST 型の変数cを宣言して、struct LIST 型の値を代入
}
これでなんとなくわかった?
void foo(struct LIST *ptr) {
struct LIST **a = &ptr; // struct LIST **型の変数aを宣言して、struct LIST **型の値を代入
struct LIST *b = ptr; // struct LIST *型の変数bを宣言して、struct LIST *型の値を代入
struct LIST c = *ptr; // struct LIST 型の変数cを宣言して、struct LIST 型の値を代入
}
これでなんとなくわかった?
746デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 23:01:13.47ID:9n40FStT0 >>745
いえあまり・・・すみません・・・
いえあまり・・・すみません・・・
747デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 23:02:33.34ID:9n40FStT0748デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 23:04:45.62ID:w6YiLhhJM int aとint *bとint **cが別の型なのは分かる?
わからないよね?
b = cの代入がエラーになるのが分からないんだよね?
わからないよね?
b = cの代入がエラーになるのが分からないんだよね?
749デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 23:13:41.64ID:9n40FStT0 >>748
型が違って代入できないのは指摘して頂いたのでわかるんですがどこで型が違ったのかがいまいちよく解らなくて
まぁもちろん関数の**ptrを*ptrにしたところで変わったんだと思うんですがどうして*をつけると型が変わったといえるのかがいまいちよく解らないんです
型が違って代入できないのは指摘して頂いたのでわかるんですがどこで型が違ったのかがいまいちよく解らなくて
まぁもちろん関数の**ptrを*ptrにしたところで変わったんだと思うんですがどうして*をつけると型が変わったといえるのかがいまいちよく解らないんです
750デフォルトの名無しさん (ワッチョイ 97ea-okny)
2017/07/07(金) 23:16:17.01ID:q3zfwuJv0 最近VBAを勉強したんだけど、動作が遅く感じるわ
751デフォルトの名無しさん (ワッチョイ d79a-0UkT)
2017/07/07(金) 23:23:00.08ID:l2MEk1rK0 最近初めてCまで行った
752デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/07(金) 23:24:40.63ID:a0p8X5TA0 >>745
多分君なりのポリシーがあるのだと思うのだけど、
struct LIST **a = &ptr; // (A)
よりも
struct LIST** a = &ptr; // (B)
の方が一般的には分かりやすいのではないかと。
そして宣言 int* i, j, k; でシンタックスエラーを出すまでが様式美。
と思ったけど、K&R確認したら全部(A)だったw
多分君なりのポリシーがあるのだと思うのだけど、
struct LIST **a = &ptr; // (A)
よりも
struct LIST** a = &ptr; // (B)
の方が一般的には分かりやすいのではないかと。
そして宣言 int* i, j, k; でシンタックスエラーを出すまでが様式美。
と思ったけど、K&R確認したら全部(A)だったw
753デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 23:25:06.38ID:w6YiLhhJM うんうん…うん?
int a; // int
int *b; // intへのポインタ 型
int **c; // intへのポインタへのポインタ 型
ここまでわかる?
ここまで変数宣言時に*くっつくと型が変わる例
(こっち側考えないで) = c; // intへのポインタへのポインタ 型
(こっち側考えないで) = *c; // intへのポインタ 型
(こっち側考えないで) = **c; // int 型
ここまでわかる?
ここまで、式の途中で変数に*くっついてると型が変わる例
これだけのこと
int a; // int
int *b; // intへのポインタ 型
int **c; // intへのポインタへのポインタ 型
ここまでわかる?
ここまで変数宣言時に*くっつくと型が変わる例
(こっち側考えないで) = c; // intへのポインタへのポインタ 型
(こっち側考えないで) = *c; // intへのポインタ 型
(こっち側考えないで) = **c; // int 型
ここまでわかる?
ここまで、式の途中で変数に*くっついてると型が変わる例
これだけのこと
754デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 23:26:09.89ID:w6YiLhhJM755デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/07(金) 23:34:50.66ID:a0p8X5TA0 >>754
いや、マジでCの文法は直感的じゃないんだよ。(プログラミング時の論理イメージとずれる)
俺的には(既に書いたが)以下のほうが良かったと思うよ。
(void (*)(int)) signal(int sig, void (*func)(int)); // これで関数ポインタ宣言させろ
int* p, q, r; // これは全部ポインタ宣言にさせろ
とはいえ限られた記号を使って上手くそれなりに整合性良く纏めてあるとは思うが。
いや、マジでCの文法は直感的じゃないんだよ。(プログラミング時の論理イメージとずれる)
俺的には(既に書いたが)以下のほうが良かったと思うよ。
(void (*)(int)) signal(int sig, void (*func)(int)); // これで関数ポインタ宣言させろ
int* p, q, r; // これは全部ポインタ宣言にさせろ
とはいえ限られた記号を使って上手くそれなりに整合性良く纏めてあるとは思うが。
756デフォルトの名無しさん (ワッチョイ 9711-1B52)
2017/07/07(金) 23:37:20.26ID:EA9An3gB0 宣言で ポインタ型を示す時 *
ポインタの指し先の実体を求める時 *
変数のポインタを求める時 &
上2つが文法的にやっかいかな? 同じ記号使ってるし
ポインタの指し先の実体を求める時 *
変数のポインタを求める時 &
上2つが文法的にやっかいかな? 同じ記号使ってるし
757デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 23:38:35.07ID:9n40FStT0 >>753
多分その基本は理解できてると思います
ただstruct LIST *newcellがどうして**ptrと同格に扱われてるのかよく解らないというか・・・
*ptrでアドレスのやり取りできるんじゃないのって思ってしまうんです
でも実際は型が違う
どうして?っという感じです。
多分その基本は理解できてると思います
ただstruct LIST *newcellがどうして**ptrと同格に扱われてるのかよく解らないというか・・・
*ptrでアドレスのやり取りできるんじゃないのって思ってしまうんです
でも実際は型が違う
どうして?っという感じです。
758デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/07(金) 23:45:37.17ID:w6YiLhhJM >>757
ポインタのことをアドレスだと考えるのはやめたほうが良い
ポインタは単なるアドレスなんかじゃないからね
そこには必ず型ってもんがあるの「〜へのポインタ」
ってなるからこそ色々できるんだけどその話は今は省略
> struct LIST *newcellがどうして**ptrと同格に扱われてる
同格に扱うってどういうこと?
ポインタのことをアドレスだと考えるのはやめたほうが良い
ポインタは単なるアドレスなんかじゃないからね
そこには必ず型ってもんがあるの「〜へのポインタ」
ってなるからこそ色々できるんだけどその話は今は省略
> struct LIST *newcellがどうして**ptrと同格に扱われてる
同格に扱うってどういうこと?
759デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/07(金) 23:49:58.38ID:9n40FStT0760デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/07(金) 23:53:32.79ID:a0p8X5TA0761デフォルトの名無しさん (ワッチョイ 9711-1B52)
2017/07/07(金) 23:59:10.17ID:EA9An3gB0 みてないけど >>728 の第一引数は 引数の書き換え結果を呼び出し元に伝えたいケースなんじゃないの?
int の値を受けて その値の1大きい値を返す
引数で受けて書き換え結果を戻り値で返すなら
int func0(int arg) { return arg + 1; }
引数で受けて、引数の指し先を書き換えることで書き換え結果を呼び出し元に伝える
void func1(int* arg) { *arg = (*arg)+1; }
※ なお Cには参照型というのがないので
※ void func2(int arg) { arg = arg+1; } としても呼び出し元には 1増えた値が伝わらない
int a = 1;
a = func0(a); printf("%d\n", a); // a = 2 となる
func1(&a); printf("%d\n", a); // a = 3 となる
func2(a); printf("%d\n", a); // a = 3 のまま
int の値を受けて その値の1大きい値を返す
引数で受けて書き換え結果を戻り値で返すなら
int func0(int arg) { return arg + 1; }
引数で受けて、引数の指し先を書き換えることで書き換え結果を呼び出し元に伝える
void func1(int* arg) { *arg = (*arg)+1; }
※ なお Cには参照型というのがないので
※ void func2(int arg) { arg = arg+1; } としても呼び出し元には 1増えた値が伝わらない
int a = 1;
a = func0(a); printf("%d\n", a); // a = 2 となる
func1(&a); printf("%d\n", a); // a = 3 となる
func2(a); printf("%d\n", a); // a = 3 のまま
762デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/08(土) 00:09:59.34ID:cmJEhNfHM763デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/08(土) 00:21:10.89ID:t7BT1SeM0 誰も見てないのが笑える。俺もだがw
質問者は分かってないようだが、
> 「struct LIST」型の変数の値を「struct LIST *」型の変数に自動的に変換することはできない」 (>>728)
ってのは要するに & か * を忘れたときの典型的なエラーで、
隣に人がいたら「サーセンwwwww」とか言って誤魔化して10秒で修正して再コンパイルする、
ただのtypo。
みんなこれを知ってるから誰もソースなんて見に行きません。
newcell?知らんがな。ソース?見るまでもなく & か * 忘れてるだけだろ、さっさと直せ、って感じ。
とはいえ、エアプがいないのはいいことだね。
質問者は分かってないようだが、
> 「struct LIST」型の変数の値を「struct LIST *」型の変数に自動的に変換することはできない」 (>>728)
ってのは要するに & か * を忘れたときの典型的なエラーで、
隣に人がいたら「サーセンwwwww」とか言って誤魔化して10秒で修正して再コンパイルする、
ただのtypo。
みんなこれを知ってるから誰もソースなんて見に行きません。
newcell?知らんがな。ソース?見るまでもなく & か * 忘れてるだけだろ、さっさと直せ、って感じ。
とはいえ、エアプがいないのはいいことだね。
764デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/08(土) 00:30:18.82ID:P0Vqm6hU0 もしかしてvoid foo1(struct LIST *ptr) {struct LIST *b = ptr;}の場合に*ptrを使うとそれはアドレスを渡すのではなく
実数として渡してしまうから論理破綻しているということですか?
実数として渡してしまうから論理破綻しているということですか?
765デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/08(土) 00:40:47.53ID:cmJEhNfHM やっぱ>>756さんの言ってることが問題な気がする
そういえば俺も最初はそこで混乱あったような気がする
int a = 100;
int *b = &a; // 1) intへのポインタ型のbに、intへのポインタを代入している
*b = 200; // 2) bが指してたint型の領域に、200を代入
printf("%d %d", a, *b);
ここなんだよなぁ
1)と2)が見た目似てるくせにやってることがテラ違うという
なんか懐かしいわ
そういえば俺も最初はそこで混乱あったような気がする
int a = 100;
int *b = &a; // 1) intへのポインタ型のbに、intへのポインタを代入している
*b = 200; // 2) bが指してたint型の領域に、200を代入
printf("%d %d", a, *b);
ここなんだよなぁ
1)と2)が見た目似てるくせにやってることがテラ違うという
なんか懐かしいわ
766デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/08(土) 00:41:41.51ID:t7BT1SeM0 >>761
× > ※ なお Cには参照型というのがないので
○ 参照が必要な場合は、ポインタを使って明示的に参照を渡す
だね。そしてC++の「参照」とJava等の「参照型」の物理的意味が異なるから
余計に話がおかしくなり、辻褄を合わせるために
「参照の値渡し(キリッ」とか言い出すという。
とりあえず生Cで「参照」という言葉は使われてないでしょ。
それを持ち出すのは余計に混乱するだけ。
K&R確認してみたが、
「Fortranのようなcall by referenceとは違い」のところでしか出て来ない。
これのおかげかFortranは再帰できない糞言語だった。(と聞いている)
そんな糞とは違う、まさに「ザクとは違うのだよ、ザクとは」の文脈で使われてる。
見た目だけ参照型が欲しければtypedefすればいいだけ。
(普通は余計に分かりにくくなるからしないが)
それをここで持ち出す意味が分からんね。
× > ※ なお Cには参照型というのがないので
○ 参照が必要な場合は、ポインタを使って明示的に参照を渡す
だね。そしてC++の「参照」とJava等の「参照型」の物理的意味が異なるから
余計に話がおかしくなり、辻褄を合わせるために
「参照の値渡し(キリッ」とか言い出すという。
とりあえず生Cで「参照」という言葉は使われてないでしょ。
それを持ち出すのは余計に混乱するだけ。
K&R確認してみたが、
「Fortranのようなcall by referenceとは違い」のところでしか出て来ない。
これのおかげかFortranは再帰できない糞言語だった。(と聞いている)
そんな糞とは違う、まさに「ザクとは違うのだよ、ザクとは」の文脈で使われてる。
見た目だけ参照型が欲しければtypedefすればいいだけ。
(普通は余計に分かりにくくなるからしないが)
それをここで持ち出す意味が分からんね。
767デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/08(土) 00:46:30.43ID:t7BT1SeM0768デフォルトの名無しさん (ワッチョイ 9711-1B52)
2017/07/08(土) 00:47:46.49ID:gQ2FFwnX0769デフォルトの名無しさん (ワッチョイ 976f-qSys)
2017/07/08(土) 00:50:34.05ID:YHFGbdic0 >>764
関数の引数で渡されるのは"同値のコピー"なのよ
void func1(int b) {...}
void func2(void) {
int a = 100;
func1(a);
}
func2からaを引数として関数func1に渡すと、func1では「aと同じ内容のコピーb」が用意される
func1内でどれだけbを書き換えようが所詮コピーなのでfunc1を抜ければbは破棄されaにはなんら影響がない
a自体を書き換えさせたいならaの内容ではなくaの場所を教える必要がある
それを実現するのがポインタで上の例なら
void func1(int *b) {...}
void func2(void) {
int a = 100;
func1(&a);
}
となりキミの当初の質問にも同じことが言える
*が何個重なろうが理由は同じ
関数の引数で渡されるのは"同値のコピー"なのよ
void func1(int b) {...}
void func2(void) {
int a = 100;
func1(a);
}
func2からaを引数として関数func1に渡すと、func1では「aと同じ内容のコピーb」が用意される
func1内でどれだけbを書き換えようが所詮コピーなのでfunc1を抜ければbは破棄されaにはなんら影響がない
a自体を書き換えさせたいならaの内容ではなくaの場所を教える必要がある
それを実現するのがポインタで上の例なら
void func1(int *b) {...}
void func2(void) {
int a = 100;
func1(&a);
}
となりキミの当初の質問にも同じことが言える
*が何個重なろうが理由は同じ
770デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/08(土) 01:02:46.45ID:t7BT1SeM0 つか質問者はC言語以外には何ができるんだ?
>>768
なんか噛み付いた感じになってすまんかった。
他言語ができれば「参照」の説明は意味はある。
この可能性を忘れていた。
ただまあ、Cはやっぱりその辺のところが古くて、
現実的に構造体の値渡しなんてほぼやらないし、(つか、必要性がない)
他言語みたいに「構造体は参照渡し」で固定してよかったと思うよ。
まだ黎明期でその辺のプログラミング作法自体がなかった時代だから無理ではあるが。
>>768
なんか噛み付いた感じになってすまんかった。
他言語ができれば「参照」の説明は意味はある。
この可能性を忘れていた。
ただまあ、Cはやっぱりその辺のところが古くて、
現実的に構造体の値渡しなんてほぼやらないし、(つか、必要性がない)
他言語みたいに「構造体は参照渡し」で固定してよかったと思うよ。
まだ黎明期でその辺のプログラミング作法自体がなかった時代だから無理ではあるが。
771デフォルトの名無しさん (ワッチョイ 97c1-1B52)
2017/07/08(土) 01:26:26.98ID:P0Vqm6hU0772デフォルトの名無しさん (ワッチョイ 9711-1B52)
2017/07/08(土) 01:30:54.87ID:gQ2FFwnX0773デフォルトの名無しさん (ワッチョイ 9fd7-Srbl)
2017/07/08(土) 01:43:27.53ID:zuW254gH0 >>728
俺もまだ見てないのだがw
**ptrを*ptrにしてもアドレスを渡すという役目はできます。その通りです。
void *ptrでもいいです。コンパイルエラーになるのはその後なのです。
あくまで処理に必要なのは struct LIST ** なので、キャストするなどすればコンパイルは通ります。
void *ptrで受けて struct LIST **_ptr = ptr; と代入して、以降_ptrを使うという方法もあります。
俺もまだ見てないのだがw
**ptrを*ptrにしてもアドレスを渡すという役目はできます。その通りです。
void *ptrでもいいです。コンパイルエラーになるのはその後なのです。
あくまで処理に必要なのは struct LIST ** なので、キャストするなどすればコンパイルは通ります。
void *ptrで受けて struct LIST **_ptr = ptr; と代入して、以降_ptrを使うという方法もあります。
774デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/08(土) 01:57:31.44ID:t7BT1SeM0 >>756
>>765
一応それは違うというほど違わなくて、だからって共通でいいのか?とも思うが、
そこを共通にしてしまっているから宗教論争になってる。
同様なものに「配列と配列へのポインタ」がある。
俺はやっぱり、
int* b = &a; // int*型(=intへのポインタ型)の変数 b に a のアドレスを代入
の方が好きだし、実際こう書く奴の方が多い。(と俺は思っている)
ただ、Cの文法的には765の記述が正しく、*はintではなくbと結合する。
ただし解釈は異なり、それはあくまでデリファレンスであり「宣言のときだけは別」ではない。
int a = 100;
int *b = &a; // 1回デリファレンスすると int になる b という変数に a のアドレスを代入
*b = 200; // bを1回デリファレンスしたもの(つまり100)に200を上書き
K&Rには*は逆参照演算子としか書いておらず、説明文は
> int *ip;
> は記号表現として、*ipという表現がintであることを表す。
となっている。
>>765
一応それは違うというほど違わなくて、だからって共通でいいのか?とも思うが、
そこを共通にしてしまっているから宗教論争になってる。
同様なものに「配列と配列へのポインタ」がある。
俺はやっぱり、
int* b = &a; // int*型(=intへのポインタ型)の変数 b に a のアドレスを代入
の方が好きだし、実際こう書く奴の方が多い。(と俺は思っている)
ただ、Cの文法的には765の記述が正しく、*はintではなくbと結合する。
ただし解釈は異なり、それはあくまでデリファレンスであり「宣言のときだけは別」ではない。
int a = 100;
int *b = &a; // 1回デリファレンスすると int になる b という変数に a のアドレスを代入
*b = 200; // bを1回デリファレンスしたもの(つまり100)に200を上書き
K&Rには*は逆参照演算子としか書いておらず、説明文は
> int *ip;
> は記号表現として、*ipという表現がintであることを表す。
となっている。
775デフォルトの名無しさん (ワッチョイ 97b6-zXdO)
2017/07/08(土) 06:16:14.83ID:utlt5XjQ0 >>774
自分もC言語覚えたての頃は、「int *」型という風に見ていた。
ポインタがあるんだからポインタを表す型がある方がわかりやすかった
イントロダクションとしてはポインタ型があるとみなしていいと思う。
でも言語仕様はK&Rのとおりで、初心者になる頃には正しく
理解できるほうがいい
自分もC言語覚えたての頃は、「int *」型という風に見ていた。
ポインタがあるんだからポインタを表す型がある方がわかりやすかった
イントロダクションとしてはポインタ型があるとみなしていいと思う。
でも言語仕様はK&Rのとおりで、初心者になる頃には正しく
理解できるほうがいい
776デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/08(土) 07:24:02.64ID:t7BT1SeM0 >>775
確認してみたが、ほとんどのサイトは int* p; ではなく int *p; だった。
有名どころではロベールが前者だが、他はほぼ全部後者。
C#は前者に仕様変更されている。
> int* p1, p2, p3; // Ok
> int *p1, *p2, *p3; // Invalid in C#
> https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/unsafe-code-pointers/pointer-types
特にint*型という理解で苦労した覚えはないが、(int *p, *q, *r;のみ例外)
文法的にはどうしても上記が引っかかるので説明サイトはほぼ全部後者になったのかな?
で、ヘルスバーグは糞だと判断して変更したと。
確認してみたが、ほとんどのサイトは int* p; ではなく int *p; だった。
有名どころではロベールが前者だが、他はほぼ全部後者。
C#は前者に仕様変更されている。
> int* p1, p2, p3; // Ok
> int *p1, *p2, *p3; // Invalid in C#
> https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/unsafe-code-pointers/pointer-types
特にint*型という理解で苦労した覚えはないが、(int *p, *q, *r;のみ例外)
文法的にはどうしても上記が引っかかるので説明サイトはほぼ全部後者になったのかな?
で、ヘルスバーグは糞だと判断して変更したと。
777デフォルトの名無しさん (ワッチョイ 7732-zXdO)
2017/07/08(土) 07:33:48.69ID:BPlXEDNj0 型に*を付けるのはC++の文化じゃないかな
Cだと識別子に付けるのが一般的だと思う
Cだと識別子に付けるのが一般的だと思う
778デフォルトの名無しさん (ワッチョイ 9723-KuRC)
2017/07/08(土) 07:46:29.64ID:t7BT1SeM0779デフォルトの名無しさん (ワッチョイ d79a-0UkT)
2017/07/08(土) 08:10:56.15ID:hvS2v9rj0 int*p;
int * q;
は少数派か
int * q;
は少数派か
780デフォルトの名無しさん (ワイモマー MMbf-VsG/)
2017/07/08(土) 09:38:58.20ID:cmJEhNfHM■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】習主席とトランプ大統領が電話会談 台湾問題について [ニョキニョキ★]
- 【東京・足立の車暴走】赤信号無視か 危険運転致死傷疑いも視野に捜査 逮捕された職業不詳の男性(37)は精神疾患で通院歴も ★2 [ぐれ★]
- 人生初黒星の神童、那須川天心がリング上で土下座 [牛丼★]
- 中国人「『日本は危ないから行かないように』と言われたが、日本に来たらとても安全だった」 [お断り★]
- 毛寧(もう・ねい)報道官 「日本は実際の行動で対話への誠意を示すべき」 中国、高市首相に改めて発言撤回を要求 [ぐれ★]
- お布施の75%が葬儀社の手数料に 価格表を入手 僧侶も警鐘 [ぐれ★]
- 「琉球有事は中国有事」 中国のネトウヨが拡散 これには日本のネトウヨ叩きのめされる [241672384]
- ネトウヨの本心「ぶっちゃけLGBT推進を取り消すとか自分に関係ないしどうでもいい。そんな事よりJK、JCとヤッてもOKな世の中に戻せ!」 [377482965]
- 【号外】習近平、米大統領のトランプと首脳会談を行う!日本のの武力による台湾脅しついて共有の追及をする意思統一でおこなう [339712612]
- ミャンマー軍事政権「日本にはアジアで犯した罪に対する反省や責任感がない」高市答弁を批判 [834922174]
- まったりおじゃる丸待機スレ🏡
- 【速報】高市「アタシぜっったい謝らないからッ!!」→中国焦る [308389511]
