C言語なら俺に聞け 156
レス数が1000を超えています。これ以上書き込みはできません。
「型」とは何だと思う?
こういうのは型で、こういうのは型じゃない、という境界を示せるか? rui_ueyamaのコンパイラ入門だと配列型とポインタ型は別々だって言ってたよ 951が言いたいのはこういうことか?
typedef char T[100];
T s; //これなら型だ
T s[100]; //これは型なのかな 型って言うと普通はintとかfloatだよね
配列型っていうか「int型の配列」と表現することはあるけど 基本型(数値型と文字型)と集成体型(配列と構造体)とポインタ型 型はintとcharとfloatとdouble等
配列はその型を[100]みたいに指定した固定数だけ宣言して使えるようにしたもの
ポインタは指定した型のメモリ上の場所だけを指し、*allocでサイズが変えれる
配列もメモリの場所を示すポインタで参照はできるがサイズは固定
で覚えた >>955
キーワードのみで指定される型は基本型(basic type)だ
6.2.5 型 オブジェクトに格納した値又は関数の返す値の意味は,それをアクセスするのに使われる式の型(type)によって決定する。(オブジェクトとして宣言された識別子は最も単純な式とし,その型は識別子の宣言において指定された型とする。)型は,オブジェクト型(object type)(オブジェクトを完全に規定する型),関数型(function type)(関数を規定する型),及び不完全型(incomplete type)(オブジェクトを規定する型で,その大きさを確定するのに必要な情報が欠けたもの)に分類する。 あ、ほんとだ
規格書見たら普通に配列型と書いてあるね
知らんかった
ネットで検索しても「配列型」は引っかからないけど >配列型(array type)は,要素型(element type)と呼ぶ特定のメンバオブジェクト型をもつ空でないオブジェクトの集合を連続して割り付けたものを表す(36)。配列型は,その要素型及び配列の要素の個数によって特徴付ける。配列型はその要素型から派生されるといい,要素型がTの場合,配列型は“Tの配列”と呼ぶ。要素型から配列型を構成することを“配列型派生”と呼ぶ。
「Tの配列」という表現は「配列型」と同義なのか、勉強になった 配列が型でなければ、sizeof int[4]とか、(char (*)[4])ptrとか書けないからね 関数の引数で
void func(char s[][10])
なんて書き方をすると配列型をちょっと実感できる。 いや、規格書に書いてあるのだから、私の間違いでした
すみませんでした void func(char s[][10])
は嫌い
void func(char (*s)[10])
じゃいかんの >>969
意味は同一。
仕様上の意味付けとしては後者がまずあって
前者はその構文糖という位置づけ。 初心者を救済すべく用意された構文糖が
結果的に初心者を陥れる陰険な罠になっているという皮肉 少なくともCのシンタックスシュガーは熟練者がタイプ数を減らすためのものであって初心者を楽させるものではない気がする こんなところでCが中途半端に出来るだけが自慢の専門卒みたいな連中に尋ねるよりも
大学の先生かチューターの院生に尋ねた方がいいだろう
進みたい研究室があればそこに行って訊くと良い // b.c
int b[] = {123, 456};
// a.c
#include <stdio.h>
int a[] = {123, 456};
int main()
{
extern int *b;
printf("val b\n");
printf("%d\n", *(b + 1));
// printf("val a\n");
// printf("%d\n", *(a + 1));
return 0;
}
こういう分割ソースをコンパイル、リンクして実行すると、何も表示無しで終了する
デバッガー使って実行してみると、SEGVになってる
分割せず、コメント部分のaの表示だけにすると、動く
院生の人、何故かを説明して こういうの、昔 柴田何某のポインタ本で勉強したけど、みんな忘れたな… extern int b[];にすると動いたから配列型とポインタ型の違いっぽい 配列とポインタを混同するなと教えるときの典型的なサンプルだね 外部りんけーじだと、bのメモリに配置されているのが値なのかポインタなのか分からないからかな
この場合、使用側はbに配置されたのがポインタと決めつけてるけど、実態は値だから? int b[] = {123, 456};
*b で期待されるのは b=&123;
b[] で期待されるのは b[2]={123,456}
b[]の中身をスタックに積んだ後に*bの場合必要ないからextern更新して無いんじゃね? 現象としてはコンパイル後のアセンブリを見ればいいけど, 一般論としてはODR違反だからどう扱おうがコンパイラの自由だとしか >>980
ここはCスレなのでCで表現してくれ
オレ語じゃわからん extern int *b; じゃスタックに何も積んだりしないしどう見ても>>980がアホなんですが >>980
>&123
お前、何をいっているんだ?
ちゃんと日本語とC言語で記述しろ、馬鹿、死ね 2進で 0111 1011 か
マスクでありそうなパターンだ (int)123を.data sectionに置きアドレスを取得する方法。 int a[] = { 123 };
って初期化すれば a が (int) 123 の入っている先頭アドレスになる。
もちろん *a が作られたわけではないので a に対しては代入できない。
あくまでも a を使おうとすると 123 の入っているアドレスに置き換わるだけ。 printf("%d", sizeof (char)123); とやろうとしたら
キャストのカッコがsizeofのカッコと解釈されてエラーになるのな
printf("%d", sizeof((char)123)); ならおkなんだけど
なんだか気持ち悪い >>996
sizeofって括弧なしで使えるの? 知らなかった >>996
sizeof演算子の優先順位はcast演算子の優先順位より高いので、括弧がないと
まず最初にsizeofと数値リテラルが評価されてその後でその結果をcastで評価するという
おかしな状態になるのでエラーになったのでは? sizeofとキャストはどちらも単項式なので右から結合するはず
にも関わらずキャストが先に読まれないので気持ち悪いと言ったんだ
字句解析と意味解析ってことかな そもそも
sizeof (char)
だけでいいものをそう記述してるのが気持ち悪い。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 272日 20時間 24分 19秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。