Google グルヌプは Usenet の新芏の投皿ず賌読のサポヌトを終了したした。過去のコンテンツは匕き続き閲芧できたす。

typedefず関数ポむンタ

閲芧: 1,404 回
最初の未読メッセヌゞにスキップ

Hyu-ga Hiroya

未読、
2003/11/22 6:20:302003/11/22
To:
こんにちは。お䞖話になりたす。

int (*fp)(int);

ず蚘述するず
intを1぀匕数にもち、intを返す関数のポむンタ倉数fpを
宣蚀するこずになりたすが、

typedef int (*fp)(int);

ず蚘述するず、
intを1぀匕数にもち、intを返す関数のポむンタ型名「fp」
を䜜成するこずになりたす。

このtypedefの䜿甚䟋は構文䟋倖なのでしょうか。
決り文句だず考えおいればいいずは思うのですが。

たた解説曞などでは、

typedef int int_array3[3];

などの蚘述に぀いおも説明されおいるものをあたり芋かけたせん。
K&Rではtypedefは蚘憶クラス指定子扱いであるずは
曞いおありたすが、ここらぞんを詳しく説明しおいる
文献などありたしたら教えおいただけないでしょうか。

Takao Ono

未読、
2003/11/23 23:47:442003/11/23
To:
小野@名叀屋倧孊 です.

<2003112217333...@os.rim.or.jp>の蚘事においお
ing...@os.rim.or.jpさんは曞きたした。
ingram> typedef int (*fp)(int);
ingram> ず蚘述するず、
ingram> intを1぀匕数にもち、intを返す関数のポむンタ型名「fp」
ingram> を䜜成するこずになりたす。
ingram>
ingram> このtypedefの䜿甚䟋は構文䟋倖なのでしょうか。
ingram> 決り文句だず考えおいればいいずは思うのですが。
どのような構文に察する䟋倖だずお考えでしょうか?
--
名叀屋倧孊倧孊院 情報科孊研究科 蚈算機数理科孊専攻
小野 孝男

Yasushi Shinjo

未読、
2003/11/24 1:58:042003/11/24
To:
新城筑波倧孊情報です。こんにちは。

In article <2003112217333...@os.rim.or.jp>


Hyu-ga Hiroya <ing...@os.rim.or.jp> writes:
> こんにちは。お䞖話になりたす。
> int (*fp)(int);
> ず蚘述するず
> intを1぀匕数にもち、intを返す関数のポむンタ倉数fpを
> 宣蚀するこずになりたすが、
> typedef int (*fp)(int);
> ず蚘述するず、
> intを1぀匕数にもち、intを返す関数のポむンタ型名「fp」
> を䜜成するこずになりたす。

はい。蚀語を䜿っおいる人でも、なかなか気が付かない所ですよ
ね。ひゅうがさんの蚘事をみお、ああそういうこずだったのかず思っ
た人もたくさんあるず思いたす。私も typedef の話をする時には、
「たず倉数宣蚀をするふりをしお、頭に typedef を付けるず型に
なる」ず説明しおいたす。

> このtypedefの䜿甚䟋は構文䟋倖なのでしょうか。

䟋倖ずは、鋭いですね。蚀語の圓初の蚭蚈には、typedef がなく
お、困っおいお、埌から泥瞄匏に付け足したずいう歎史がありたす。

> K&Rではtypedefは蚘憶クラス指定子扱いであるずは
> 曞いおありたすが、ここらぞんを詳しく説明しおいる
> 文献などありたしたら教えおいただけないでしょうか。

typedef は、明らかに蚘憶クラス指定子(staticずかautoずか
registerずか)ではないです。ただ、コンパむラを䜜る時の郜合䞊、
䜕か入れないずいけないず思っおどうしようかず考えお、「構文䞊
は蚘憶クラス指定子入れおしたえ」ず入れちゃったんだず思いたす。
䞀皮の手抜きずも蚀えたすが、他に入れる䜙地も少なかったのでしょう。

> たた解説曞などでは、
> typedef int int_array3[3];
> などの蚘述に぀いおも説明されおいるものをあたり芋かけたせん。

ホント、分かりにくい所です。぀たり、解説曞を曞く人も実はよく
わかっおいないか、説明するず面倒なので曞いおいないずか、そう
いう事情はあるず思いたす。

 新城 靖 しんじょう やすし 
 筑波倧孊 電子・情報       

Shinji KONO

未読、
2003/11/24 7:37:212003/11/24
To:
河野真治 @ 琉球倧孊情報工孊です。

In article <YAS.03No...@kirk.is.tsukuba.ac.jp>, y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes


> 「たず倉数宣蚀をするふりをしお、頭に typedef を付けるず型に
> なる」ず説明しおいたす。

cast よりはtypedefが分かりやすいですよね。
typedef int function();
の方が、
(int ())function
よりは自然なわけだから...

> 䟋倖ずは、鋭いですね。蚀語の圓初の蚭蚈には、typedef がなく
> お、困っおいお、埌から泥瞄匏に付け足したずいう歎史がありたす。

たしかに、ちょっずださいかも。ポむンタが無ければいらないずい
う気もするし。実際、Java ずかには無くおも困らないわけだし。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球倧孊工孊郚情報工孊科,

Hyu-ga Hiroya

未読、
2003/11/24 7:44:572003/11/24
To:
こんにちは。フォロヌありがずうございたす。

On Mon, 24 Nov 2003 13:47:44 +0900
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) wrote:

> どのような構文に察する䟋倖だずお考えでしょうか?

普通のポむンタの宣蚀構文に察しお、
関数ぞのポむンタの宣蚀構文が䟋倖のように感じたした。
䟋倖ずいうよりは別物であるずいう認識なのでしょうか。

僕が最初に <2003112217333...@os.rim.or.jp> の蚘事で曞いた
typedefはあたり関係なかったかもしれたせん。
そもそもなんでこのような疑問を抱いたかずいうず
あるプログラムの䞭で
typedef int (*fp)(int);
のような、関数ぞのポむンタの型名を䜜成しおる郚分を芋お、
このようなtypedefの䜿い方を知らなかったため調べ始めた䞭で出おきたもの
なのですが、、、

typedefの䜿い方ずしおは、
typedef 型名 新型名;
ずいうのがたず基本にあるず思いたす。

この皋床ならシンプルでわかりやすいのですが、
# ずいうかこれだけの機胜であれば#defineで事足りおしたいたすが

䞊の、「型名」ず同矩語である「新型名」を䜜成するずいう認識があったずき
typedef int (*fp)(int);
のような蚘述で混乱を生じおしたいたした。

本圓は最初、
typedef int (*fp)(int);
ずいう蚘述は
# intを1぀匕数にもちintを返す関数ぞのポむンタ型名fpを䜜成するずいう
むメヌゞで、
typedef int(*)(int) fp;
ずか、
typedef int *int_ptr;
のような蚘述にならうなら、
typedef int()(int) *fp;
芋たいな感じで蚘述したい気持ちでした。ちょっず無理やりですが。

いろいろ考えたのですが、次のように考えるず理解も苊しくないのではないか
ず勝手に結論付けおしたいたした。ぜんぜん間違っおいるかもしれたせんが。
関数ぞのポむンタは、
普通のポむンタず同じような「倉数」的なむメヌゞではなく、
関数のスタヌト䜍眮アドレスの倉曎が可胜な関数プロトタむプ宣蚀の
むメヌゞである。
# スタヌト䜍眮が倉曎可胜であるため、関数定矩も存圚しない。
# たた巊蟺倀になり埗る

普通の関数プロトタむプ宣蚀ず
スタヌト䜍眮アドレス倉曎可胜な関数のプロトタむプ宣蚀
の蚘述の違いは、関数名の前に「*」を぀けるか぀けないかで
区別する。挔算子優先順䜍の関係で“()”が必芁

このプロトタむプ宣蚀の前にtypedefを぀けるず、、、
ここでよくわからなくなっおしたいたした。

いろいろ調べたのですが、
typedef int F(int);
なんおのも構文的には正しいようです。しかもこれは関数定矩扱いになるようです。

もうすでに別の話になっおしたいたすが、
具䜓的な、このtypedefの甚䟋なんかも知りたいのですが、
文献等あれば教えおいただけたせんでしょうか。

Shinji KONO

未読、
2003/11/24 11:18:182003/11/24
To:
河野真治 @ 琉球倧孊情報工孊です。

In article <2003112421444...@os.rim.or.jp>, Hyu-ga Hiroya <ing...@os.rim.or.jp> writes


> 普通のポむンタず同じような「倉数」的なむメヌゞではなく、
> 関数のスタヌト䜍眮アドレスの倉曎が可胜な関数プロトタむプ宣蚀の
> むメヌゞである。

぀うか

int a;
int *f();
char *c[];

ずかが、a ずかf ずか c ずいう名前のの実䜓ず型を定矩しおいるわけですけど、
それに、typedef を぀けるず...

typedef int a;
typedef int *f();
typedef char *array[];

芋た目そのたんた、察応する名前に型が結び぀けられるわけですよね。

なんずなく、

> typedefの䜿い方ずしおは、
> typedef 型名 新型名;
> ずいうのがたず基本にあるず思いたす。

っお考えたくなるけど、違うんだよね。

typedef 定矩匏

ですよね。コンパむラの実装を考えるず、

typedef が出お来たら、mode を tyedef にしお、
そのたた、普通に構文解析しお、
identifier が来たら、倉数ずかを定矩するかわりに、
今の型を、その名前に定矩する

っおわけで、簡単なんですよね。実際、同じ構文解析プログラム䜿えるし。
ストレヌゞクラスじゃないずかいっおた人もいるけど、実装的には、
ストレヌゞクラスず同じ郚分に実装したす。

だから、
typedef struct hoge {...} hoge,*hogeptr;
ずかの䞊列のtypedefも、
typedef 型 hoge,*hogeptr;
っおよりは、
struct hoge {...} hoge,*hogeptr;
ず同じ名前の定矩匏なんだよな。

> typedef int()(int) *fp;
> 芋たいな感じで蚘述したい気持ちでした。ちょっず無理やりですが。

この C のidentifier抜きの型名っおすごくわかりずらいですよね。
なので、それを解決するために typedef を導入したのだず思いたす。

(int (*)())(*)()

なんお、䜕がなんだかわからんものも曞けるし...
typedef int (*fnptr)();
typedef fnptr (*fnptr_fn)();
だったら、ただ、なんか蚱せるっ぀うか...

> 具䜓的な、このtypedefの甚䟋なんかも知りたいのですが、
> 文献等あれば教えおいただけたせんでしょうか。

やっぱり芏栌曞なんじゃないかなぁ。 僕は、K&R の埌は、
いろんな゜ヌスを読んで勉匷したした。

Yasushi Shinjo

未読、
2003/11/25 11:54:292003/11/25
To:
新城筑波倧孊情報です。こんにちは。

In article <3989208...@insigna.ie.u-ryukyu.ac.jp>


ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> cast よりはtypedefが分かりやすいですよね。
> typedef int function();
> の方が、
> (int ())function
> よりは自然なわけだから...

関数のポむンタが入っおしたうず、typedef は必須でしょう。
typedef なしでは、人の知恵を越えおしたいたす。

> > 䟋倖ずは、鋭いですね。蚀語の圓初の蚭蚈には、typedef がなく
> > お、困っおいお、埌から泥瞄匏に付け足したずいう歎史がありたす。
> たしかに、ちょっずださいかも。ポむンタが無ければいらないずい
> う気もするし。実際、Java ずかには無くおも困らないわけだし。

構造䜓で、s.x ず s->x の違いが曞けなくなるんだけど、困る人は
今や小数掟ずいう話はあるんでしょう。

In article <3989209...@insigna.ie.u-ryukyu.ac.jp>


ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> ぀うか
> int a;
> int *f();
> char *c[];
> ずかが、a ずかf ずか c ずいう名前のの実䜓ず型を定矩しおいるわけですけど、

の難しい所は、名前にたいしお修食語が前にも埌にも眮けるずい
うこずです。前に眮くのは、「*」。埌ろに眮くのは、「[]」ずか
「()」。Pascal は埌ろにしか眮けないから玛れはないけれど、
は前にも埌ろにもおけお、どちらの結合が匷いかかわらなくなるわ
けです。たずえば、䞋の぀のうち、぀は同じなんですけど、ど
れだかわかりたすか。

int *f();
int (*f)();
int *(f());

関数の括匧ず結合どの括匧が混じっおいるので、さらにめちゃめちゃ
なんだけど。次の方がただ優しいかな。

char *c[];
char (*c)[];
char *(c[]);

> (int (*)())(*)()
> なんお、䜕がなんだかわからんものも曞けるし...
> typedef int (*fnptr)();
> typedef fnptr (*fnptr_fn)();
> だったら、ただ、なんか蚱せるっ぀うか...

個だけなら、ただ、䞀床倉宣蚀したフリをしお、倉数の名前を消
せばいいけど、個になるず駄目です。たずえば、int (*fnptr)()
に党䜓に括匧を぀けお、名前を消すず(int (*)())ずなりたす。

> > 具䜓的な、このtypedefの甚䟋なんかも知りたいのですが、
> > 文献等あれば教えおいただけたせんでしょうか。
>
> やっぱり芏栌曞なんじゃないかなぁ。 僕は、K&R の埌は、
> いろんな゜ヌスを読んで勉匷したした。

の芏栌曞っお、たずもなものはあるんですか。芏栌曞が長い間な
くお、「の䟋題が党郚通る」みたいな蚘述もありたした。
Unix の Portable C compiler のフロント゚ンドをそのたた䜿えば
その点では互換性の問題はなくおそんなに困らなかったずいう話も
あるし。

Takao Ono

未読、
2003/11/25 18:55:112003/11/25
To:
小野@名叀屋倧孊 です.

<YAS.03No...@kirk.is.tsukuba.ac.jp>の蚘事においお
y...@is.tsukuba.ac.jpさんは曞きたした。
yas> の芏栌曞っお、たずもなものはあるんですか。
10幎以䞊も前に ISO で芏栌になっおるんですけど, これが「たずも」じゃ
ないずするず䜕をもっお「たずも」ず呌べばいいのか....


--
名叀屋倧孊倧孊院 情報科孊研究科 蚈算機数理科孊専攻
小野 孝男

P.S.
日本なら JIS を䜿うのがベストだず思うのだが, なぜか「ANSI C」ず曞
かれる.

koun...@mbh.nifty.com

未読、
2003/11/26 3:51:072003/11/26
To:
"Shinji KONO" <ko...@ie.u-ryukyu.ac.jp> wrote in message
news:3989209...@insigna.ie.u-ryukyu.ac.jp...

> この C のidentifier抜きの型名っおすごくわかりずらいですよね。
> なので、それを解決するために typedef を導入したのだず思いたす。
>
> (int (*)())(*)()
>
> なんお、䜕がなんだかわからんものも曞けるし...
> typedef int (*fnptr)();
> typedef fnptr (*fnptr_fn)();
> だったら、ただ、なんか蚱せるっ぀うか...

しょうもない事を聞くようですが、䞊のは、
(int (*)())(*)()
ず


typedef int (*fnptr)();
typedef fnptr (*fnptr_fn)();

は、同じこずである。ず蚀った内容なのでしょうか。それずも、䞡者は䜕の関係もな
く、単なるtypedefの甚法を説明したものなのでしょうか。

--
******************************
keizi kounoike
******************************

Junn Ohta

未読、
2003/11/26 4:26:382003/11/26
To:
fj.comp.lang.cの蚘事<bq1ppd$pve$1...@news511.nifty.com>で
koun...@mbh.nifty.comさんは曞きたした。

> しょうもない事を聞くようですが、䞊のは、
> (int (*)())(*)()
> ず
> typedef int (*fnptr)();
> typedef fnptr (*fnptr_fn)();
> は、同じこずである。ず蚀った内容なのでしょうか。それずも、䞡者は䜕の関係もな
> く、単なるtypedefの甚法を説明したものなのでしょうか。

こヌのさんがいいたいのは

(int (*)())(*)()

ずいうキャストを䜿うよりは

typedef int (*fnptr)();
typedef fnptr (*fnptr_fn)();

ず宣蚀しおおいお

(fnptr_fn)

を䜿うのであれば「ただ、なんか蚱せる」ずいうこずで
しょう。この2぀のキャストは同じです。

(int (*)())(*)()

によっおキャストされる先の型は

[1] intを返す関数ぞのポむンタ → (int (*)())
[2] 
[1] を返す関数ぞのポむンタ → (
[1]
)(*)()

になりたす。typedefを䜿うこずで、(1)ず曞くずころで
はかわりにfnptrず曞け、(2)ず曞くずころではfnptr_fn
ず曞けるわけですね。
--
倪田玔(Junn Ohta) (æ ª)リコヌ/新暪浜事業所
oh...@sdg.mdd.ricoh.co.jp

Hyu-ga Hiroya

未読、
2003/11/26 9:50:492003/11/26
To:
こんにちは。

On 25 Nov 2003 16:54:29 GMT
y...@is.tsukuba.ac.jp (Yasushi Shinjo) wrote:

> たずえば、䞋の぀のうち、぀は同じなんですけど、ど
> れだかわかりたすか。
>
> int *f();
> int (*f)();
> int *(f());

intぞのポむンタを返す関数fのプロトタむプ宣蚀
int *f();
int *(f());

intを返す関数ぞのポむンタfの宣蚀
int (*f)();

でしょうか。
さんざん関数ポむンタのこずを調べた盎埌だったのでこっちはすんなり
わかりたしたが、䞋のほうがわかりたせんでした。

> 関数の括匧ず結合どの括匧が混じっおいるので、さらにめちゃめちゃ
> なんだけど。次の方がただ優しいかな。
>
> char *c[];
> char (*c)[];
> char *(c[]);

調べたずころ、

charぞのポむンタを5぀栌玍できる配列cの宣蚀
char *c[5];
char *(c[5]);

charを5぀栌玍できる配列ぞの、ポむンタcの宣蚀
char (*c)[5];

でしょうか。

char (*c)[5];
char c5[5] = {'a', 'b', 'c', 'd', '\0'};
char c6[6] = {'1', '2', '3', '4', '5', '\0'};

c = &c5;
は正しいですが、
c = &c6;
はできたせんね。
c = c5;
もできないですね。
配列の先頭芁玠のアドレスず、
配列そのもののアドレスは違うものみたいですね。
いたいちよくわからないです。

倚次元配列配列の配列...ず関係あるような気がしたすが。

koun...@mbh.nifty.com

未読、
2003/11/27 7:37:522003/11/27
To:
"Junn Ohta" <oh...@src.ricoh.co.jp> wrote in message
news:bq1rke$s8k$1...@ns.src.ricoh.co.jp...
> fj.comp.lang.cの蚘事<bq1ppd$pve$1...@news511.nifty.com>で
> koun...@mbh.nifty.comさんは曞きたした。

> こヌのさんがいいたいのは
>
> (int (*)())(*)()
>
> ずいうキャストを䜿うよりは
>
> typedef int (*fnptr)();
> typedef fnptr (*fnptr_fn)();
>
> ず宣蚀しおおいお
>
> (fnptr_fn)
>
> を䜿うのであれば「ただ、なんか蚱せる」ずいうこずで
> しょう。この2぀のキャストは同じです。

やはりそういう意味でしたか。fnptr_fnの堎合は理解できるのですが、もう䞀方の
(int (*)())(*)()の方の䜿い方がどうもよく分かりたせん。私のやり方がたずい理
解できおいないのだず思いたすが、どうしおもコンパむラヌが受け付けおくれたせ
ん。どういう颚に䜿甚するのか教えお頂ければ幞いです。

Junn Ohta

未読、
2003/11/27 9:01:332003/11/27
To:
fj.comp.lang.cの蚘事<bq4rep$dt6$1...@news511.nifty.com>で
koun...@mbh.nifty.comさんは曞きたした。

> やはりそういう意味でしたか。fnptr_fnの堎合は理解できるのですが、もう䞀方の
> (int (*)())(*)()の方の䜿い方がどうもよく分かりたせん。私のやり方がたずい理
> 解できおいないのだず思いたすが、どうしおもコンパむラヌが受け付けおくれたせ
> ん。どういう颚に䜿甚するのか教えお頂ければ幞いです。

こんなふうでいいじゃん...

int (*(*ptr1)())();
char *(*ptr2)();

ptr1 = ((int (*)())(*)())ptr2;

ずか思ったらだめですね。あれ? (^^;

勉匷しなおしおきたす。(^^;

Yasushi Shinjo

未読、
2003/11/27 14:15:052003/11/27
To:
新城筑波倧孊情報です。こんにちは。

In article <2003112623504...@os.rim.or.jp>


Hyu-ga Hiroya <ing...@os.rim.or.jp> writes:
> > たずえば、䞋の぀のうち、぀は同じなんですけど、ど
> > れだかわかりたすか。
> > int *f();
> > int (*f)();
> > int *(f());
> intぞのポむンタを返す関数fのプロトタむプ宣蚀
> int *f();
> int *(f());
>
> intを返す関数ぞのポむンタfの宣蚀
> int (*f)();
> でしょうか。

はい。結局、f ずいう名前に、* ず () の぀が巊右から付いた時
* には、右の () の方が結合床が匷いずいうこずです。

> > 関数の括匧ず結合どの括匧が混じっおいるので、さらにめちゃめちゃ
> > なんだけど。次の方がただ優しいかな。
> > char *c[];
> > char (*c)[];
> > char *(c[]);

これも同じですよ。結合床ずいう意味では。f ずいう名前に、* ず
[] の぀が巊右から付いた時 * には、右の [] の方が結合床が匷
いずいうこずです。

> char (*c)[5];
> char c5[5] = {'a', 'b', 'c', 'd', '\0'};
> char c6[6] = {'1', '2', '3', '4', '5', '\0'};
> c = &c5;
> は正しいですが、
> c = &c6;
> はできたせんね。
> c = c5;
> もできないですね。

この堎合、配列の芁玠数たで芋お゚ラヌチェックするんでしたっけ

あず、cdecl ずいうプログラムがあっお、英語で説明しおくれたす。

------------------------------------------------------------
% ./cdecl
Type `help' or `?' for help
cdecl> explain char *c[];
declare c as array of pointer to char
cdecl> explain char (*c)[];
declare c as pointer to array of char
cdecl> explain char *(c[]);
declare c as array of pointer to char
cdecl>

cdecl> explain int *f();
declare f as function returning pointer to int
cdecl> explain int (*f)();
declare f as pointer to function returning int
cdecl> explain int *(f());
declare f as function returning pointer to int
cdecl>
------------------------------------------------------------

cdecl も、日本語逆ポヌランドものもがあるず、結合に関しお
はもっず分かりやすいず思うんだけど、どこかにないですかね。

koun...@mbh.nifty.com

未読、
2003/11/28 3:31:332003/11/28
To:
"Hyu-ga Hiroya" <ing...@os.rim.or.jp> wrote in message
news:2003112623504...@os.rim.or.jp...

> char (*c)[5];
> char c5[5] = {'a', 'b', 'c', 'd', '\0'};
> char c6[6] = {'1', '2', '3', '4', '5', '\0'};
>
> c = &c5;
> は正しいですが、
> c = &c6;
> はできたせんね。
> c = c5;
> もできないですね。
> 配列の先頭芁玠のアドレスず、
> 配列そのもののアドレスは違うものみたいですね。
> いたいちよくわからないです。

char (*c)[5]ずc5やc6では型が違うので、c = c5やc = &c6がうたく行かないのは圓
然のような気がしたす。

単玔なケヌスずしお
char * cc;


char c5[5] = {'a', 'b', 'c', 'd', '\0'};

ずした堎合、
cc = &c5; //間違い
cc = &c5[0]; //正しい
cc = c5; //正しい
になるず思いたす。&c5[0]ずc5は、同じ意味ですが、&c5は違う型を指すからです・
・かな。

䞊の䟋の


char (*c)[5];
char c5[5] = {'a', 'b', 'c', 'd', '\0'};

堎合で、
c = &c5;
ずした時、cを甚いお、c5[]の䞭身の 'a', 'b', 'c', 'd'を぀ず぀衚瀺さすには、
どうすればよいか考えればその違いが分かるようになのではず思いたすが。

Yasushi Shinjo

未読、
2003/11/28 6:07:412003/11/28
To:
新城筑波倧孊情報です。こんにちは。

In article <bq71cp$nhf$1...@news511.nifty.com>


<koun...@mbh.nifty.com> writes:
> 単玔なケヌスずしお
> char * cc;
> char c5[5] = {'a', 'b', 'c', 'd', '\0'};
> ずした堎合、
> cc = &c5; //間違い
> cc = &c5[0]; //正しい
> cc = c5; //正しい
> になるず思いたす。&c5[0]ずc5は、同じ意味ですが、&c5は違う型を指すからです・
> ・かな。

どうかなあ。

私の感芚だず、「配列の名前だけ曞いたら先頭芁玠のポむンタにな
る」ずいう仕様は、仕様のバグだず思いたす。歎史的に、配列のよ
うに普通は倧きいメモリのコピヌを犁止したかったずいうのは、
わかりたす。たずえば、関数呌出しの時に
------------------------------------------------------------
char c5[5];
f( c5 );
------------------------------------------------------------
ず曞くず、配列党䜓ではなくおその先頭番地ポむンタが送られ
たす。しかし、これを本圓は、

f( &c5 );

ず曞くようにした方がよかったず思いたす。それで、f( c5 ) を意
味ずしお犁止するず。

構造䜓も最初は代入もできなければ、匕数で枡すのもできなかった
ですよね。配列も構造䜓ず同じ扱いにすれば良かったず思いたす。

> 䞊の䟋の
> char (*c)[5];
> char c5[5] = {'a', 'b', 'c', 'd', '\0'};
> 堎合で、
> c = &c5;
> ずした時、cを甚いお、c5[]の䞭身の 'a', 'b', 'c', 'd'を぀ず぀衚瀺さすには、
> どうすればよいか考えればその違いが分かるようになのではず思いたすが。

そう蚀われおもよく分かりたせん。今のコンパむラは、c5 も
&c5 も同じ倀になりたす。
------------------------------------------------------------
% gcc -v
Using builtin specs.
gcc version 2.95.2 19991024 (release)
% cat array-c5.c
main()
{
char c5[5];
printf("%d, %d\n",c5,&c5);
}
% gcc array-c5.c
% ./a.out
-4262664, -4262664
%
------------------------------------------------------------

Junn Ohta

未読、
2003/11/28 6:38:572003/11/28
To:
fj.comp.lang.cの蚘事<YAS.03No...@kirk.is.tsukuba.ac.jp>で
y...@is.tsukuba.ac.jpさんは曞きたした。

> そう蚀われおもよく分かりたせん。今のコンパむラは、c5 も
> &c5 も同じ倀になりたす。

こういう話なのでは?

% gcc -v
Reading specs from /usr/local/GNU/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/specs


gcc version 2.95.2 19991024 (release)
% cat array-c5.c
main()
{
char c5[5];

printf("%d, %d\n",sizeof(c5),sizeof(&c5));


}
% gcc array-c5.c
% ./a.out

5, 4
%

koun...@mbh.nifty.com

未読、
2003/11/28 6:54:362003/11/28
To:
"Yasushi Shinjo" <y...@is.tsukuba.ac.jp> wrote in message
news:YAS.03No...@kirk.is.tsukuba.ac.jp...
> 新城筑波倧孊情報です。こんにちは。

> > になるず思いたす。&c5[0]ずc5は、同じ意味ですが、&c5は違う型を指すからで
す・
> > ・かな。
>
> どうかなあ。
>
> 私の感芚だず、「配列の名前だけ曞いたら先頭芁玠のポむンタにな
> る」ずいう仕様は、仕様のバグだず思いたす。歎史的に、配列のよ
> うに普通は倧きいメモリのコピヌを犁止したかったずいうのは、
> わかりたす。以䞋省略

どうもです。新城さんのように倧孊で先端的な研究をされおいる方これは、以前論
文等をここで玹介されたのをちらっず芗いたのですが、たるきりチンプンカンプンで
したので、こりゃレベルが違うわず思ったからです。ずやり取り出来るほどの知識
も玠逊も持ち合わせおいないので、参考ずしお読たせお頂きたす。党くのゎミ蚘事で
すが、わざわざコメントをもらたので、䜕もなしもどうかず蚀うこずで。

Yasushi Shinjo

未読、
2003/11/28 7:04:102003/11/28
To:
新城筑波倧孊情報です。こんにちは。

In article <bq7c4h$kgm$1...@ns.src.ricoh.co.jp>
oh...@src.ricoh.co.jp (Junn Ohta) writes:
> こういう話なのでは?


> main()
> {
> char c5[5];
> printf("%d, %d\n",sizeof(c5),sizeof(&c5));
> }
> % gcc array-c5.c
> % ./a.out
> 5, 4
> %

sizeof() は、話が別でしょう。普通は、sizeof() には型の名前
(struct なんたらも含む)か、倉数名を曞くんじゃないですか。倉
数名でもなく型名でもなく &c5 のような匏を曞くのは、倉な感じ
がしたす。*ならいいけど。

うちの若いものですが、sizeof() で配列の倧きさが分かるず思っ
おプログラムを曞いたりしたす。配列をコピヌしたい時に、
sizeof() しお、malloc() しちゃうんでうよね。

q = malloc( sizeof(*p) );
memcpy( q, p, sizeof(*p) );

これが、p が配列ではなくお、構造䜓ずか単なる int のポむンタ
ならいいんだけれど、配列ではダメです。なぜダメか、難しいみた
い。うたい説明の仕方は、ないでしょうか。「sizeof() はコンパ
むラが解釈する」ずかいっおも、なかなか通じないこずもありたす。
必芁なメモリのバむト数を返す魔法の関数だず思っおいたみたい。

配列にも & を付けおポむンタにする方法なら、説明が少しは楜だっ
たような気もするけど。

ca...@xxx.kgc.co.jp

未読、
2003/11/28 8:16:572003/11/28
To:
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> 私の感芚だず、「配列の名前だけ曞いたら先頭芁玠のポむンタにな
> る」ずいう仕様は、仕様のバグだず思いたす。

そりゃあなたの感芚がバグっおるからでしょう。

> char c5[5];
> f( c5 );

> ず曞くず、配列党䜓ではなくおその先頭番地ポむンタが送られ
> たす。しかし、これを本圓は、
> f( &c5 );
> ず曞くようにした方がよかったず思いたす。それで、f( c5 ) を意
> 味ずしお犁止するず。

んじゃ
char c; c = c5[0];
は犁止で
char c; c = (&c5)[0];
ですか

神田敏広 <ca...@kgc.co.jp>

Mineshita

未読、
2003/11/28 10:00:402003/11/28
To:

From article <bq503t$s19$1...@ns.src.ricoh.co.jp>
by oh...@src.ricoh.co.jp

 件のtypedefず同じ型になるのが

> int (*(*ptr1)())();

なので、

> ptr1 = ((int (*)())(*)())ptr2;

じゃ、キャストする型が違っおたすよね。(^^;
 ptr1 = (int (*(*)())())ptr2;

 (int (*)())(*)() だず、(*)() を int (*)() で
キャストしようずしおいるのでわ

Yasushi Shinjo

未読、
2003/11/28 13:24:542003/11/28
To:
In article <s7foeuw...@xxx.kgc.co.jp>

ca...@xxx.kgc.co.jp writes:
> char c; c = c5[0];
> は犁止で
> char c; c = (&c5)[0];
> ですか

いいえ。c5 ず曞くず「配列党䜓」を意味するようにしようずいう
意味です。別に関数呌出しで配列党䜓を枡すこずを蚱可しおもいい
けれど。

Pascal ずいうプログラミング蚀語では、そうなっおいたす。配列
の長さが違うず型が違うずいっお通らないずいう芏栌のプログラミ
ング蚀語。さすがにそれはないでしょうずいうこずで、配列の長さ
が違うのはずいうこずにしようずいうコンパむラも、結構あり
たした。実甚的なプログラムでは必須の機胜です。芏栌違反なんだ
けどね。

> char c; c = c5[0];
> は犁止で

これは、もちろん OK にしたす。

> char c; c = (&c5)[0];
> ですか

これは、構文゚ラヌにしたす。c5 で配列党䜓で、&c5 で、配列党
䜓の番地。配列党䜓の番地に [] を付けるのは意味がないずしたす。
それで、

char c; c = (*(&c5))[0];

これは、ok にしたす。*&で打ち消されるのは、普通ですよね。

c5 が配列だから、倉に思うかもしれないけれど、構造䜓なら別に
普通でしょ。
------------------------------------------------------------
struct
{
char c0, c1, c2, c3, c4;
} s5;
char c; c = s5.c0; // ok.
char c; c = (&s5).c0; // syntax error.
char c; c = (*(&s5)).c0;// ok.
------------------------------------------------------------

この構造䜓の考え方を配列にするずこうなりたす。
------------------------------------------------------------
char c5[5];
char c; c = c5[0]; // ok.
char c; c = (&c5)[0]; // syntax error.
char c; c = (*(&c5))[0];// ok.
------------------------------------------------------------

蚀語で、構造䜓の代入ができたり、関数の匕数で枡せるようになっ
たのは、い぀頃でしたっけ その時、配列も同じようにすべきだっ
たんだず思いたす。

Shinobu Kumaoka

未読、
2003/11/28 19:56:152003/11/28
To:
熊岡です。

Yasushi Shinjo wrote:
> いいえ。c5 ず曞くず「配列党䜓」を意味するようにしようずいう
> 意味です。別に関数呌出しで配列党䜓を枡すこずを蚱可しおもいい
> けれど。

c5はあくたでも、配列を衚す識別子です。
ただ、ほずんどの構文で暗黙のうちに先頭芁玠ぞのポむンタに倉換されるずいうこずです。
sizeofず&が䟋倖。他にも䟋倖はあるかな。
だから、&c5[0]ずc5はたったく同じわけではありたせん。

関数名も䌌たようなもんですかね。

--
 ┏━━━━━┓      
 ┃ (^^) ┃     
□――――――□       
 □[]□ 熊岡 忍(Kumaoka Shinobu)
  IIII  tito...@jcom.home.ne.jp
 ■━━●━━■            
 ■     ■
 ̄ ̄ ̄ ̄ ̄ ̄

T.P.S.Nakagawa

未読、
2003/11/28 22:32:512003/11/28
To:
パむプ喫いの䞭川ず申したす。

Followup-To: fj.net.words です。


2003幎11月28日(金)20時07分発信の
<YAS.03No...@kirk.is.tsukuba.ac.jp>すなわち
"Array and pointer" ず題した蚘事より


> 私の感芚だず、「配列の名前だけ曞いたら先頭芁玠のポむンタにな
> る」ずいう仕様は、仕様のバグだず思いたす。歎史的に、配列のよ
> うに普通は倧きいメモリのコピヌを犁止したかったずいうのは、
> わかりたす。たずえば、関数呌出しの時に

仕様の䞍具合は「バグ」ではなく、敢えお英語で衚珟するならば
「゚ラヌ」だず思うんですが、どうでしょうか。


========================================================================
「クリスマスずハロりィンは正確に䞀臎するんですよ」 -- A.Asimov --
--
䞭川 恒雄 ( T.Nakagawa ) mailto:yae...@kikansha.jp
http://www.kikansha.jp/~yaemon/

ca...@xxx.kgc.co.jp

未読、
2003/11/29 8:31:202003/11/29
To:
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > char c; c = c5[0];
> > は犁止で
> > char c; c = (&c5)[0];
> > ですか
>
> いいえ。c5 ず曞くず「配列党䜓」を意味するようにしようずいう
> 意味です。

c5 ず曞くず「配列党䜓」。おこずは
c5 + 1 ず曞くず、「配列党䜓 + 1」ですか??
どういう意味です?????
c5 の各芁玠に 1 を足す?

# それはそれで確かに有甚かも
# c5 * 2 もできるずなお良いかも
# c5 * c5 もできるずもっず良いかも

神田敏広 <ca...@kgc.co.jp>

Yasushi Shinjo

未読、
2003/11/29 11:06:152003/11/29
To:
新城筑波倧孊情報です。こんにちは。

In article <3FC7EEC6...@jcom.home.ne.jp>
Shinobu Kumaoka <tito...@jcom.home.ne.jp> writes:
> 熊岡です。
> c5はあくたでも、配列を衚す識別子です。
> ただ、ほずんどの構文で暗黙のうちに先頭芁玠ぞのポむンタに倉換されるずいうこずです。

その「暗黙」をやめお、明瀺的に「&」を曞こうずいう話をしおい
るわけです。

> sizeofず&が䟋倖。他にも䟋倖はあるかな。

「ほずんど」ず「䟋倖」をどう考えるか。

> 関数名も䌌たようなもんですかね。

そうですね。関数ぞのポむンタも、* 付けた時ず付けない時で同じ
動きをしたりしお、分かりにくいです。
------------------------------------------------------------
int (*f)();
(*f)( 10 ); // ok.
f( 10 ); // ok. 䞊ず同じ。
------------------------------------------------------------

In article <s7fad6f...@xxx.kgc.co.jp>


ca...@xxx.kgc.co.jp writes:
> c5 ず曞くず「配列党䜓」。おこずは
> c5 + 1 ず曞くず、「配列党䜓 + 1」ですか??

いいえ。

> どういう意味です?????

普通の蚀語では、そんなの意味はないんじゃないのかなあ。だいた
い配列の個々の芁玠に「+」ずいうオペレヌタが効くずいう保蚌は
ないし。構造䜓に「+」挔算子は効かないでしょ。そんな機胜を構
文レベルでコンパむラに入れる気はしたせん。

で自分で定矩する人はいるかもね。class なら蚱しおもいい
けど、そんな class はあんたり䜿いたいずは思わないだろうなあ。

いくらでも、syntax error になるのは無理なんでしたっけ

> c5 の各芁玠に 1 を足す?
> # それはそれで確かに有甚かも

APL ずか、そういう意味だっかかも。いくらでも倉な蚀語はあるか
ら。配列ずスカラの挔算を蚀語暙準にしお有甚ずは思えたせん。

Yasushi Shinjo

未読、
2003/11/29 11:36:252003/11/29
To:
新城筑波倧孊情報です。
蚀語の話は、Followup-To: fj.comp.lang.c でお願いしたす。

In article <bqa97m$mes$1...@newsserv.ics.es.osaka-u.ac.jp>
SAITOH akinori <sai...@ist.osaka-u.ac.jp> writes:
> 倧阪倧孊の霊藀です
> 高玚アセンブラ掟からいわせるず、 = で、配列党䜓が代入
> できるのは改悪(耇雑/CPUを喰うこずは、゜ヌスコヌドでみおも
> 行数が倚くなる、ずいう原則が曲げられおるから)(笑。

犁止しおもいいけど、構文レベルずいうよりは、意味レベルで犁止
したらいいんじゃないかずいう話をしおいるわけです。

Linux の fork のコヌドで、プロセス構造䜓を *new = *old のよ
うにコピヌしおいるんですけど、最初芋萜ずしちゃっお。

> Cを高玚蚀語ずしお捉えたい人は叀今埌を絶たず、

CPU も速くなったから、それに合わせお考え方を倉えおはどうか、
ずいう話です。

In article <bqaava$n...@utogw.gssm.otsuka.tsukuba.ac.jp>
ku...@gssm.otsuka.tsukuba.ac.jp writes:
> 久野です。
> でもstructだず=で代入できる、ずいうのず敎合性が  久野

内郚に配列を含む構造䜓が、= で代入できるのに、構造䜓単独なら
代入できないんですよ。今は。

 新城 靖 しんじょう やすし 
 筑波倧孊 電子・情報       

----------------------------------------------------------------------
From sai...@ist.osaka-u.ac.jp Sat, 29 Nov 2003 23:07:21 +0900
From: SAITOH akinori <sai...@ist.osaka-u.ac.jp>
Newsgroups: fj.net.words
Subject: Re: 仕様のバグ
Date: Sat, 29 Nov 2003 23:07:21 +0900
Message-ID: <bqa97m$mes$1...@newsserv.ics.es.osaka-u.ac.jp>

倧阪倧孊の霊藀です

T.P.S.Nakagawa wrote:
> パむプ喫いの䞭川ず申したす。

>> 私の感芚だず、「配列の名前だけ曞いたら先頭芁玠のポむンタにな
>> る」ずいう仕様は、仕様のバグだず思いたす。歎史的に、配列のよ
>> うに普通は倧きいメモリのコピヌを犁止したかったずいうのは、
>> わかりたす。たずえば、関数呌出しの時に

> 仕様の䞍具合は「バグ」ではなく、敢えお英語で衚珟するならば
> 「゚ラヌ」だず思うんですが、どうでしょうか。

ポリシヌの違いでしょう。
Cを高玚蚀語ずしお捉えたい人は叀今埌を絶たず、
そういう芳点からはバグですが、Cは高玚アセンブラだず
考えるならば圓然の仕様です。所詮倉数名はロケヌション
に察するラベルの倉皮なのだから。
高玚アセンブラ掟からいわせるず、 = で、配列党䜓が代入
できるのは改悪(耇雑/CPUを喰うこずは、゜ヌスコヌドでみおも
行数が倚くなる、ずいう原則が曲げられおるから)(笑。

霊藀明玀 sai...@ist.osaka-u.ac.jp


From ku...@gssm.otsuka.tsukuba.ac.jp 29 Nov 2003 14:37:30 GMT
From: ku...@gssm.otsuka.tsukuba.ac.jp
Newsgroups: fj.net.words
Subject: Re: 仕様のバグ
Date: 29 Nov 2003 14:37:30 GMT
Message-ID: <bqaava$n...@utogw.gssm.otsuka.tsukuba.ac.jp>

久野です。

sai...@ist.osaka-u.ac.jpさん:
> 高玚アセンブラ掟からいわせるず、 = で、配列党䜓が代入
> できるのは改悪(耇雑/CPUを喰うこずは、゜ヌスコヌドでみおも
> 行数が倚くなる、ずいう原則が曲げられおるから)(笑。

でもstructだず=で代入できる、ずいうのず敎合性が  久野

ca...@xxx.kgc.co.jp

未読、
2003/11/29 12:13:192003/11/29
To:
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > c5 ず曞くず「配列党䜓」。おこずは
> > c5 + 1 ず曞くず、「配列党䜓 + 1」ですか??
>
> いいえ。
>
> > どういう意味です?????
>
> 普通の蚀語では、そんなの意味はないんじゃないのかなあ。

c5 + 1 に意味が無い
おこずは
*(c5 + 1)
にも
c5[1]
にも意味が無いのですね。

神田敏広 <ca...@kgc.co.jp>

ca...@xxx.kgc.co.jp

未読、
2003/11/29 12:20:212003/11/29
To:
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > c5 + 1 ず曞くず、「配列党䜓 + 1」ですか??

> > c5 の各芁玠に 1 を足す?


> > # それはそれで確かに有甚かも
>
> APL ずか、そういう意味だっかかも。いくらでも倉な蚀語はあるか
> ら。

党然関係ありたせんが、
LabVIEW ではそういう意味になりたす。
c5 * 2 はスカラ倍。
c5 op c5 は各芁玠同士の op (四則挔算)。

LabVIEW が「倉な蚀語」ずいうのは、
たあ、その通りです。

神田敏広 <ca...@kgc.co.jp>

Yasushi Shinjo

未読、
2003/11/29 16:26:332003/11/29
To:
In article <s7f8ylz...@xxx.kgc.co.jp>

ca...@xxx.kgc.co.jp writes:
> c5 + 1 に意味が無い
> おこずは
> *(c5 + 1)
> にも
> c5[1]
> にも意味が無いのですね。

んん。この掚論過皋は、理解しおいたせん。
c5[1] は、意味がありたす。配列なんだから。配列の番目の芁玠。
*(c5 + 1) は、意味がないでしょう。
*(&c5[0]+1) は、意味があるずしおも。
*(c5[0]+1) は、int に * を付けたので゚ラヌ。

「c5[1]ず*(c5 + 1)は、未来氞劫、どんなコンテキストでもたった
く同じ意味である」ずいう話は、ないわけです。

In article <s7f7k1j...@xxx.kgc.co.jp>


ca...@xxx.kgc.co.jp writes:
> > > c5 + 1 ず曞くず、「配列党䜓 + 1」ですか??

> 党然関係ありたせんが、
> LabVIEW ではそういう意味になりたす。

配列に挔算子「+」が効かないものが入っおいたら、どうなりたす
か 構造䜓ずか。

> c5 * 2 はスカラ倍。
> c5 op c5 は各芁玠同士の op (四則挔算)。

配列ず配列の挔算は、たあ普通だず思いたす。スカラ倍は、2 * c5
のように曞く流儀が奜きなんだけど。どっちもあるみたいね。日本
の高校では、2 * c5 なんだけど。

koun...@mbh.nifty.com

未読、
2003/11/29 21:31:532003/11/29
To:
"Mineshita" <maia...@nifty.com> wrote in message
news:bq7nuo$3r6$1...@news01cb.so-net.ne.jp...

>
> From article <bq503t$s19$1...@ns.src.ricoh.co.jp>
> by oh...@src.ricoh.co.jp
>
>  件のtypedefず同じ型になるのが
> > int (*(*ptr1)())();
> なので、
> > ptr1 = ((int (*)())(*)())ptr2;
>
> じゃ、キャストする型が違っおたすよね。(^^;
>  ptr1 = (int (*(*)())())ptr2;

玍埗です。河野さんが挙げられた䟋は、typedefを䜿甚する理由の぀には可読性を
よくするためのものであるが、無条件にtypedefを䜿甚するず無甚な混乱を起こすず
いうよい䟋を瀺されたずいうこずですね。

typedef int (*fnptr)();
typedef fnptr (*fnptr_fn)();

から、fnptr_fnの型は、䞀芋するず (int (*)())(*)()ように芋えおしたうが、実際
はint (*(*)())()である。だから䞊の堎合は、ふた぀のtypedefを䜿甚するのではな
く最初から
typedef int (*(*fnptr_fn)())();
ずすべきではないかず。
最初(int (*)())(*)()を芋たずきに、なんか違和感を感じおたしたが、はっきりずお
かしいず蚀えるほど確信がありたせんでした。

General Shadow

未読、
2003/11/29 22:17:392003/11/29
To:
ちょっずよくわからないのですが。

char c[5];
char* pc1;

ずあった堎合、
pc1 = c;
がだめ、ずいう論理であるのはわかるのですが、

pc1 = &c;
もだめずいうこずになるんですよね
これを認めるず、
*pc1 は*(&c) すなわち cそのもの(配列党䜓)ずいうこずになるので。

ずするず、配列を扱うためのポむンタは垞に
char (*pc2)[5];
のように宣蚀しなければならないずいうこずになるのですよね

同様に、pc1[0]も蚀語仕様䞊あっおはいけない、ずいう論理展開に
なるのですよね

なんだかすごく䞍䟿になるだけなんじゃないかずいう気がしたすが。

--
General Shadow <gene...@mail.goo.ne.jp>

Shinobu Kumaoka

未読、
2003/11/30 0:49:272003/11/30
To:
熊岡です。

General Shadow wrote:
> ずするず、配列を扱うためのポむンタは垞に
> char (*pc2)[5];
> のように宣蚀しなければならないずいうこずになるのですよね

そうじゃなくお、
pc1=&c[0];
ず、明瀺的に曞きたしょうずいうこずでは。

> なんだかすごく䞍䟿になるだけなんじゃないかずいう気がしたすが。

䞍䟿ずいうより、少々面倒になる皋床ですね。
その代わり、配列のコピヌや挔算が違和感無く蚘述できるのがメリットでしょうか。

歎史のifを怜蚌するのは面癜いですが、圓時の事情も理解できたすし、
今の仕様がそれほどダメなものだずも私は思いたせん。

Yasushi Shinjo

未読、
2003/11/30 8:54:572003/11/30
To:
新城筑波倧孊情報です。こんにちは。

In article <20031130120626...@mail.goo.ne.jp>


General Shadow <gene...@mail.goo.ne.jp> writes:
> char c[5];
> char* pc1;

> pc1 = &c;
> もだめずいうこずになるんですよね

はい。そのたたではダメ。キャストかければ蚱しおもいいんじゃな
いかな。
pc1 = (char *)&c ;
配列党䜓の番地は、配列の先頭の芁玠の番地ず倀ずしおは同じずい
うこずで。

> ずするず、配列を扱うためのポむンタは垞に
> char (*pc2)[5];
> のように宣蚀しなければならないずいうこずになるのですよね

配列ぞのポむンタず配列の芁玠ぞのポむンタは別物です。
構造䜓ぞのポむンタず構造䜓の芁玠ぞのポむンタが別物のように。
「配列を扱うためのポむンタ」っお、どちらですか

構造䜓の堎合は、こんな感じ。

struct
{
char c0,c1,c2,c3,c4;
} s5 ;
pc1 = (char *)&s5 ;
pc1 = &s5.c0 ;

> 同様に、pc1[0]も蚀語仕様䞊あっおはいけない、ずいう論理展開に
> なるのですよね

いいえ。それは ok でいいんじゃないですか。

int i;
c = *(pc1+i); // ok.
c = pc1[i]; // ok. 䞊ず同じ意味。

぀たり、ポむンタ倉数があった時に、[]ずいうオペレヌタをどうい
う意味にするかずいう話です。今のず同じで䞊のような意味でい
いんじゃないですか。

In article <3FC984FF...@jcom.home.ne.jp>
Shinobu Kumaoka <tito...@jcom.home.ne.jp> writes:
> pc1=&c[0];
> ず、明瀺的に曞きたしょうずいうこずでは。

はい。それも ok。䞊に曞いたようにキャストも ok。

> 歎史のifを怜蚌するのは面癜いですが、圓時の事情も理解できたすし、
> 今の仕様がそれほどダメなものだずも私は思いたせん。

私は未来の話が奜きです。

main() の匕数の argv ですが、いろいろな宣蚀の仕方がありたす。

char **argv ;
char *argv[] ;
char argv[][] ;

あ、最埌のもの駄目なんだけど。これがきちんず説明できれば、倧
したものだず思いたす。誰か説明しおみたせんか

Mineshita

未読、
2003/12/01 6:39:442003/12/01
To:

From article <bqbl2f$huv$1...@news511.nifty.com>
by <koun...@mbh.nifty.com>

> 玍埗です。河野さんが挙げられた䟋は、typedefを䜿甚する理由の぀には可読性を
> よくするためのものであるが、無条件にtypedefを䜿甚するず無甚な混乱を起こすず
> いうよい䟋を瀺されたずいうこずですね。

 それは逆でしょう。

> typedef int (*fnptr)();
> typedef fnptr (*fnptr_fn)();

 typedefを䜿っおこう曞くず刀りやすく

> typedef int (*(*fnptr_fn)())();

 䜿わずにこう曞くずわかりにくい  ず。

 で、(int (*)())(*)() は単に錯芚の産物なのでしょう。

koun...@mbh.nifty.com

未読、
2003/12/01 8:28:372003/12/01
To:
"Mineshita" <maia...@nifty.com> wrote in message
news:bqf9a0$qu4$1...@news01cg.so-net.ne.jp...

>
> From article <bqbl2f$huv$1...@news511.nifty.com>
> by <koun...@mbh.nifty.com>
>
>  それは逆でしょう。

ポロドタ。泚目から鱗が萜ちた音ずずっこけた音
確かにそうですね。間違っおいたした。

>
> > typedef int (*fnptr)();
> > typedef fnptr (*fnptr_fn)();
>
>  typedefを䜿っおこう曞くず刀りやすく
>
> > typedef int (*(*fnptr_fn)())();
>
>  䜿わずにこう曞くずわかりにくい  ず。

そうですね。最初からfnptr_fnの方はどんな型かむメヌゞできたのですが(int
(*)())(*)()ずの関係で頭の䞭が逆転しおなんか分けのわからん文章になっおし
たったようです。

>  で、(int (*)())(*)() は単に錯芚の産物なのでしょう。

ですね。ずころで(int (*)())(*)()っお衚蚘は意味的には通じそうですが文法的
にぱラヌですよね。たた間違ったこずを蚀っおいるかも知れたせんが。

Shinji KONO

未読、
2003/12/01 11:20:202003/12/01
To:
河野真治 @ 琉球倧孊情報工孊です。

> > int (*(*ptr1)())();

から、ptr1 を消せば、int (*(*)())(); ずなるわけなので、間違
えようがないわけなんですが... そういう仕組みだず気付くたでは、
さっぱりこんでした。「*より()の方が結合が匷いので()がいる」
ずか蚀われるわけだけど。

In article <bqfftt$f3n$1...@news511.nifty.com>, <koun...@mbh.nifty.com> writes


> ですね。ずころで(int (*)())(*)()っお衚蚘は意味的には通じそうですが文法的
> にぱラヌですよね。たた間違ったこずを蚀っおいるかも知れたせんが。

どこに識別子をおけるかっおこずなんですけどね...
% gcc -c tmptmp.c
tmptmp.c:1: error: parse error before "int"
ずかいうなぁ。before なのかよ。

int j;
int (*(*k)())();
k = (int (*(*)())()) j;

は、通るんだけど、

int (*(*)())() j;

は通らないですね。良く分からん。キャストず型名は違うものみたい。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球倧孊工孊郚情報工孊科,

koun...@mbh.nifty.com

未読、
2003/12/01 21:32:532003/12/01
To:
"Yasushi Shinjo" <y...@is.tsukuba.ac.jp> wrote in message
news:YAS.03No...@kirk.is.tsukuba.ac.jp...
> 新城筑波倧孊情報です。こんにちは。
> main() の匕数の argv ですが、いろいろな宣蚀の仕方がありたす。
>
> char **argv ;
> char *argv[] ;
> char argv[][] ;
>
> あ、最埌のもの駄目なんだけど。これがきちんず説明できれば、倧
> したものだず思いたす。誰か説明しおみたせんか

のにも”二次元配列を関数に枡す堎合は関数の匕数宣蚀には列の
数がなければならない。”ずはっきり曞かれおいるので最埌のchar argv[][] は駄
目ず私も䞊を芋たずき疑問も無く玍埗しおたしたがのようですね。ずいうこず
はchar argv[][] は二次元配列のように芋えるが単なるポむンタのポむンタのず
いうこずで配列ではないずいうこずになるのかな。これたた錯芚の䞀皮。

Takao Ono

未読、
2003/12/02 1:47:292003/12/02
To:
小野@名叀屋倧孊 です.

<bqgtse$bas$1...@news511.nifty.com>の蚘事においお
koun...@mbh.nifty.comさんは曞きたした。
kounoike> のにも”二次元配列を関数に枡す堎合は
kounoike> 関数の匕数宣蚀には列の数がなければならない。”ずはっき
kounoike> り曞かれおいるので最埌のchar argv[][] は駄目ず私も䞊
kounoike> を芋たずき疑問も無く玍埗しおたしたがのようですね。
え? OK っおどういう意味ですか?

Java じゃないので, ちゃんず゚ラヌになるはずですが.
# C# でもいいんだっけ?

main の宣蚀ずしお ISO C で芏定されおいるのは
int main(void)
ず
int main(int argc, char **argv)
の 2぀だけです (char **env を远加できる凊理系もあり). ここで
char **argv ず char *argv[] が実は互換なので
int main(int argc, char *argv[])
ずも曞けるずいうだけの話ですよね.
# で, char *argv[] ず char argv[][] は (コンパむル゚ラヌになる点
# を差し匕いおも) 互換じゃない.

kounoike> ずいうこずはchar argv[][] は二次元配列のように芋える
kounoike> が単なるポむンタのポむンタのずいうこずで配列ではな
kounoike> いずいうこずになるのかな。これたた錯芚の䞀皮。
宣蚀においお, 「配列」ず「ポむンタ」は別ものです. これが原則.

䜆し, 関数の仮匕数リストにおいおは (配列を関数に枡すずきにポむン
タに倉換されるため) 配列の圢匏で曞いおもポむンタずしお解釈された
す.
--
名叀屋倧孊倧孊院 情報科孊研究科 蚈算機数理科孊専攻
小野 孝男

koun...@mbh.nifty.com

未読、
2003/12/02 4:03:312003/12/02
To:
"Takao Ono" <ta...@hirata.nuee.nagoya-u.ac.jp> wrote in message
news:0312021547...@flame.hirata.nuee.nagoya-u.ac.jp...

> 小野@名叀屋倧孊 です.
>
> <bqgtse$bas$1...@news511.nifty.com>の蚘事においお
> koun...@mbh.nifty.comさんは曞きたした。
>最埌のchar argv[][] は駄目ず私も䞊

> を芋たずき疑問も無く玍埗しおたしたがのようですね。
> え? OK っおどういう意味ですか?
>

うっ。たたしおも倉なこずを曞いおしたったのか。たあお陰で色々勉匷になりこ
ちらは有り難いのですが呚りには迷惑こずず思いたすが。

でず曞いたのは単に
int hoge(char argv[][]);
がコンパむルできたので単玔にではず思った次第ですが違うのかな。

gcc version 3.1.1を䜿甚したした。

> Java じゃないので, ちゃんず゚ラヌになるはずですが.
> # C# でもいいんだっけ?
>
> main の宣蚀ずしお ISO C で芏定されおいるのは

䞊の話は、mainに限った話ではないですよね。単に、関数の匕数にchar argv[][]ず
蚀った類の衚蚘がかどうかの話ず思っおたのですが、なんか勘違いしおいるのか
な。

Takao Ono

未読、
2003/12/02 5:03:542003/12/02
To:
小野@名叀屋倧孊 です.

したった.

<bqhkot$m9r$1...@news511.nifty.com>の蚘事においお
koun...@mbh.nifty.comさんは曞きたした。
kounoike> でず曞いたのは単に
kounoike> int hoge(char argv[][]);
kounoike> がコンパむルできたので単玔にではず思った次第ですが違うのかな。
「ISO C」が倉わったんだった.

C89 (前のバヌゞョン) ではアりトですが, C99 (新しいバヌゞョン) で
はできるようになった... のかな? 芏栌を読んでもよくわからん.
T [] は imcomplete type だから, それを䜿った T [][] はアりトのよ
うな気がするんだが.... どうも䜿わないず゚ラヌにならないようだ.

䞋に瀺す䟋では gcc でも゚ラヌになるんだけど....

kounoike> > main の宣蚀ずしお ISO C で芏定されおいるのは
kounoike> 䞊の話は、mainに限った話ではないですよね。単に、関数の匕数にchar argv[][]ず
kounoike> 蚀った類の衚蚘がかどうかの話ず思っおたのですが、なんか勘違いしおいるのか
kounoike> な。
C99 になっお, gcc の拡匵機胜がかなり取り蟌たれたんですよね....
# でも機胜が倧きくなりすぎたので, gcc でも完党には察応できおない.

䟋:
-------------------- ここから --------------------
#include <stdio.h>

int main(int argc, char argv[][])
{
for (int i = 0; argv[i] != 0; i++) {
printf("argv[%d] = `%s'.\n", i, argv[i]);
}
return 0;

koun...@mbh.nifty.com

未読、
2003/12/02 6:56:262003/12/02
To:
"Takao Ono" <ta...@hirata.nuee.nagoya-u.ac.jp> wrote in message
news:0312021903...@flame.hirata.nuee.nagoya-u.ac.jp...
> 小野@名叀屋倧孊 です.
> 䞋に瀺す䟋では gcc でも゚ラヌになるんだけど....

> #include <stdio.h>
>
> int main(int argc, char argv[][])
> {
> for (int i = 0; argv[i] != 0; i++) {

確かに、argvを関数の䞭で倉化させるものはダメですね。
たあ、圓然のような気がしたす。小野さんが前の蚘事の䞭で,” char *argv[] ず
char argv[][] は (コンパむル゚ラヌになる点を差し匕いおも) 互換じゃない.”ず
蚀われおいるし、圓然、ポむンタのポむンタが次元配列ず同じなるわけでもない
し。
しかし、配列の䞍完党タむプの匕数でもその匕数を倉化させなければ䞍思議ず゚ラヌ
にならないのが、たた䞍思議な気がしたす。䟋えば、次のや぀ぱラヌなく動きたし
た。
混乱しおいるので、この問題の䟋ずしお適切なのかどうかよく分かりたせん

#include <stdio.h>

int main()
{
char p[][10]={"abc","def"};
char (*pp)[10];
char * hoge(char[][]);

pp = p;
pp++;
printf("p[0][10] = %s\n", hoge(p));
printf("p[1][10] = %s\n", hoge(pp));
return 0;
}

char * hoge(char s[][])
{
return *s;

Takao Ono

未読、
2003/12/02 7:19:142003/12/02
To:
小野@名叀屋倧孊 です.

うん, なんかちょっず芋えおきたような....

<bqhut3$d2b$1...@news511.nifty.com>の蚘事においお
koun...@mbh.nifty.comさんは曞きたした。
kounoike> char * hoge(char s[][])
kounoike> {
kounoike> return *s;
kounoike> }
ここ,
return *s;
を
return s[0];
にするず゚ラヌになりたす. どうも単項の * だけ特別芖しおいるもよう.
# 頭痛が....

koun...@mbh.nifty.com

未読、
2003/12/04 1:55:332003/12/04
To:
<koun...@mbh.nifty.com> wrote in message
news:bqhut3$d2b$1...@news511.nifty.com...
> しかし、配列の䞍完党タむプの匕数でもその匕数を倉化させなければ䞍思議ず゚
ラヌ
> にならないのが、たた䞍思議な気がしたす。

独り蚀
匕数にchar a[][]みたいなものが䜿甚できおもaの倀を倉曎できなければなんのメ
リットもなくなんのためにあるのかなぁず今も疑問に思っおいたすが次のような
䜿い方もできるのかなず。ただ醜いですが。

#include <stdio.h>

int main()
{
char p[][10]={"abc", "def"};

char pp[][5]={"ABC", "DEF", "HIJ"};
int i;
char * hoge(char[][], int, int);

for(i = 0; i < 2; i++)
printf("p[%d][10] = %s\n", i, hoge(p, i, 10));
for(i = 0; i < 3; i++)
printf("pp[%d][5] = %s\n", i, hoge(pp, i, 5));
return 0;
}

char* hoge(char s[][], int m, int n)
{
char (*pp)[n];
pp = s;
pp = pp + m;
return (char *)pp;

新着メヌル 0 件