C言語に配列なんてものはないということを知りました

1: 2019/07/26(金) 17:23:17.816 ID:54giOtv90
int a[4];って宣言するじゃん?
*a=100;って書くのとa[0]=100;と書くのは一緒!ここまでは良いけど
a[3]=100;と3[a]=100:
どちらも一緒なのです!C言語に配列なんてなかったんだ...

2: 2019/07/26(金) 17:24:46.718 ID:U8AMXPvla
は?

4: 2019/07/26(金) 17:25:03.963 ID:54giOtv90
>>2
は?ってなるでしょ
これマジ

7: 2019/07/26(金) 17:26:15.228 ID:h+tnHfCl6
>>4
いや、そうなるのは分かるけど配列は無いって結論には?

11: 2019/07/26(金) 17:27:11.336 ID:54giOtv90
>>7
だって配列なら3[a]なんておかしいはずじゃん?

16: 2019/07/26(金) 17:28:32.074 ID:wQTNc0Cld
>>11
それは仕様の裏だろ
お前マリオカートで裏技のショートカット見つけたら「コースなんて無かった!」って騒ぐのかよ

43: 2019/07/26(金) 17:54:01.101 ID:VhfEU30p0
>>16がこれ以上ないくらいわかりやすい例えだと思うんだが
仕様上そういうこともできる、っていうのの挙げ足を取っても別に何も変わらんだろ

3: 2019/07/26(金) 17:25:03.560 ID:uIxcdMJI0
[]で宣言したら配列だよ
アクセスするのにポインタ使うってだけ

6: 2019/07/26(金) 17:26:12.237 ID:54giOtv90
>>3でaという名前の配列が宣言されたとするなら3[a]なんておかしいはずでしょ?でもこれで通る

5: 2019/07/26(金) 17:25:04.313 ID:mKOpSktpM
たまたまだぞ

9: 2019/07/26(金) 17:26:27.675 ID:54giOtv90
>>5
たまたまじゃないよ!

8: 2019/07/26(金) 17:26:27.274 ID:NkU+vtwya
それコンパイルできる?

12: 2019/07/26(金) 17:27:37.633 ID:54giOtv90
>>8
うゆ

13: 2019/07/26(金) 17:28:08.258 ID:hjnkoritM
嘘に決まってんだろアホ

18: 2019/07/26(金) 17:29:42.217 ID:54giOtv90
>>13
嘘じゃないよ
a[3]と3[a]の内訳?は*(a+3)と*(3+a)だよー

17: 2019/07/26(金) 17:29:02.350 ID:o+CH4iCyM
宣言は配列でしてるじゃん
配列の要素がポインタでアクセスできるだけで配列が存在しないわけではない
これは構造体でもおなじ

20: 2019/07/26(金) 17:30:43.041 ID:NkU+vtwya
掛け算の交換方法だろ?

21: 2019/07/26(金) 17:31:16.335 ID:ZO/F3c2r0
よくわからないからガンダムで例えてくれ

24: 2019/07/26(金) 17:32:48.335 ID:54giOtv90
>>21
ガンダムそんなしらね

25: 2019/07/26(金) 17:33:38.157 ID:SmoNtMsYr
配列がなかったら連続した領域をスタックに確保できない

26: 2019/07/26(金) 17:34:30.563 ID:54giOtv90
>>25
ポインタでできます!

32: 2019/07/26(金) 17:42:59.802 ID:wQTNc0Cld
>>26
実サイズ指定でallocしてintいくつかにキャストして回るのか?

そこまでやるならC上でアセンブリでも書けば良くね?
constも無ければ関数も無いぞ

36: 2019/07/26(金) 17:45:39.474 ID:54giOtv90
>>32
ちょっとなに言ってるかわかんない

34: 2019/07/26(金) 17:43:53.672 ID:8iUebZ6V0
>>26
ヒープ領域とスタック領域って知ってる?

38: 2019/07/26(金) 17:47:58.529 ID:54giOtv90
>>34
メモリの?allocaじゃできないの?

45: 2019/07/26(金) 17:54:36.668 ID:8iUebZ6V0
>>38
C言語の言語仕様の話

47: 2019/07/26(金) 17:55:47.884 ID:54giOtv90
>>45
知らん!

30: 2019/07/26(金) 17:41:56.116 ID:8iUebZ6V0
マジレスすると配列型からポインタへの型キャストが起きてる

35: 2019/07/26(金) 17:43:53.677 ID:54giOtv90
>>30
配列型ってなんだ

39: 2019/07/26(金) 17:49:16.891 ID:8iUebZ6V0
>>35
すまん 配列型って言葉が存在するかは分からんから造語だと思ってくれ
ただ例えば"要素はint型で要素数5の配列"という型などは確かに存在して、これはint型へのポインタとは明確に異なるもの

40: 2019/07/26(金) 17:51:13.665 ID:54giOtv90
>>39
int a[5]:と宣言して
3[a]=100;は3という配列に要素がaというものなの?これが通ることはおかしい

50: 2019/07/26(金) 18:12:34.604 ID:8iUebZ6V0
>>40
それは正しい
例えばint *p;ならp[2]は内部的には*(p + 2)としてコンパイルされる
こういうのをシンタックスシュガーという
で、int a[5];ならa[2]は*((int*)a + 2)としてコンパイルされる
ここではint[5]からint*への暗黙キャストが起きてる
同様に2[a]は*(2 + (int*)a)としてコンパイルされる
間違いがあるかもしれないけど大筋はこんな感じ

51: 2019/07/26(金) 18:16:41.513 ID:54giOtv90
>>50
じゃあ(int[5])ってキャストできるの?

52: 2019/07/26(金) 18:25:33.645 ID:8iUebZ6V0
>>51
Wandboxで試したらコンパイルできなかったしできないんだろ

41: 2019/07/26(金) 17:51:21.206 ID:mfq2LQV90
ポインタじゃ見にくいから配列って書き方を作っただけ
配列とポインタに違いなどない

どうしても違うって言い張る人は昔の学校で授業受けたか
古い本を読んだかって感じ
どっちにしろそういう人は今はもうC言語なんて書いてないよ
昔知った知識に拘泥されてるってのは経験が浅い証拠

44: 2019/07/26(金) 17:54:16.549 ID:54giOtv90
>>41
一緒っていうのはわかる
ポインタじゃ見にくいから配列という名前の省略表現を作った
a[3]は*(a+3)を省略したもの!

46: 2019/07/26(金) 17:55:03.825 ID:wQTNc0Cld
>>41
解釈時はまさにその通り
でも固定配列とallocじゃ初期化処理が全く違う。まっっったく違う

嘘だと思うなら100バイト確保するだけの関数を作って1000万回ほどループさせてみるといい
時間が全然違うから

49: 2019/07/26(金) 18:06:36.418 ID:54giOtv90
>>46
配列と比べるならfor文で確保せず一発確保じゃないの?

int a[1000000]:

int *a;
a = (int *)alloca(sizeof(int) *1000000);
みたいな

53: 2019/07/26(金) 18:30:12.673 ID:54giOtv90
ていうか最終的に機械語になった時には同じになるんじゃないの?
コンパイルなんてコンパイラによって差があるんだろうし