C言語なら俺に聞け 153

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 5fba-LL4R)
垢版 |
2019/08/17(土) 23:02:42.00ID:tN5mSQYg0
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/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
※前スレ
C言語なら俺に聞け 152
https://mevius.5ch.net/test/read.cgi/tech/1560763630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/11/19(火) 13:59:41.39ID:9idMfLVKM
ポインタのポインタ **p
配列へのポインタ (*p)[]
ポインタの配列 *p[]
303デフォルトの名無しさん (ワイーワ2 FFca-/nAh)
垢版 |
2019/11/19(火) 14:08:13.34ID:8naC8O/UF
>>300 みたいなのを炙り出せたのであれば
レスに意味があったと言えよう
2019/11/19(火) 19:58:13.32ID:r9zE5eVQM
>>301
めんどいだけでポインタのポインタでも2次元配列かけるでしょ?
勘違いってどういうとこ?
2019/11/19(火) 20:13:13.80ID:O502C4IMd
>>304
本人か?
char a[2][2],**b=a;
これが勘違いでないとまだぬかすか?
頭がバカなのか、それともトンマなのか、どっちだ?
2019/11/19(火) 20:14:48.63ID:r9zE5eVQM
>>305
そんなん知らんわ
予想の斜め上だ
307デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/19(火) 20:16:56.03ID:c65LTQ+sa
>>299
アセンブラやったことのない人は中々正しく理解できないようで、それでポインタの事だけ書いてある本が沢山出ちゃうんだろうな。
308デフォルトの名無しさん (アークセー Sx11-9KXC)
垢版 |
2019/11/19(火) 21:33:52.66ID:pHwegslWx
何年も書かないと忘れるな〜

ポインタのポインタは、ポインタの値を参照渡しするときくらいしか思いつかん

char *p;
foo(&p);

void foo(char **p) {…}

みたいな、
305のような書き方はピンとこないわ
2019/11/19(火) 21:36:01.90ID:+Tz70BZqM
>>304
書けるかどうかじゃなくて
> 唯一正統と強弁するアホが
いたって話でしょ
2019/11/19(火) 21:49:57.72ID:3qWxJKAv0
int a=0;
int *pa=&a;
int **ppa =&pa;
int ***pppa = &ppa;
2019/11/19(火) 22:00:51.47ID:JHNr41O80
でもこういう関数だとポインタだけでやりたくなる

mul(double** x, double** y, int n, int m){

mul(double x[][20], double y[][20], int n, int m){
2019/11/19(火) 22:37:16.16ID:SDEP65Ha0
const 付けない系?
2019/11/19(火) 22:47:26.54ID:8ta2T3rG0
また関係ないことを・・・
2019/11/20(水) 05:59:16.05ID:6t1gUx2GM
関数の引数に限って言えば
func(**p)
func(*p[])
func(p[][])
func(p[][10])
どれでも同じ
引数として配列を引き渡す方法はない
どれも先頭要素へのポインタが値渡しされる
関数側で引数がポインタへのポインタ(いわゆる二重ポインタ)なのか、ポインタの配列なのか、配列の配列(いわゆる二次元配列) なのか区別する手段はない
引数に配列として要素数を渡してもエラーにはならないだけで無視される
2019/11/20(水) 06:42:28.35ID:06vL+ArYd
どこから突っ込んでいいやら・・・
出鱈目にも程があるぜ
2019/11/20(水) 07:18:49.43ID:CxWhIUNe0
関数の宣言文で説明だけなので変数型を省略してるだけだろ
配列の変数名がpならば呼び出しは
func(p)
でもいける
結局は先頭アドレスさえ渡せれば何でもいい
2019/11/20(水) 07:45:40.36ID:uVU8YbeSF
[][]なんて構文あるかヴォケ
318デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/20(水) 09:49:56.67ID:gQNT2Wxfa
>>314
プロトタイプ宣言しておけばC言語としては違う状態になるよ。
2019/11/20(水) 10:34:34.94ID:CxWhIUNe0
プロトタイプ宣言では状態を区別はしない

プロトタイプ宣言
void func(char *p[]);

関数定義
void func(char **p) {}


https://i.imgur.com/mMQGNga.png
320デフォルトの名無しさん (ワイーワ2 FFca-/nAh)
垢版 |
2019/11/20(水) 12:01:08.83ID:grCkJCm3F
>>308
あほか
>>305 は間違いの例だから
ピンと来なくて当然
321デフォルトの名無しさん (ワイーワ2 FFca-/nAh)
垢版 |
2019/11/20(水) 12:06:59.82ID:grCkJCm3F
>>311
何を目的に書いてるのか知らんが

A: mul(double** x, double** y, int n, int m){

B: mul(double x[][20], double y[][20], int n, int m){

C: mul(double (*x)[20], double (*y)[20], int n, int m){

AとBは等価じゃないぞ
2019/11/20(水) 13:41:25.47ID:CxWhIUNe0
変数としてのxは
A:double型のポインタを指すポインタ
B:double型の配列を要素とする配列の先頭要素を指すポインタ
C:double型の配列を指すポインタ

関数の引数としてのxは
A,B,Cすべてdouble型の参照オブジェクト(何でもいい)を指すポインタ
2019/11/20(水) 15:18:17.42ID:7Jz+3SpEa
>>322
>>321のxのことを言ってるのなら、基礎からやり直せ。
2019/11/20(水) 15:27:36.91ID:CxWhIUNe0
まあ実際C:のような例は見たことはないけど、少なくともA:とB:は関数の引数としては同じと解釈される
中身は受け取った関数側でプログラマが処理する事案であってdouble型の何かを指すポインタという以上の意味はない
2019/11/20(水) 15:59:50.97ID:jGIPXiJ00
分かりきった固定要素数の配列を渡すのはいっかい struct で包んじゃうわ

struct foo {
double array[20];
};

mul(struct foo* x, struct foo* y, ...)
326デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/20(水) 16:26:53.96ID:ACUpjjQJF
>>311 しね
>>324 お前は黙ってろ
2019/11/20(水) 16:40:06.35ID:6t1gUx2GM
>>323,326
ただの罵倒ではなくてもう少し有益なレスしろよ
2019/11/20(水) 16:50:21.31ID:VaHfdLQca
>>324
A,Bそれぞれのsizeof(x)やx+1について、値や型を比較してみろよ。意味が違うことがわかるから。
329デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/20(水) 16:54:14.17ID:ACUpjjQJF
>>327
>>314 func(p[][])
似たようなもんだな
2019/11/20(水) 17:02:30.65ID:CxWhIUNe0
>>328
一応言っておくけど>>322の通り変数のxは意味が違う
関数の引数の場合だけ状況が変わる
*p[]と*ppが同義なのは引数の場合だけ
>>319の通りプロトタイプ宣言と関数定義の両方で混在しても問題ない
2019/11/20(水) 17:03:37.18ID:CxWhIUNe0
訂正
**p ← *pp
332デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/20(水) 17:18:03.94ID:gQNT2Wxfa
>>324
いや。AとBは違う。
333デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/20(水) 17:19:03.29ID:ACUpjjQJF
>>330
>>319 の言ってるのは >>322 のとは違うだろ

これは正しい
>プロトタイプ宣言 void func(char *p[]);
>関数定義 void func(char **p) {}

これは間違い
>プロトタイプ宣言 void func(char p[][20]);
>関数定義 void func(char **p) {}
334デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/20(水) 17:36:55.77ID:gQNT2Wxfa
その通り
2019/11/20(水) 17:38:35.24ID:CxWhIUNe0
納得
そりゃそーだ
すまんかった
336デフォルトの名無しさん (アウアウクー MMd1-+hLn)
垢版 |
2019/11/20(水) 18:37:56.75ID:lnMf/X4/M
初めて書き込む初心者ですが
配列存在そのものがポインタと違う
という話と
ポインタとして渡して同じように扱える
という話の食い違いをしてるのですか?
337デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/20(水) 19:19:34.26ID:ACUpjjQJF
ポインタの配列はポインタのポインタとして扱えるが
配列へのポインタはポインタのポインタとして扱ってはいけないって話
そりゃ無理に使おうとすれば使えない訳じゃないが止めた方が良い
2019/11/20(水) 19:45:26.72ID:/a5mIgHWd
char a[2][2];
これは a[0][0], a[0][1], a[1][0], a[1][1] の順にcharが4個ならんだデータ

char *b[2] = {a[0], a[1]};
という配列をaとは別に作ってはじめて
char **として扱える
2019/11/20(水) 19:47:17.62ID:/a5mIgHWd
aは(中身は)4このデータの先頭アドレスで
bはアドレスの配列の先頭アドレス

データが異なるので無理やりキャストしてもダメ
340デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/20(水) 20:34:14.51ID:gQNT2Wxfa
そしてまたポインタ解説本が一冊増えるのであった
2019/11/20(水) 21:23:45.88ID:QqNmmDM2x
>>320
何だそうか、親切にありがとう!
2019/11/25(月) 13:03:01.01ID:pSQ/T/wR0
私はC言語の神だ
何か私に聞きたいことはあるか?
343デフォルトの名無しさん (ワイーワ2 FF63-KqLj)
垢版 |
2019/11/25(月) 13:13:12.61ID:pjJuONFZF
余命何年かな
2019/11/25(月) 13:18:38.97ID:pSQ/T/wR0
余命は3152578641だ
2019/11/25(月) 13:20:19.58ID:FcoOoav6d
なんで & より == の方が強い?
なんで func と &func 両方とも関数へのポインタ
なんで char の符号有無を規定しなかった?
2019/11/25(月) 13:22:22.93ID:pSQ/T/wR0
プログラマーは万能である
で、あれば、それらは些細なことだ
2019/11/25(月) 14:10:49.09ID:ZBE9lLbs0
>>345
===は比較演算子で、&はビット演算子(扱いは算術演算子と大差ない)だから。
funcと&funcが同じなのは単なるシンタックスシュガー。 配列のそれと変わらん。
charは符号もへったくれも無かったため。 最上位がパリティなことも多かったし。
348デフォルトの名無しさん (ワイーワ2 FF63-KqLj)
垢版 |
2019/11/25(月) 14:13:37.69ID:pjJuONFZF
char hoge[10][10];
があったとして
hoge と &hoge[0][0] が一緒なのは判るが
&hoge とか hoge[0][0] は一緒じゃない
2019/11/25(月) 14:40:15.02ID:xlCLCIdV0
算術演算子と大差無いと言うならなおさら優先順位が逆転するのは不思議
つうか神様への質問なんだからなんでそういう仕様になったかを答えてほしんでしょ
2019/11/25(月) 15:00:15.21ID:Nb9YSlRod
>>347
===って、Bにあったやつか?
等値比較代入
2019/11/25(月) 15:08:44.39ID:PWp9fS7h0
比較演算子が最下位ならすっきりする
 a + 1 == 2 → (a + 1) == 2 の順と同じく
 a & 1 == 2 → (a & 1) == 2 や
 a % 2 == 1 → (a % 2) == 1 であってほしい
2019/11/25(月) 16:42:52.23ID:Z7hJDN/t0
わたしゃ神様じゃないけど、カーニハンとパイクの『プログラミング作法』には
「カッコを使って演算子の優先順位の曖昧さを避けよう」みたいな項があるね。
もちろん規格では厳格に決まってるけど、使用者の記憶があやふやって話。

あの辺を読むと「ビット演算子より比較演算子を優先したのは誤りだったかも」と
ご当人が思ってたんじゃないかと感じるわ。
2019/11/25(月) 16:46:33.35ID:72Xydbv80
今更いじれないだろうな
2019/11/25(月) 18:07:03.06ID:FcoOoav6d
神様の回答が1個も無い
2019/11/25(月) 19:12:09.16ID:2aQAGKkK0
>>342
K&R1 から K&2 への相違で強烈に疑問を持っているのが
引数に配列をとったときは、配列の先頭のポインタが渡るのに、引数に構造体をおいたときは、構造体の実体がコピーされて渡されるのはなぜ?
馬鹿が
struct A {
int a[1234567890];
};
とかやったときには、これが関数の引数に乗ったときには、正気でコピーする気なのですか?
2019/11/25(月) 19:22:13.99ID:Nb9YSlRod
ん? 構造体が左辺値変形されるなんてことあったか?
2019/11/25(月) 19:27:41.70ID:Z7hJDN/t0
2点ほど訂正させてくれ。

カーニハン先生はC言語に大きな貢献をしてるけど、C言語の設計は
リッチーさんの仕事でカーニハンさんは手を出してないんだね。
だからこの場合「ご当人」と呼ぶのは正しくなかった。
「ビット演算子より比較演算子を優先するとは、デニスの野郎め
下手コキやがって」と思ってるんじゃないかと感じるわ。
…という具合に訂正。

もうひとつ。カーニハン先生は今の時点で健在らしい。
実は先の投稿の時点で亡くなってると勘違いしていた。
これもリッチーさんと混同したのが原因。
2019/11/25(月) 19:39:14.82ID:2aQAGKkK0
>>342
extern はいらない子!じゃないのですか?extern の必要性はなんですか?
2019/11/25(月) 19:42:04.68ID:2aQAGKkK0
>>342
可変長引数のプロモーション(格上げ)が理解できない
なぜ float は double に、char, short, は int に格上げされるのか?
2019/11/25(月) 20:03:51.13ID:EmSI22f6H
>>355
構造体のポインタを渡すとして、仮引数はどう宣言するよ
2019/11/25(月) 20:05:24.40ID:Nb9YSlRod
>>358
いらない子はtentativeなんだが
tentativeはtentativeの存在すら認識できない
知恵遅れのための必要悪だ
おまえのためだったとして
本当のいらない子は誰だろうね
2019/11/25(月) 20:19:59.47ID:2aQAGKkK0
>>360
関数の引数には、構造体のポインタではなくて、構造体そのものを渡します、構造体そのものを渡せるようになったのは K&R2 から可能になりました
C の神 >>342 に、この改変―個人的には改悪について、一度お聞きしたいと思っていたんです
2019/11/25(月) 20:24:34.17ID:2eomwteL0
なぜ神への質問を神でないものが回答するのか
神にでもなったつもりか!
364デフォルトの名無しさん (ワッチョイ fb8c-qZD/)
垢版 |
2019/11/25(月) 20:35:27.76ID:NzDv81TY0
ヘッダファイルには何を書きますか?
こめおしだるまとかですか
2019/11/25(月) 21:22:14.50ID:HEHU1BiX0
charは文字だから符号は重要じゃないってのはいいが、ならbyte型用意しておいてくれよと思う。
2019/11/25(月) 21:34:03.78ID:Qwn/HBF30
signed charもunsigned charもあるだろ
2019/11/25(月) 21:47:48.61ID:FcoOoav6d
signed charもunsigned charもcharもあるのが糞
2019/11/25(月) 21:50:36.94ID:wftjKJqc0
char = unsigned char に固定してくれりゃ万事楽だったのに
2019/11/25(月) 21:53:07.11ID:u+UfcqYe0
「8ビットめいっぱい使う奴(国)が面倒おこしてめんどくせぇ」
2019/11/25(月) 21:56:46.03ID:72Xydbv80
文字割り当てで最初から8bit全桁使ってしまっていれば良かった
2019/11/25(月) 22:06:54.47ID:HEHU1BiX0
8bit整数はsigned/unsigned charでいいやと思っていたらC++で裏切られた。
2019/11/25(月) 22:07:47.81ID:y1DwbhRd0
テキハ ホンノウジニ アリ
2019/11/25(月) 22:11:35.20ID:u+UfcqYe0
2バイト(16ビット)もあれば、各国のが収まるだろ? →ダメでした
2019/11/26(火) 00:36:17.99ID:TKGz3ntv0
なんでstaticにこんなにたくさんの意味をもたせた?
引数のconstが絶望的にわかりにくいんだが何でこんな文法にした?
375デフォルトの名無しさん (ワッチョイ 13ad-c8oy)
垢版 |
2019/11/26(火) 04:17:51.19ID:q8waUqPK0
これからの時代のcharは64bitで
2019/11/26(火) 07:18:47.84ID:auNO4ARld
>>374
const? 何がそんなに?
2019/11/26(火) 12:44:02.82ID:HcEoAWHl0
>>376
もっとくやしく
2019/11/26(火) 13:07:39.43ID:njyF587zd
const char * *
char * const *
char * * const

たしかに分かりにくい

volatileも
2019/11/26(火) 13:08:45.16ID:GOgRvMiLM
>>377
くそ、何がだよ。constの何がそんなにわかりにくいんだよっ!ちくしょうっ!!
2019/11/26(火) 15:05:20.59ID:auNO4ARld
なんだ、バカよけってことかよ
つまんね
381デフォルトの名無しさん (アウアウウー Sa9d-Pqlv)
垢版 |
2019/11/26(火) 18:23:04.66ID:UD9MC/mBa
>>377
キーッ
2019/11/26(火) 19:05:11.84ID:auNO4ARld
サル?
383デフォルトの名無しさん (アウアウウー Sa9d-Pqlv)
垢版 |
2019/11/26(火) 20:29:20.89ID:UD9MC/mBa
もっとはんなりと言ってください
2019/11/26(火) 21:26:44.95ID:IcZXgcFp0
モンキーですこと
2019/11/26(火) 22:25:58.87ID:FP/g45Qv0
これからはRISC-V
386デフォルトの名無しさん (ワッチョイ 13ad-c8oy)
垢版 |
2019/11/27(水) 00:28:00.77ID:0YyUhowx0
constどすえ
387デフォルトの名無しさん (ワッチョイ 9202-KPDH)
垢版 |
2019/11/28(木) 01:13:55.51ID:omfIxgsG0
void君いる?
2019/11/28(木) 01:37:02.70ID:XlAtYd3v0
voidならsp使わないという利点があるんだからいるのでは?
2019/11/28(木) 01:38:47.97ID:PoPpbfsh0
spとは?
2019/11/28(木) 03:19:24.36ID:saOZYqHd0
 ヘ_ヘ
ミ・・ ミ
(   )〜
391デフォルトの名無しさん (ワッチョイ 9202-KPDH)
垢版 |
2019/11/28(木) 09:18:13.24ID:omfIxgsG0
void君見てんだろ?
またあの名言聞きたいよ

てかspて何だ?
2019/11/28(木) 09:58:09.40ID:drahqBh90
おじいちゃん、おはよう
2019/11/28(木) 11:52:01.48ID:dwMkkEn2M
何の話しをしているのですか?
2019/11/28(木) 12:29:57.76ID:4okpNGfUM
話しとは?

 ヘ_ヘ
ミ・・ ミ
(   )〜
395デフォルトの名無しさん (アウアウウー Sacd-8Irb)
垢版 |
2019/11/28(木) 12:49:27.76ID:pgFu+V4ea
はなしししししし
2019/11/28(木) 13:08:00.18ID:HUd7Y1FLd
void君て何?
2019/11/28(木) 14:14:09.56ID:cHXg4S3V0
fj.comp.lang.c japan.yoso 何年前…
398デフォルトの名無しさん (アウアウウー Sacd-8Irb)
垢版 |
2019/11/28(木) 17:13:55.23ID:pgFu+V4ea
(´-`).。oO(今の人は newsgroup なんて知らないんだろうなあ・・・)
2019/11/28(木) 17:34:29.53ID:drahqBh90
公園で紙芝居をやってた頃の話だから
2019/11/28(木) 17:56:05.01ID:7otTe0SQ0
スタックポインタ
2019/11/28(木) 18:13:00.42ID:PoPpbfsh0
voidならスタックポインタを使わない?
意味不明
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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