なぜポインタで引っかかる人が多いのか
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/06/30(水) 10:22:47引っかかる人は何に困惑しているのか
0002デフォルトの名無しさん
2010/06/30(水) 10:41:340003デフォルトの名無しさん
2010/06/30(水) 11:12:350004デフォルトの名無しさん
2010/06/30(水) 11:30:00クソスレ立てる人はバカなのか死ぬのかチンパンジーなのか。
0005デフォルトの名無しさん
2010/06/30(水) 11:45:080006デフォルトの名無しさん
2010/06/30(水) 14:28:09それを*をつかって値を書き換えたらポインタじゃないじゃん。
参照するまでは許す!でもいじったらポインタじゃない!
0007デフォルトの名無しさん
2010/06/30(水) 15:26:56それ故に今扱ってるのがデータなのか、アドレスなのかワケが分からなくなる。
アドレス書くべきところにデータを書いてしまったり、逆をしたりしたときに
予測不能な挙動を引き出してしまい、何が起きたのか分からなくなる。
ポインタ型と数値型が明確に区別されて、キャストしないと数値にできず
型エラー出すなら引っかかりにくいと思う。
0008デフォルトの名無しさん
2010/06/30(水) 15:44:40そんなことは言われればだれだって理解できるんです。
要するに計算用紙の座標がポインタですから。
でも複合型の文法を出した途端、頭の中で処理できなくなるんです。
加えて、配列がポインタとかウソの説明をうけてごらんなさい。
ほら、分からなくなった!
そうこうしているうちに関数ポインタの説明まで行くでしょ、
そこまで行ったらなーんとなく概念では分かるけど、
文法は全くわからんちーん。
アドレスだから数値と一緒で計算できるとか勘違いするようになる。
配列のポインタが配列の先頭要素指してるから
キャストエラーを無視してもいいとか頭の中が沸いてるんじゃないかと
思う発送をしだすようになる。
0009デフォルトの名無しさん
2010/06/30(水) 15:47:43言語仕様からして割と混同されてるだろ
あれでは分からなくなるのも無理はないかと
0010デフォルトの名無しさん
2010/06/30(水) 15:52:06物理メモリのどっかにあるその領域の先頭を指してるもん的な
意味でしか使ってないぞ>配列
あくまで俺はって話しだけど
いちいち配列の先頭とポインタとでごっちゃになっちゃうような使い方してるのって
組んでるプログラムも怪しくねーか?
俺みたいに物理メモリのどっかを指してるモノってとらえてると
配列もポインタって言っちゃう人がいるのかもね
ただ、その場合連続してるもんとしてないもんと脳みそに入ってないとダメだけど
0011デフォルトの名無しさん
2010/06/30(水) 15:57:19a[2]=2[a]が*(a+2)と等しいことを取って配列と等しいことを指して、
配列とポインタが等しいなんて言う人がいるんだよなあ。
まあもっともポインタが引っかかる人はそれ以前だと思うが。
0012デフォルトの名無しさん
2010/06/30(水) 16:03:58正確な答えを自分は知らない。
0013デフォルトの名無しさん
2010/06/30(水) 16:55:16int a[10];
int *b;
この時、aは定数、bは変数
a[0]はアドレスa+0を参照する
*bは変数bが保持する値をアドレスとしてメモリを参照する
printf等でaとbを参照すると、どちらからもアドレスを得られるので混乱の元となる
0014デフォルトの名無しさん
2010/06/30(水) 17:15:090015デフォルトの名無しさん
2010/06/30(水) 17:19:00でもポインタのアドレスずらして計算なんてぶっちゃけいまやらないからまったく害がないなw
0016デフォルトの名無しさん
2010/06/30(水) 17:38:000017デフォルトの名無しさん
2010/06/30(水) 17:41:49わからない人はどれもやっていない
0018デフォルトの名無しさん
2010/06/30(水) 17:46:380019デフォルトの名無しさん
2010/06/30(水) 17:49:47やる環境さえあれば、身についてしまうことだ。
0020デフォルトの名無しさん
2010/06/30(水) 20:15:10int *b=a;
で、sizeof(a)=40, sizeof(b)=8;
0021デフォルトの名無しさん
2010/06/30(水) 20:33:36俺もそうだったな。学生時代にBASIC→C言語やった時には
全く理由の解らない現象に悩んだもんだ。
メモリの状態によっては期待通りの結果が出たり出なかったりするからまたタチが悪い…
0022デフォルトの名無しさん
2010/06/30(水) 20:37:57[C言語ポインタ完全制覇」とか使ってみて理解できないなら別の要因だろうけど
それと自分で理解を深めたい時、どういった確認(プログラム)すればいいのかわからない
0023デフォルトの名無しさん
2010/06/30(水) 20:44:16俺いまだ32bitのアプリ作ってるわ
0024デフォルトの名無しさん
2010/06/30(水) 20:57:090025デフォルトの名無しさん
2010/06/30(水) 21:12:21・sizeofの値
違いはこれくらいかな。
0026デフォルトの名無しさん
2010/06/30(水) 21:39:190027デフォルトの名無しさん
2010/06/30(水) 22:22:41これってname[0]、name[1]などはアドレスを意味するんですよね?
0028デフォルトの名無しさん
2010/06/30(水) 23:00:36そうだっけ?
0029デフォルトの名無しさん
2010/06/30(水) 23:31:09メモリアドレスという、非常に具体的なものなのだが。
0030デフォルトの名無しさん
2010/06/30(水) 23:34:19なんでこんな糞を量産してるの?ってぐらいダメだね
0031デフォルトの名無しさん
2010/06/30(水) 23:58:380032デフォルトの名無しさん
2010/07/01(木) 00:03:05ぬるぽしたことがないんだろうか
0033デフォルトの名無しさん
2010/07/01(木) 00:05:23本当はjavaでも理解してなきゃならないよな
でもさっぱりわかってねーのがほとんどなの
0034デフォルトの名無しさん
2010/07/01(木) 00:41:310035デフォルトの名無しさん
2010/07/01(木) 01:02:48高専電気科は同時期に教えてた
0036デフォルトの名無しさん
2010/07/01(木) 04:49:23Java, Cどちらもできるけど、「Javaにはポインタは無い」でいいよ。
ポインタが存在する、っていう説明でも別にいいけど。
あるのはあくまで参照。ポインタ演算は不可能。配列も大概アクセス遅いし。
Java出身者が引っかかるのはC++のオブジェクトが
Cで言うオブジェクトと近くて、要するに構造体で値型なところだろう。
>>25
あと&演算子も配列とポインタじゃ変わってくる。
0037デフォルトの名無しさん
2010/07/01(木) 07:57:22int i;
char buffer[100];
char *ptr = buffer;
scanf("%d", &i);
scanf("%s", ptr);
printf("%d", i);
printf("%s", ptr);
なにこれ?なんでscanfではポインタだけ&がなくて、printfでは両方&がないの?
って不思議に思ったな。
この辺でつまづくんじゃね。って一番最初だが。
0038デフォルトの名無しさん
2010/07/01(木) 08:37:40おれ6809だったけど、ポインタでは引っかからなかった
0039デフォルトの名無しさん
2010/07/01(木) 08:49:262〜3年たっても理解できない奴なんていないし
大した問題じゃないんだけどなw
0040デフォルトの名無しさん
2010/07/01(木) 10:13:550041デフォルトの名無しさん
2010/07/01(木) 10:33:450042デフォルトの名無しさん
2010/07/01(木) 10:45:200043デフォルトの名無しさん
2010/07/01(木) 10:59:40試しに簡略なメモリマップ書かせてみたら、書けなかった
という話を開発のリーダに聞いたんだが、ある意味すごいな
0044デフォルトの名無しさん
2010/07/01(木) 11:00:160045デフォルトの名無しさん
2010/07/01(木) 11:01:17意味不明なことやらせんなよ
Windowsのはきついだろw
0046デフォルトの名無しさん
2010/07/01(木) 11:09:08・「ダブルポインタは大丈夫ですけどトリプルポインタは自信がありません」
・「Cの入門書を3冊読んだから書いたことがなくても大丈夫」
・ランバラルの台詞を引用する
0047デフォルトの名無しさん
2010/07/01(木) 11:18:39規格上はポインタがメモリアドレスである保証は無い
0048デフォルトの名無しさん
2010/07/01(木) 11:22:03実際、Cインタプリタで、ポインタの実装が(実装言語の)配列インデックスである例はあるよ。
0049デフォルトの名無しさん
2010/07/01(木) 14:49:20そもそも規格準拠の処理系じゃないんじゃね?
どういう解釈になるんだろ
0050デフォルトの名無しさん
2010/07/01(木) 15:23:18俺みたいなやつがいるから
0051デフォルトの名無しさん
2010/07/01(木) 18:15:360052デフォルトの名無しさん
2010/07/02(金) 08:45:10極力使わないように回避出来ちゃいそうな気もした
0053デフォルトの名無しさん
2010/07/02(金) 08:51:15アセンブラのインデックスアドレッシングを拡張したもんだから、
ハード寄りのプログラミングでは必須。
目次なしでも辞書を引けないことはないが時間かかり過ぎ、というのと似ている。
0054デフォルトの名無しさん
2010/07/02(金) 10:19:27配列とインデックスを別々にすると変数や引数が多くなって気持ち悪い
0055デフォルトの名無しさん
2010/07/02(金) 14:00:22ip += 1;
ip += n;
ip++;
上3つは全て等価だろうか?
int ia[10];int *ip = ia;
for(int n=0; n != 10; n++){
*ip + n = n;
ip[n] = n;
*(ip + n) = n;}
上3つは全て等価だろうか?
0056デフォルトの名無しさん
2010/07/02(金) 15:31:36そんなゴミみたいな例を出すからわからなくなる
大事なのはイメージ
物理メモリにおいてある領域にアクセスしようとしてる仕組みのイメージを
脳みそに描くことであって
そんな読みにくいコードが読めるかどうかはプログラムの能力とちっとも関係ない
0057デフォルトの名無しさん
2010/07/02(金) 15:36:43なんだこりゃ
0058デフォルトの名無しさん
2010/07/02(金) 15:45:08だから、なぜ望んだ動作をしないのかわからず、引っかかるんだ。
読みやすい書き方を提示してやれば、ポインタで引っかかる人間は激減する。
0059デフォルトの名無しさん
2010/07/02(金) 15:57:07後半はバグっていて話にならない(>>57のとおり)
前半は何が聞きたいのかわからない。ポインタに1を足してるという点では等価だが、
評価順序とかアセンブラコードとか言い出したら等価ではないが、質問のポイントが書いていないので
答えようがない。
結論:>>55はど素人。引っ込んでろ。
0060デフォルトの名無しさん
2010/07/02(金) 16:05:360061デフォルトの名無しさん
2010/07/02(金) 16:42:01上のはメモリに対する演算ではなく、ポインタの値を変化させてるだけだから、
参照してない以上、何も問題はない。
0062デフォルトの名無しさん
2010/07/02(金) 16:42:52いちいち罵倒せずにはいられんのか。情けない奴。
0063デフォルトの名無しさん
2010/07/02(金) 16:43:16問題は表記だな。 Cのポインタ関連の表記が悪い。
0064デフォルトの名無しさん
2010/07/02(金) 16:47:22罵倒?
ど素人に引っ込んでろと書いたら罵倒なのか?
あんまり詳しくない方は書かないでもらえますか、とでも書けばいいのか?(ワラ
0065デフォルトの名無しさん
2010/07/02(金) 17:18:53でも代替案も却って煩雑だったりするし、
今更ポインタの文法が変わるわけがないので、
慣れてちょうだいとしか言いようがない。
一番いいのはC言語使わないことだけどね。
0066デフォルトの名無しさん
2010/07/02(金) 17:29:30バカを晒さないようお願い申し上げます。
0067デフォルトの名無しさん
2010/07/02(金) 17:31:08*ip + n = n;
とか書いちゃうバカに言われてもwwww
0068デフォルトの名無しさん
2010/07/02(金) 17:34:55それは私ではありません。横で見てて見苦しいので
重ねてバカを晒さないようお願い申し上げます。
0069デフォルトの名無しさん
2010/07/02(金) 18:09:39罵倒だとも。それがわからない程度の人間というわけでもあるまい?
0070デフォルトの名無しさん
2010/07/02(金) 22:53:16BASICにもVARPTRとかVARSEGとかあるけどCのポインタで躓く人には
分からないよ
アセンブラ学んだりしてメモリの存在意識してからじゃないと
スっと理解するのは難しいんだろうな
いきなりC言語から始めると値しか視界に入らないと思う
0071デフォルトの名無しさん
2010/07/03(土) 02:29:03http://bit.ly/8YScmk
">私のささやかな経験から言わせてもらうと、伝統的に大学のコンピュータ
サイエンスのカリキュラムで教えられているもので、多くの人がうまく理解
できないものが2つあった: ポインタと再帰だ。
"
0072デフォルトの名無しさん
2010/07/03(土) 03:28:480073デフォルトの名無しさん
2010/07/03(土) 09:06:42サンクス。クール内容だった。ポインタの理解が能力の見極めになるのはアセンブリ
言語を知らない人だけだろうな。知ってればレジスタ間接のようなものかですむ。逆に
アセンブリ言語知らなくてポインタを理解できる人は尊敬してしまう。どうやって理解に
至ったのかぜひ聞いてみたい。
0074デフォルトの名無しさん
2010/07/03(土) 09:16:19はっきりいってポインタはアセンブリ言語知ってるどうのじゃなくて、
どういう型システムがあってああいう文法になるのかっていうことが
ポイントなんだと思うよ。
0075デフォルトの名無しさん
2010/07/03(土) 09:22:08高校数学で数列が理解できないレベルだろ
池沼認定
0076デフォルトの名無しさん
2010/07/03(土) 09:32:17大事なのは、いまいじってるデータが物理メモリのどっかにおかれていて
そこにアクセスする仕組みがポインタだと理解することだ
一番面倒なところはプログラムの記述といくらにらめっこしてても理解できないっていうところかなぁ?
概念を理解しないといけないってのは義務教育ではあまりないからな
再帰はツリー構造のデータをいじらせれば一発で理解できるから
そんなに重要じゃないと思うけどね
はじめに教える人間がタコだと苦労しちゃうのかも・・・
0077デフォルトの名無しさん
2010/07/03(土) 10:10:21アセンブリ言語知らないと理解できないとは言っていない。知っていれば少しも
難しいものではないと言っている。ほとんど知らないとかではなくまったく知らない
人がどう理解していったのかを知りたい。そういう人を知らないので聞いてみたい。
0078デフォルトの名無しさん
2010/07/03(土) 10:18:39データはメモリにおいてあるんだからそこにアクセスする方法が必要になるだろ?
って必要にせまられたら一発で理解できたけど
画像とかさ
Aパートでロードした画像をBパートでもう一回使いたいんだけど?的な場面で
0079デフォルトの名無しさん
2010/07/03(土) 10:54:13俺も同意。
BASICから初めて、その後C言語をやった時はさっぱりだったが
情報処理試験のためにCASLをやったらあっさり理解できるようになった。
0080デフォルトの名無しさん
2010/07/03(土) 10:59:11char *ptr;
char buffer[10];
_ptr: dc.l 0
_buffer: ds.b 10
puts(ptr);
puts(buffer);
move.l _ptr, -(sp) #ポインタを引数に渡す場合
jsr _puts
lea _buffer, -(sp) #配列を引数に渡す場合
jsr _puts
addq.w #8, sp
0081デフォルトの名無しさん
2010/07/03(土) 11:00:19>lea _buffer, -(sp) #配列を引数に渡す場合
こんなアドレス形式はないな。
pea _buffer
だった。失礼。
0082デフォルトの名無しさん
2010/07/03(土) 11:32:05レジスタとメモリがどのように使われるのかを体感したら、理解が深まったのは覚えてる
0083デフォルトの名無しさん
2010/07/03(土) 11:39:380084デフォルトの名無しさん
2010/07/03(土) 11:43:110085デフォルトの名無しさん
2010/07/03(土) 11:45:29人間は失敗から学んで成長する生き物
0086デフォルトの名無しさん
2010/07/03(土) 12:09:03サンクス。
> データはメモリにおいてあるんだからそこにアクセスする方法が必要になるだろ?
それだとポインタを使わなくても普通にできることでは?
> 画像とかさ
> Aパートでロードした画像をBパートでもう一回使いたいんだけど?的な場面で
言語を限らないとメモリーコピー、参照渡しなどポインタを使わない方法もある。
意地悪く書いたけどポインタを使えていると思う。上から目線ですまぬ。
0087デフォルトの名無しさん
2010/07/03(土) 12:10:49そこにアクセスする方法にアクセスする方法だろポインタっつーのは
0088デフォルトの名無しさん
2010/07/03(土) 12:28:380089デフォルトの名無しさん
2010/07/03(土) 12:55:080090デフォルトの名無しさん
2010/07/03(土) 13:09:57アセンブリは知らん。
0091デフォルトの名無しさん
2010/07/03(土) 13:17:40ポインタってそんなに複雑なものか?
>>80のコンパイル結果を見ればただの long 定数があるだけだ。
これがポインタの正体。つまりポインタは int や long と同じようにメモリ上にとられる
エリア。それをデータのアドレスを入れるために使う。
このプログラムはぬるぽになる。本来の意味でぬるぽが使えるのに感動!
0092デフォルトの名無しさん
2010/07/03(土) 13:39:23>それだとポインタを使わなくても普通にできることでは?
できねーだろ
ハンドル使ってもポインタは回避できないと思う
0093デフォルトの名無しさん
2010/07/03(土) 15:30:20知らないことは誰だってあるけど、いいやんとか言って違いも調べず思考停止するやつは向上心もう少し持とうぜ
0094デフォルトの名無しさん
2010/07/03(土) 15:32:030095デフォルトの名無しさん
2010/07/03(土) 16:12:00aというメモリー上のデータにアクセスしてbという変数に入れる。
b = a;
どこにポインタを使う必要がある?
0096デフォルトの名無しさん
2010/07/03(土) 17:23:29元の話題とまったくつながりが見えないんだけど
なんの話してるの?w
0097デフォルトの名無しさん
2010/07/03(土) 17:48:57そっとしておいてやれよ…
0098デフォルトの名無しさん
2010/07/03(土) 18:34:20複雑な関数ポインタをスラスラ書けるようになっちゃうの?
0099デフォルトの名無しさん
2010/07/03(土) 18:35:380100デフォルトの名無しさん
2010/07/03(土) 19:16:58>>87でポインタを使わなければデータにアクセスできないと書いているからそりゃ無い
だろと書いている。揚げ足取りに近いのだけど。
Cを使って大量のデータを使いまわしするということならポインタについてはそうだろう。
だから後に言語を限らなければとわざわざ書いている。
>>98
スラスラ書けるようになるかどうかはわからないがCでなぜポインタを取り入れたか、
何を実現したかったは理解できるようになる。
0101デフォルトの名無しさん
2010/07/03(土) 19:20:03>何を実現したかったは理解できるようになる
それはポインタの理解とは無関係
0102デフォルトの名無しさん
2010/07/03(土) 19:43:06俺も同意見。
アセンブリ言語を理解したとして、
結局あの文法が正確に分かるようになるのかというと別だと思う。
たとえば、 const int (* const (*)(void))(void) なんてのがあったとしよう。
これはアセンブリ言語を知っていたとしても
ポインタ自体に精通していなければ文法上の
意味を正確に掴みかねると思われる。
裏でどういう値が動いているかは分かると思うが。
俺自身アセンブリ言語に詳しくないから
そう思うだけなんだけど識者の人はどう考えているの?
0103デフォルトの名無しさん
2010/07/03(土) 20:05:05ところで引っかかっていると思うが。
0104デフォルトの名無しさん
2010/07/03(土) 20:28:40constはただの自己満足だとわかる。
必要最小限のサブセットと、自己満足のための高度な内容を分けて考えるべき。
0105デフォルトの名無しさん
2010/07/03(土) 20:33:39int y=50;
int *p=&y;
int z=x/*p;
どうしてCはポインタの記号に*を採用したのか*/
0106デフォルトの名無しさん
2010/07/03(土) 20:41:22あくまで>>102は例だ。
本当に箱を並べたポンチ絵程度のものが分からないことを
アセンブリ言語を知っていれば分かるようになるのか、
それともC言語的な文法も踏まえたことをアセンブリ言語を
知っていれば分かるようになるのか、そういうことを言いたいだけ。
ポインタで引っかかるって言っても、
↑の2種類はいると思うけどね。
0107デフォルトの名無しさん
2010/07/03(土) 21:24:21ポインタはわかるが文法がわからないという話は聞いたことがない
だから文法自体は悪くない
悪いのは、文法以前で引っかかってる人に文法を踏まえさせること
0108デフォルトの名無しさん
2010/07/03(土) 21:35:36ポインタのポインタとか
配列のポインタとか
言ってる人は判ってるなと思うけど
ダブルポインタって言ってる香具師は
馬鹿じゃねーのと思う
0109デフォルトの名無しさん
2010/07/03(土) 21:45:18ではないの?
0110108
2010/07/03(土) 21:51:010111デフォルトの名無しさん
2010/07/03(土) 22:03:07ポインタの配列、ポインタのポインタ
使うプログラムって難しく感じる
配列が多次元になったり
連結させたりするとな
0112デフォルトの名無しさん
2010/07/03(土) 22:09:25int main(int argc, char *argv[]) を使う派?
それとも
int main(int argc, char **argv) を使う派?
0113デフォルトの名無しさん
2010/07/03(土) 22:12:320114デフォルトの名無しさん
2010/07/03(土) 22:13:550115デフォルトの名無しさん
2010/07/03(土) 23:05:50typedef void *Object;
typedef Object *Vector;
int main(int argc, Vector argv)
0116デフォルトの名無しさん
2010/07/04(日) 02:26:430117デフォルトの名無しさん
2010/07/04(日) 06:17:050118デフォルトの名無しさん
2010/07/04(日) 06:20:210119デフォルトの名無しさん
2010/07/04(日) 09:11:19int *p;
int * p;
アスタリスクの使い方がポインタの理解を阻害する
0120デフォルトの名無しさん
2010/07/04(日) 09:23:31>>>87でポインタを使わなければデータにアクセスできないと書いているからそりゃ無い
>だろと書いている。揚げ足取りに近いのだけど。
は?>>87俺じゃねぇし
まったく話が見えない
0121デフォルトの名無しさん
2010/07/04(日) 09:50:020122デフォルトの名無しさん
2010/07/04(日) 10:05:01すまない。アンカー間違えてた。 >>78だった。
>>100のレスが無くても>>78にたどり着くので流れは分かると思うが分からないのなら
おれには説明できない。
0123デフォルトの名無しさん
2010/07/04(日) 11:29:50俺のポインタ周りの混乱はそうだったなぁ。
俺の混乱履歴。
char *p;
char型の*pを宣言してるように見えてた。
char i;
i=1;
が正しいのだから、
char *p;
*p=1;
が正しくない理由が分からなかった。
加えて
char *p="abcd";
こんな表現もあって混乱した。*pにいきなり値を代入してるように見えるから。
実際にはpに代入していて、char*型のpを宣言してるんだと感じてから、
char* p;
と書くようにした。
そして
char* p,r;
でまた混乱。
0124デフォルトの名無しさん
2010/07/04(日) 11:47:41思い込みのはげしい人が多いのはなぜか。
0125デフォルトの名無しさん
2010/07/04(日) 12:01:59コンパイルできるかできないかはシンタックスが正しいか正しくないかであって実行して悪魔が出るかどうかはセマンティクスに違反しているかしていないか
ポインタなんて単なる数値だよ
*をいくつ使うかで表現できる階層が変わるだけ、C言語でオブジェクト指向っぽく連想配列でも実装すれば理解できるよ
ポインタは複合型であり、構造体や共用体、ポインタ、配列などの複合型の不完全型をシンプルに表現できる抽象データ型なだけであって難しいことなど無い
0126デフォルトの名無しさん
2010/07/04(日) 12:15:44普通は入門書や、入門webサイトを見る。
初めて見るソース、ソースから受ける第一印象はとても大事。
0127デフォルトの名無しさん
2010/07/04(日) 12:22:36難しいことをやさしく表現することは、能力が無いと出来ない。
能力が著しく足りないと、簡単なことを難しく表現してしまう。
という言葉を思い出した。
0128デフォルトの名無しさん
2010/07/04(日) 12:36:07C++ が普及する前の C のときは事実上
FILE *f;
だけだったはずで
FILE * f; とか
FILE* f; とか
書きかたしていると笑われたもんだ
なぜか C++ で本来の
HOGE *h;
は影を潜め
HOGE* h;
という書き方が横行するようになった
0129デフォルトの名無しさん
2010/07/04(日) 12:38:33でまた混乱。
なんで*が実質右ってことを忘れてんの?
0130デフォルトの名無しさん
2010/07/04(日) 12:39:47>>123 みたいなアホのせいだな pgrw
0131デフォルトの名無しさん
2010/07/04(日) 12:41:22> char *p;
>char型の*pを宣言してるように見えてた。
それで合ってる
何か変な本読んで混乱させられたんだな
かわいそうに
0132デフォルトの名無しさん
2010/07/04(日) 12:47:44初心者が起こす勘違いを考えるスレ。
0133デフォルトの名無しさん
2010/07/04(日) 12:57:03真の意味で教えることは難しい。
教える側に対象者のつまずきを理解する能力が無い場合、
対象者が理解できるかどうかは対象者の能力に依存する。
0134デフォルトの名無しさん
2010/07/04(日) 13:09:12そうだな
簡単な話が理解出来ないのは
耳が悪いのかも知れないし
そもそも話を聞いてないのかも知れないし
頭が悪いのかも知れない
0135デフォルトの名無しさん
2010/07/04(日) 13:17:00int a[10];
a[10]=100;
みたいにやると、稀におかしくなる
コンストラクタとかifとかで複雑になってくると
よく見ると
int * p;
*p=100;
みたいなことを平然とやってたりする。
短いプログラムだとこんなことはしないだろうけど
複雑なプログラムだと初心者はわけがわからなくなる。
これが初心者にとって難しいんだろうな。
0136デフォルトの名無しさん
2010/07/04(日) 13:23:07> a[10]=100;
正常に動くことがあるから、誤解の種になるよね。
必ず異常動作すれば気づくんだが。
char *p="abc";
*p='A';
これが正常に動く環境があって、
しばらく平気でそういう記述してた時期があった。
0137デフォルトの名無しさん
2010/07/04(日) 13:30:53こういう書き方をしている人物こそポインタで引っかかったままだと言える。
0138デフォルトの名無しさん
2010/07/04(日) 13:31:57Microsoftのソフト開発者は全員そうだな。
0139デフォルトの名無しさん
2010/07/04(日) 13:41:21int (*ptr)[10];
int a[100]; //mallocの代わり
ptr = (int (*)[10])a;
↑これを理解するのに結構時間かかった、特に関数の引数にしたときとか
アドバイスもらって、アセンブラ入門を勉強したら理解できるようになったんだよな
多分、実際のメモリ範囲確保とインデックスによるアドレス指定が理解の助けになったと思う
0140デフォルトの名無しさん
2010/07/04(日) 13:44:58char *p[10];
char (*p)[10];
*がpに付くのなら上記は同じ意味になるだろう。
*が宣言に付くからこそ(*p)とすることで違う意味になる。
そういう意味からは
char* p;
のほうがしっくり来る。
俺は char *p; と書くけどね、char* p0,p1; のことがあるからね。
0141デフォルトの名無しさん
2010/07/04(日) 13:46:460142デフォルトの名無しさん
2010/07/04(日) 13:48:30int* p,q,r;
ってやったらpもqもrも
CやC++でいう
int *p,*q,*r;
みたいに、全部が*つけたようになるな
アンセーフモードでしか実行できないけどね
Microsoftのポインタに対する意識が明確に現れてるな
0143デフォルトの名無しさん
2010/07/04(日) 13:58:02第一印象に敏感な人は重症化しやすい、という意味では大事かもしれないが
本来は、印象なんてあやふやなものには鈍感なほうが良い
>>141
上のほうで、文法より意味を考えようぜっていう正論が出たから
逆の書き込みをすれば色々釣れるだろうと思ってるのかもしれん
0144デフォルトの名無しさん
2010/07/04(日) 13:58:46char (*p);
上記は同じものを指すが、結果として同じものをさすだけであって、
その意味合いは異なる。
前者は"char*型のpの宣言"であり、
後者は"pはポインタであって、そのポインタはcharを格納するアドレスのポインタ"。
それが理解できなければ、
char *p[10];
char (*p)[10];
は理解できない。
0145デフォルトの名無しさん
2010/07/04(日) 14:03:27こんなの覚えてもしょーがねーだろ
0146デフォルトの名無しさん
2010/07/04(日) 14:09:25しょうがなく無いぞ
char *p[10];
char (*p)[10];
どっちの意味でも使うことあるから。
宣言の*が型に付くことを知っていれば、
前者のpが配列、後者のpがポインタだと理解しやすい。
0147デフォルトの名無しさん
2010/07/04(日) 14:14:230148デフォルトの名無しさん
2010/07/04(日) 14:19:29文法云々というか、プログラマの責任がデカい部分。
0149デフォルトの名無しさん
2010/07/04(日) 14:23:31*(p[10]) か (*p)[10] かの違いだよ。前者の括弧は冗長だから書かないだけ。
*は前置単項演算子だから、被演算子は常に後ろに付く。型に付くことはない。
0150デフォルトの名無しさん
2010/07/04(日) 14:42:16int * p
の*は演算子ですらないぞ
*p=&x
みたいのでpの←の*は演算子だけど。
0151デフォルトの名無しさん
2010/07/04(日) 14:47:48知ったかは口はさむな
0152デフォルトの名無しさん
2010/07/04(日) 14:55:06説明する能力があれば、真実でなくても実質問題の無い考え方を伝えることが出来る例。
0153デフォルトの名無しさん
2010/07/04(日) 15:26:43new int
のほうがわかりやすいよね
0154デフォルトの名無しさん
2010/07/04(日) 16:57:46意味合いも型も全く同じ。
どちらも*演算子を適用するとcharになる。
>>146の意味合いは演算子の
結合が異なるから意味が異なって当然:
・char *p[10] =>char *(p[10]) => pに[]したあと*すればcharになる
・char (*p)[10] => pに*したあと[]すればcharになる
変数の記述と同じように演算子を適用したら、
最終的に一番左に書いたcharやらが取得できるのがポインタの文法。
0155デフォルトの名無しさん
2010/07/04(日) 23:34:12Cのポインタで引っかかる人が多い、の方が正確だろうな。
C以外でポインタで引っかかる人の話はほとんど聞かない。
Cのポインタも、言語規格を読めば別に難しくないが、直感では理解しにくい。
0156デフォルトの名無しさん
2010/07/05(月) 00:47:28見づらくて仕方ない。
0157デフォルトの名無しさん
2010/07/05(月) 00:52:23あってないだろ
*pが変数名ならポインタ使用するときpって書くなよ
*とpを分解するなよ
*とpがくっついて初めてIDなんだろ?って思った
あくまでpはchar*型の変数だろ
だから*演算子でポインタpの値参照できるんだし
0158デフォルトの名無しさん
2010/07/05(月) 01:15:16char *p
*pはchar型であってるよ
*pは変数名じゃないよ
pが変数名だよ。
0159デフォルトの名無しさん
2010/07/05(月) 01:30:09「char型」の「ポインタ(*)」の「変数p」と言った方がいいかな。
0160デフォルトの名無しさん
2010/07/05(月) 01:41:40char *p;で宣言される変数はp
てだけだろ。
*pは宣言されてない。
配列とかでも同じだからなぁ。
特に分かりづらいと思ったことなかった。
0161デフォルトの名無しさん
2010/07/05(月) 03:57:281)arrayの宣言文を書け。
2)arrayのメモリ確保文を警告レベル最大でも警告が出ないように書け。
3)arrayの要素アクセス方法、具体的にはarray中の横からw番目、縦にh番目の要素に0を代入する文を書け。
0162デフォルトの名無しさん
2010/07/05(月) 06:43:49char*型の変数pでいいよ。
変数名取り除いたのが型の名前だし。
>>161
とりあえずC99禁止しようか。
0163デフォルトの名無しさん
2010/07/05(月) 07:37:57二次元配列ってなんだ
配列の配列か
一次元的に取られたメモリを工夫して二次元的に扱える形にしろというのか
一次元的に取られたメモリを工夫して三次元的に扱える形にしろ
ただし、外側から縦、横、奥を表すとし、メモリの確保は1回で実行せよ
また、型は適当なものをtypedefし、type_t型として作成せよ
ただし、縦、横、奥は実行時に与えられ、特定のtype_t型に依存するコードは書いてはならない
縦、横、奥はsize_t型を仮定してよいものとする
全ての縦、全ての横、全ての奥のアドレスに対してそのアドレスがそのアドレス以外のものと異なるようにせよ
全ての縦、全ての横、全ての奥の要素に対して任意の値を代入し不正なメモリ書き換えが行われないようにせよ
メモリの確保には標準関数のvoid *malloc(size_t)を使用せよ
ここで、言語仕様はC89またはC90を仮定してよいものとする
ただし、コンパイラの拡張を使用することを禁止する
例 : type_t ***array3; array3 = alloc3(h, w, d); array3[h][w][d] = val;
0164デフォルトの名無しさん
2010/07/05(月) 08:05:390165デフォルトの名無しさん
2010/07/05(月) 11:18:280166デフォルトの名無しさん
2010/07/05(月) 15:19:300167デフォルトの名無しさん
2010/07/05(月) 16:37:363つ以上使うコードがあっても、void**とキャストを使うコードに変換できる
0168デフォルトの名無しさん
2010/07/05(月) 16:46:540169デフォルトの名無しさん
2010/07/05(月) 16:57:390170デフォルトの名無しさん
2010/07/05(月) 17:15:050171デフォルトの名無しさん
2010/07/05(月) 17:21:170172デフォルトの名無しさん
2010/07/05(月) 17:24:00CPUとGPUの違いやsimdの演算効率の違いを考慮して、
AofSとSofAを切り替えたりxyzの順序を変えたりの詰め替えばっかりw
0173デフォルトの名無しさん
2010/07/05(月) 18:09:33配列へのポインタでいいのか?
0174デフォルトの名無しさん
2010/07/05(月) 18:32:081) int *array;
2) array = (int*) malloc(sizeof(int) * WID * HEI);
3) array[h * WID + w] = 0;
Java使いでちゃんとしたCのコードなんか書いたことないんだけど、
これでいいのかな?このスレにいる詳しい人添削頼む。
あと>>163も同じように処理しちゃまずいのかな。
0175デフォルトの名無しさん
2010/07/05(月) 18:52:552次元配列と書いてるから、array[WID][HEI}の形にしないと駄目だろうね
>>161の条件だと↓でもよさそうだけど、>>163はひと手間かけないといけない
int (*array)[HEI] = (int (*)[HEI])malloc(sizeof(int) * WID * HEI);
0176デフォルトの名無しさん
2010/07/05(月) 18:56:413次元分のメモリとポインタ分のメモリを確保してポインタの配列をこさえればいいんだけどね。
0177デフォルトの名無しさん
2010/07/05(月) 22:16:21>ただし、縦、横、奥は実行時に与えられ、特定のtype_t型に依存するコードは書いてはならない
これは↓がだめだという意味?
typedef char (*type_t)[w][d];
type_t array = (type_t)malloc(sizeof(int) * h * w * d);
0178177
2010/07/05(月) 22:17:04typedef int (*type_t)[w][d];
ね。
0179デフォルトの名無しさん
2010/07/05(月) 22:27:24for文で回しながらmallocして、
for文で回しながらfreeすれば出来そうだけど。
(そこまでするんならいっそ1次元でとって、添え字演算したほうがすっきりしそうだが・・・)
>>163 は出来るのかね。
0180デフォルトの名無しさん
2010/07/06(火) 02:01:16自分で書いていて途中で嫌になってきた
typedefを使わないとほとんど読めないプログラムになってしまうのが
ポインタの問題だな
関数へのポインタの配列へのポインタを返す関数
(関数は配列を返す事ができないので配列へのポインタで返す)
でも無駄な事を一段やってるような気がするな
配列だと分かっているんだから配列を変えそうとせず、ポインタで配列の
先頭アドレスを返せば簡単になるような気もする
0181デフォルトの名無しさん
2010/07/06(火) 02:16:07関数は配列を返す事が出来ないんだから、配列へのポインタを
返すと書かなければならない
本当はそうではないのだが、Cの文法がそう書く事を許さない仕様に
なっている
こういう場合は関数宣言の方を変えて、配列を返すのではなく関数への
ポインタのポインタを返すと書けば簡単になるだろう
但しそう書くとプログラムが何をやっているのかますます不明瞭になり、
ほとんど読み解く事が困難になってしまう
0182デフォルトの名無しさん
2010/07/06(火) 02:20:23こんな感じ
これなら一段間接参照が減る
さて寝よう
0183デフォルトの名無しさん
2010/07/06(火) 08:36:52ひとつ言えることは
ポインタで引っかかる人は、文法や型にこだわる
問題を出されると出題者に盲従する傾向がある
だったら、文法や型や規格書などに従うのを一度やめてしまえばいい
たとえばアセンブラを使ってみるとか
0184デフォルトの名無しさん
2010/07/06(火) 10:38:360185デフォルトの名無しさん
2010/07/06(火) 10:46:200186デフォルトの名無しさん
2010/07/06(火) 10:57:250187デフォルトの名無しさん
2010/07/06(火) 10:58:230188184
2010/07/06(火) 11:56:51>array[h * WID + w]でいいよ だけだったら異論はないよ
あとあと、楽とわかってるから静的に2次元配列として宣言するんだよね
動的確保でも、その楽にする方法があるから、(言い方を借りれば)文法にこだわるんじゃないか
まぁ、これも>問題を〜の1文がなければ、そうですねって話だけど
0189デフォルトの名無しさん
2010/07/06(火) 11:57:59俺と全く同じ奴がいる・・・
0190デフォルトの名無しさん
2010/07/06(火) 12:33:04array[WID][HEI] と array[h * WID + w] は等価ではない
0192デフォルトの名無しさん
2010/07/06(火) 12:56:11184 デフォルトの名無しさん [sage] 2010/07/06(火) 10:38:36 ID: Be:
それでいいなら、int array[W][H];も必要ないね
0193デフォルトの名無しさん
2010/07/06(火) 14:40:57良くない。
array[h][w]という表記ができない言語(例えばアセンブラ)ならそれでもいいが、
言語仕様で出来るのにやらないと、後から読んだ者を混乱させる。
理由があってわざとやらないのか、書いた奴が知らなかっただけなのか判断つかないからな。
それに、hとかwとかなら array[h*WID+w]でもarray[h][w]でも大差ないが、もっと複雑な式に
なった時に、[h][w]形式の方が断然読み易くなる。
ぶっちゃけ、二次元ポインタを使いこなせない奴の言い訳にしか見えない。
0194デフォルトの名無しさん
2010/07/06(火) 15:49:07個人的にはベタバッファにポインタアクセスのが分かりやすいし、使いやすい。
C++は知らんがCなら慣れの問題。
0195デフォルトの名無しさん
2010/07/06(火) 15:58:19数式をそのままに近い形式で記述したい という意図だけどね
0196デフォルトの名無しさん
2010/07/06(火) 16:09:18配列のアライメントや入れ替えがあるから、用途によるよね
0197デフォルトの名無しさん
2010/07/06(火) 16:42:13どう等価じゃないんですか?
0198デフォルトの名無しさん
2010/07/06(火) 16:56:350199デフォルトの名無しさん
2010/07/06(火) 18:54:32・char , int は型である。
・Tが型ならば、T[N]は型である。(Tの配列と解釈する)
・Tが型ならば、$Tは型である。(Tへのポインタと解釈する)
・T,U1,U2,…,Umが型ならば、T(U1,U2,…,Um)という記号列は型である。(関数と解釈する)
・宣言方法は「T a;」とする。
具体例(カッコは適宜省略) C言語での表記法
↓ ↓
int a; ( int a;という意味)
int[N] a; ( int a[N];という意味)
(int[w])[h] a; ( int a[h][w];という意味。wとhは逆になる)
$int a; ( int* a; )
int(char) func; ( int func(char); )
$($int) a; ( int** a; )
($int)[N] a; ( int* a[N]; )
$(int[N]) a; ( int (*a)[N]; )
$(int(char)) f; ( int (*f )(char); )
($int)(char) f; ( int* f (char); )
int($char) f; ( int f (char*); )
($(int(char)))[N] f; ( int (*f [N])(char); )
($$(int(char)))[N] f; ( int (**f [N])(char); )
$(($(int(char)))[N]) f; ( int (*(*f )[N])(char); )
0200デフォルトの名無しさん
2010/07/06(火) 19:03:330201デフォルトの名無しさん
2010/07/06(火) 19:14:30記述の問題ならマクロ導入すりゃいいでしょう
0202デフォルトの名無しさん
2010/07/06(火) 19:17:350203デフォルトの名無しさん
2010/07/06(火) 19:33:38ポインタってアドレスなんだろ?
そんなもん1進むに決まってるんじゃないのか?
0204デフォルトの名無しさん
2010/07/06(火) 19:41:18sizeof演算子で進む量を得ることが出来る。
0205デフォルトの名無しさん
2010/07/06(火) 19:58:50判ってて聞いてるんだろうけど
array[h * WID + w] と array[w][h] はポイントしているアドレスが違う
array[h * WID + w] と array[h][w] が同じ場所を指さないと
共同開発してる仲間に迷惑だろ?
そんなことも知らないからポインタスレに来てるんですねわかります
0206デフォルトの名無しさん
2010/07/06(火) 20:21:03後者は離れた領域にmallocしても一向にかまわない。
0207デフォルトの名無しさん
2010/07/06(火) 20:22:130209デフォルトの名無しさん
2010/07/06(火) 21:32:28これはだめなの → >>177
C89ならw,dが変数でも通ったけど。
0210デフォルトの名無しさん
2010/07/06(火) 21:41:09>208ではありませんが、コンパイラとコンパイルオプションを示してみてください
また、可能であればコンパイラのバージョンも示してみてください
0211デフォルトの名無しさん
2010/07/06(火) 22:00:20PC@Test> gcc --version
gcc.exe (GCC) 3.4.5 (mingw special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
PC@Test> gcc -Wall -pedantic -std=c89 Test6.c
Test6.c:14: warning: ISO C90 forbids variable-size array `type_t'
Test6.c:14: error: variable-size type declared outside of any function
Test6.c:14: warning: ISO C90 forbids variable-size array `type_t'
Test6.c:14: error: variable-size type declared outside of any function
ごめん、今やったら通らんわ。
0212221
2010/07/06(火) 22:01:09昨日の試行錯誤の過程で勘違いした模様。
#include <stdio.h>
#include <stdlib.h>
#define MODE (0)
#if MODE == 0
int w = 10;
int d = 20;
#elif MODE == 1
const int w = 10;
const int d = 20;
#elif MODE == 2
#define w (10)
#define d (20)
#endif
typedef char (*type_t)[w][d];
int main(void) {
int h = 30;
type_t array = (type_t)malloc(sizeof(char) * h * w * d);
printf("%d\n",((int)&array[0][0][1])-((int)array));
printf("%d\n",((int)&array[0][1][0])-((int)array));
printf("%d\n",((int)&array[1][0][0])-((int)array));
free(array);
return 0;
}
0213デフォルトの名無しさん
2010/07/06(火) 22:08:40条件が色々付いてるけど、根本的な要求が分からん
0214デフォルトの名無しさん
2010/07/06(火) 22:11:0115秒以内の回答できて小学1年レベルらしい
int (*a)[N];
int (*f )(char);
int (*f [N])(char);
int (**f [N])(char);
int (*(*f )[N])(char);
0215デフォルトの名無しさん
2010/07/06(火) 22:15:02日本人ではないな?
だからどう、ということもないが
0216デフォルトの名無しさん
2010/07/06(火) 22:51:321 サイズm*nの一次元配列として確保
2 サイズmのポインタの配列とサイズnの一次元配列m個
1の利点 ポインタの配列分メモリが必要無い
2の利点 列を削除追加できる
2は多段のポインタなので
普通の二次元配列として扱うと遅い
中継用のポインタ使う必要があるので可読性は低い
0217デフォルトの名無しさん
2010/07/06(火) 22:53:540218デフォルトの名無しさん
2010/07/06(火) 22:57:590219デフォルトの名無しさん
2010/07/06(火) 23:01:51小学生でも朝鮮・中華の小学生だから
0220デフォルトの名無しさん
2010/07/06(火) 23:07:14上から順に
行列の行単位で動くポインタ
関数ポインタ
ポインタ配列
ポインタ配列
行列の行単位で動くポインタ
行列やポインタ配列の要素の型、つまりテンプレート引数に相当する部分は気にしない。
昔のJavaはそうだったというかむしろシンプルでわかりやすいとか言われて普及した。
0221デフォルトの名無しさん
2010/07/06(火) 23:28:34>2は多段のポインタなので
>普通の二次元配列として扱うと遅い
これマジ?
ケースバイケースだろうけど、乗算して加算して参照より、
参照してさらに参照のが速いのかと思ってた。
0222デフォルトの名無しさん
2010/07/06(火) 23:43:30F-22とスピットファイアくらい違う
0223デフォルトの名無しさん
2010/07/07(水) 00:00:13ポンタはわからねえな
0224デフォルトの名無しさん
2010/07/07(水) 00:08:27上から順に
ポインタ
ポインタ
配列
配列
ポインタ
なのは分かるよね。
後は、ポインタだったらポインタの部分を削除して型を見て、
配列だったら配列の部部を削除して型を見る。
そうすると、
配列のポインタ
関数のポインタ
関数のポインタの配列
関数のポインタのポインタの配列
関数のポインタの配列のポインタ
となる。
合ってる?
0225デフォルトの名無しさん
2010/07/07(水) 00:11:02int (*((*func(void))[]))(void)
これ鬼みたいだな
しかしプログラムを読むと大して難しい事をやっているわけではない
Cの宣言はどうしてこんなに難解なのだろうか
0226デフォルトの名無しさん
2010/07/07(水) 00:12:49どっちが速いのかすら分からん。
あー、もしかしてキャッシュに乗らない?
あんまりその世界で生きてないんで
どう動くのかサッパリ。
0227デフォルトの名無しさん
2010/07/07(水) 00:17:46アセンブリをやれば簡単に読めるようになる
0228デフォルトの名無しさん
2010/07/07(水) 00:33:24は保育園レベルでちゅよ
この程度すぐに解らんと保育園レベル未満の国語力ってことでちゅ
0229デフォルトの名無しさん
2010/07/07(水) 00:44:13リンク先は見てないけど、そんなに難解?
ちゃんと()付いてるし。
まず一見してfunc(void)な関数の宣言だろ。
*付いてるから返値はポインタ。
さらに[]なんで配列のポインタ。
次の*で、ポインタの配列のポインタ。
で、最後にint ()(void)なんで、つまりこの宣言は
そういう関数へのポインタの配列のポインタを返す、引数voidな関数funcの宣言。
長々書いて違ってたら、凄い恥ずかしいんだが、どないだろ?
0230デフォルトの名無しさん
2010/07/07(水) 01:14:43>長々書いて違ってたら、凄い恥ずかしいんだが、どないだろ?
どのように解析するか自信ないのか?
コンピラー(C言語)の構文解析ルールをよく知らないってこと?
コンピラーはfunc(void)が関数の宣言ってどうしてそう判断するん?
職業PGにとって構文解析って基礎中の基礎事項で学校で当然習っているじゃないの
それすら知らないのに職業PGやってるって人居ないよね
趣味PGなら自分が必要と感じたら勉強してみるか程度で良いけど
0231デフォルトの名無しさん
2010/07/07(水) 01:26:06キャッシュへのプリロードするのに間接参照だと予測不能。
0232デフォルトの名無しさん
2010/07/07(水) 01:41:39・char , int は型である。
・Tが型ならば、T[N]は型である。(Tの配列と解釈する)
・Tが型ならば、T$は型である。(Tへのポインタと解釈する)
・T,U1,U2,…,Umが型ならば、T(U1,U2,…,Um)という記号列は型である。(関数と解釈する)
・宣言方法は「T a;」とする。
0233デフォルトの名無しさん
2010/07/07(水) 01:46:37具体例(カッコは適宜省略) C言語での表記法
↓ ↓
int$ a; ( int* a; )
(int$)$ a; ( int** a; )
(int$)[N] a; ( int* a[N]; )
(int[N])$ a; ( int (*a)[N]; )
(int(char))$ f; ( int (*f )(char); )
(int$)(char) f; ( int* f (char); )
int(char$) f; ( int f (char*); )
((int(char))$)[N] f; ( int (*f [N])(char); )
((int(char))$$)[N] f; ( int (**f [N])(char); )
(((int(char))$)[N])$ f; ( int (*(*f )[N])(char); )
$が入ってないものは>>199と
全く同じになるので省略しました。
0234デフォルトの名無しさん
2010/07/07(水) 02:27:17・Tが型ならば、T[ ]は型である。
をつけ加えると、>>180の
>int (*((*func(void))[]))(void)
これも232の形式で書けて
((((int(void))$)[ ])$)(void) func;
となります。
また、T[N]$ と書いたとき、これを(T[N])$と読むことは出来ても
T([N]$)と読むことは出来ないし、T$$とかT$[N]なども同様のことが
言えます。よって、ある程度カッコを省略できて、結局、
次のように表記できます。
((int(void))$[ ]$)(void) func;
0235デフォルトの名無しさん
2010/07/07(水) 04:45:01あれ何とかならんかったんか
0236デフォルトの名無しさん
2010/07/07(水) 04:58:290237デフォルトの名無しさん
2010/07/07(水) 07:18:47煽りか本気か知らんが、職業PGに夢見すぎ
0238デフォルトの名無しさん
2010/07/07(水) 07:30:54バリバリ書くのは不可能に近いって事ですね
それか無駄な時間を多量に要するか
0239デフォルトの名無しさん
2010/07/07(水) 11:32:30他の言語に比べて積極的な気持ちになりにくいかな?
ただ、昔読んだテキストエディタのソースでは、入力文字のアスキーコードを引数にして各入力処理関数に飛ぶように、関数ポインタの配列が使われていて感動した。
日本語処理をさせるのは難しそうだけど。
0240デフォルトの名無しさん
2010/07/07(水) 13:03:100241デフォルトの名無しさん
2010/07/07(水) 13:53:020242デフォルトの名無しさん
2010/07/07(水) 14:11:480243デフォルトの名無しさん
2010/07/07(水) 17:04:48あってますね
規則に従って変換したら、>>234になったw
int(void)*[]* (void) func
0244デフォルトの名無しさん
2010/07/07(水) 18:29:24>>232-234の書き方だと、日本語の語順そのままで
宣言できます。たとえば、
・(戻り値int,引数charの関数)へのポインタ
が欲しかったら、そのまま
(int(char))$ pfunc;
と書けます。>>180の
>int (*((*func(void))[]))(void)
だったら、これを日本語読みすると
(((戻り値int,引数voidの関数)へのポインタ)の配列)へのポインタ)
を戻り値とする、引数voidの関数
となるので、この語順そのままに
(int(void))$[]$ (void) func;
と書けます。
0245デフォルトの名無しさん
2010/07/07(水) 21:45:29君は度々出て来るようだけど、結局主張は何?
0246デフォルトの名無しさん
2010/07/07(水) 22:04:51>>232-234の書き方なら、C言語よりも
ずっと読みやすい表記法で関数ポインタが表記できる、
ということです。
0247デフォルトの名無しさん
2010/07/07(水) 22:05:17型の表記は関数型言語スタイルがいいですね、ということです
0248デフォルトの名無しさん
2010/07/07(水) 22:08:020249デフォルトの名無しさん
2010/07/07(水) 22:29:47typedefの方法は>>232-234と同じようなもんです。
あなたにとってtypedefが分かりやすいなら、
ほぼ同程度に232-234も分かりやすいことになります。
たとえば、C言語で
typedef int (*PFUNC)(char);
と書いておけば、もはや
PFUNC pfunc;
と書くだけで「(戻り値int,引数charの関数)へのポインタ」が
宣言できるようになりますが、このときの「PFUNC」という記号列は、
>>232-234で言うところの「(int(char))$」という記号列と
全く同じ役割をしています。つまり
Func ≡ (int(char))$
ということです(誤解を招きそうな式ですが)。
別の言い方をすれば、「PFUNC pfunc;」と同じ語順の宣言が
最初から可能なのが>>232-234ということです。
0250デフォルトの名無しさん
2010/07/07(水) 22:39:24× Func ≡ (int(char))$
○ PFUNC ≡ (int(char))$
0251デフォルトの名無しさん
2010/07/07(水) 22:41:50(int(char))$
よりも
PFUNC
の方が判りやすいだろって話
0252デフォルトの名無しさん
2010/07/07(水) 22:52:58よく分かった。
新しい言語、文法を語りたいだけなら、引っ込んで黙れ。
そういうスレがあるし、そっち行け。
ポインタが分かりづらいのはCの文法が悪いから、とか
それなりのコト言うのかと思えば、ただのアホかよ。
0253デフォルトの名無しさん
2010/07/07(水) 22:55:49どうですかね。「PFUNC」と書いてしまうと、中身が
見えなくなって抽象的になってしまう弊害があります。
(int(char))$だったら、そのまま読めます。
しかも日本語の語順のまま読めます。
僕にとってはint(char)$ の方が読みやすいです。
ただし、PFUNCという記号列を日常的に
typedef int (*PFUNC)(char);
の意味で使っている人だったら、その人にとっては
PFUNCという記号列は全く抽象的では無いわけですから、
その人にとっては、PFUNCの方が読みやすいかもしれません。
0254デフォルトの名無しさん
2010/07/07(水) 22:59:14独自のGC、newが複数混在してると
最高にわかり辛い
それぞれが読みやすいものでもな
0255デフォルトの名無しさん
2010/07/07(水) 23:02:06>ポインタが分かりづらいのはCの文法が悪いから、とか
>それなりのコト言うのかと思えば、ただのアホかよ。
え?それって同じことですよね?
「ポインタが分かりづらいのはCの文法が悪いからだ!」
という意見を煮詰めて行ったら、どのみち
「では、文法をこのように変えたらどうだろうか(例えば232-234のように)」
という意見にならざるを得ないでしょ?
0256デフォルトの名無しさん
2010/07/07(水) 23:09:36typedef int (*PFUNC)(char);
typedef PFUNC T[N];
// 混在すると分かり辛い
typedef int (*T[N])(char);
0257デフォルトの名無しさん
2010/07/07(水) 23:48:510258デフォルトの名無しさん
2010/07/07(水) 23:58:37ならんよ。
だってその表記を見ても、Cのポインタが
理解できるようになりそうにないもの。
言語変えて済む話ならポインタのない言語を選べばいい。
0259デフォルトの名無しさん
2010/07/08(木) 00:17:00言ってることが矛盾してませんか?あなたにとって、
>ポインタが分かりづらいのはCの文法が悪いから、とか
↑この意見は"それなりの意見"なんですよね?(>>252にそう書いてあるし。)
でも、これは「Cの文法を改良すればポインタが分かるようになる」と
言っているのと同じことですよ。
一方であなたは
>言語変えて済む話ならポインタのない言語を選べばいい。
と言ってますから、結局あなたは
「Cの文法を改良すればポインタが分かるようになる」
という意見を全否定しているわけです。つまり、あなたは
>ポインタが分かりづらいのはCの文法が悪いから、とか
↑この意見を"それなりの意見"としつつも全否定しているわけです。
0260デフォルトの名無しさん
2010/07/08(木) 00:22:48●文法を変えたらもはやCではない
これは矛盾しないぞ
0261デフォルトの名無しさん
2010/07/08(木) 00:38:11これはひどいww
というのはさておき、
>●Cのポインタの文法は分かりづらい
これは単に文法の煩雑さを嘆いているだけであって、
>ポインタが分かりづらいのはCの文法が悪いから、とか
↑この意見とは全く別物ですよね。
0262デフォルトの名無しさん
2010/07/08(木) 06:58:00それなりの意見というのは、少なくとも
ポインタで引っかかる理由を言っている点においてそれなり。
それを解決する方法として、別の文法を考えるという
アプローチは全否定してるよ。
理由はCのポインタの理解に役立たないから。
そんなに矛盾してる?
0263デフォルトの名無しさん
2010/07/08(木) 07:16:57なにがしかのモデル的に、理解の役に立つならいいんじゃないの?
「僕の考えた宣言の文法はスバラシイんです」
だから何なんだよ?
0264デフォルトの名無しさん
2010/07/08(木) 07:26:12どっかの馬の骨の自分ルールはもうお腹一杯。しかも読みやすくなってないし。
0265デフォルトの名無しさん
2010/07/08(木) 07:48:01>「僕の考えた宣言の文法はスバラシイんです」
>だから何なんだよ?
それだけです。少なくとも>>235みたいな人の役には立ちますよね。
まあ、文法なんて結局は慣れの問題ですが。
>>264
あなたはCの文法に毒されすぎです。結局は慣れの問題に終始しますが、
それにしてもCの文法は「変」ですよ。誰でも一度はそう思うはずです。
熟練するほど忘れていく感覚ですが。
0266デフォルトの名無しさん
2010/07/08(木) 08:11:43>どっかの馬の骨の自分ルールはもうお腹一杯。
「自分ルール」と呼べるほど独りよがりな書き方では無いでしょう。
日本語読みの語順に忠実な表記を採用しているだけです。
ていうか、日本語読みの単なる省略記法です。
ポインタの宣言を日本語読みしたら、「intへのポインタ」
「(戻り値int,引数charの関数)へのポインタ」のように、
必ず「Tへのポインタ」という言い回しをするわけです。よって、
日本語読みに忠実なポインタ宣言の表記法は「T$ p;」とか
「T* p;」になります。
配列の宣言は必ず「Tの配列」という言い回しをしますから、
「T[N] a;」とか「T[ ] a;」という表記法が忠実です。
C#の場合は、配列の宣言はT[ ]ですよね(採用した理由は違うでしょうけど)。
関数の宣言は「戻り値T,引数U1,U2,…,Unの関数」と言いますから、
「T(U1,U2,…,Un) func;」という表記法が忠実です。
これがそんなに「自分ルール」ですかね?
0267デフォルトの名無しさん
2010/07/08(木) 08:16:40さて、どのような宣言の日本語読みも、構文解析のように分解すれば
「Tへのポインタ」「Tの配列」「戻り値T,引数U1,U2,…,Unの関数」に
分解できますから(ただし、ここでは構造体やクラスは考えないことにします)、
これらに忠実な表記を採用すれば、自動的に日本語読みと同じ語順の宣言になります。
この過程をよく見ると、単に日本語読みの省略記法を作っているだけの話ですよね。
>>229が良い例ですが、宣言されたポインタを理解するとき、あるいは相手に説明するとき、
やっぱり"日本語読み"に直して理解するわけです。それは「>>232-234の表記法に直して理解する」
と言っているのと同じことです。なぜなら、232-234は日本語読みの省略表記だからです。
僕は232-234を強要するつもりはありません。
でも、232-234を無闇に否定する人は、日本語を否定してるのと同じことですよ。
0268デフォルトの名無しさん
2010/07/08(木) 08:54:37だから無意味だっつってんの
>少なくとも>>235みたいな人の役には立ちますよね。
立たない。
結局Cの宣言は読めないまま。
0269デフォルトの名無しさん
2010/07/08(木) 09:18:040270デフォルトの名無しさん
2010/07/08(木) 09:27:21よし頭のいい俺がもっといいルールを作ってやろう。
↓
出来た!これで皆便利になるし、俺に感心するはずだ。
たぶんこういう思考回路なんだろうな・・・。
まさしく中二病ってやつだな。
見てるこっちが恥ずかしくなるよ。
0271デフォルトの名無しさん
2010/07/08(木) 09:30:460272デフォルトの名無しさん
2010/07/08(木) 09:42:31日本語読みというより、型の遠い順だね(Cもそうなんだけど見ため的に)
0273デフォルトの名無しさん
2010/07/08(木) 10:03:280274デフォルトの名無しさん
2010/07/08(木) 10:41:000275デフォルトの名無しさん
2010/07/08(木) 11:12:03typedefしようがスマートポインタ使おうが
他人が使う事になれば苦労するって話
0276デフォルトの名無しさん
2010/07/08(木) 11:40:440277デフォルトの名無しさん
2010/07/08(木) 11:57:472、3分くらいで見つかるようならtypedefして貰う方が読みやすい。
0278デフォルトの名無しさん
2010/07/08(木) 12:44:57意味が分かんないんだけどどういうこと?
0279デフォルトの名無しさん
2010/07/08(木) 13:05:09日本人ではないな?
だからどう、ということもないが
0280デフォルトの名無しさん
2010/07/08(木) 16:04:04ある定義名について、それをtypedefで宣言している文を探す、ということ
0281デフォルトの名無しさん
2010/07/08(木) 16:05:08日本人だよ
IDEなら言うまでもなく
非IDEでもタグファイルを作っておけば一瞬
最悪Grepしてもそんなに時間が掛かるものじゃない
探すという感覚が分からないんだよね
強いて言えば
coする程ではないが少し気になるものを
Webブラウザ上で眺めてるときかな?
と思ったりもしたけどそれはtypedefに限った話ではないしなぁ
0282デフォルトの名無しさん
2010/07/08(木) 21:17:44メモリ確保がごっそり独自になってる事なんて
よくある事なんだけど
仕様読んで実装全部書き直して
移植したりとかめんどくせーから嫌いです
Cの文法のどの点が変なのかわからない。多分毒されすぎたんですね。
さしつかえなければ教えてください。
0284デフォルトの名無しさん
2010/07/08(木) 23:33:48>だから無意味だっつってんの
まあ、ポインタ自体の話をしたい人には無意味でしょうね。
>結局Cの宣言は読めないまま。
ああ、そういう意味なら確かに。あなたは正しい。でも、>>235の
>あれ何とかならんかったんか
この部分への1つの回答には なってますよね。
>>269
新規ルールではなく、既存のルールです。あなたは既に
このルールを使ってます。なぜなら、232-235は日本語読みの
単なる簡略表記に過ぎないからです。
あなたが日本語の語順で関数ポインタなり何なりを捉えたとき、
それは232-235を使っているのと全く同じことです。
あと、英語読みとも親和性は高いですよ。
日本語読みの語順を逆順にしたのが英語読みですから。
0285デフォルトの名無しさん
2010/07/08(木) 23:37:28× 232-235
○ 232-234
>>270
賞賛される必要はありませんが、無闇に否定されるのは
おかしいです。なぜなら、232-234は日本語読みの単なる
簡略表記だからです。これを否定するのは>>229の説明方法を
否定するのと同じことですよ。
>>271
オナニーと言えるほど独りよがりな文法では無いでしょう。
intがN項の配列 a;
戻り値int,引数charの関数へのポインタ pfunc;
このような日本語のベタ書きと全く同じ表現をしているのが232-234です。
こういう表現形式を無闇に否定するのは、>>229の説明方法を否定するのと
同じことですよ。
0286デフォルトの名無しさん
2010/07/08(木) 23:50:46関数ポインタ周辺の宣言における表記の語順が、
自然言語の語順から かけ離れているところ。
日本語読みの語順と全然違うし、英語読みの語順とも全然違う。
0287デフォルトの名無しさん
2010/07/09(金) 01:36:19その定義の通るコンパイラ(またはプリコンパイラ)はもう実装出来てんの?
0288デフォルトの名無しさん
2010/07/09(金) 06:35:180289デフォルトの名無しさん
2010/07/09(金) 07:19:550290デフォルトの名無しさん
2010/07/09(金) 10:31:20もう嫌だ何これorz
0291デフォルトの名無しさん
2010/07/09(金) 12:50:360292デフォルトの名無しさん
2010/07/09(金) 13:44:36IDEの機能や、grepを使うのは充分「探す」だろう
0293デフォルトの名無しさん
2010/07/09(金) 16:05:01たとえば、どんな所がわからないの?
引っかかってるところを(それがどうして分からないのか)知る為に、色々教えてくれると思うが
0294デフォルトの名無しさん
2010/07/09(金) 18:23:46最終的に型につくならよかった
0295デフォルトの名無しさん
2010/07/09(金) 18:39:53後者はそうだね、自業自得だけど。
でも前者は違うな。
>>292
↑というアンカーに対し292のレスを探すとは言わないでしょ?
カーソル合わせりゃToolTipが表示される(IDE) ← 探すとは言わない
クリックすればリンクに飛ぶ(tag) ← 探すとは言わない
ページ内を検索する(Grep) ← 探すとは言うかもしれないけど自業自得
演算子の結合順位が頭に入っていないと、たしかに読みづらいかもしれません。
0297デフォルトの名無しさん
2010/07/09(金) 19:33:050298デフォルトの名無しさん
2010/07/09(金) 19:50:24int* p;は型についてるように見えるけど
int *p;はそう見えない
後者はどう解釈したらいいん?
0299デフォルトの名無しさん
2010/07/09(金) 19:55:230300デフォルトの名無しさん
2010/07/09(金) 20:08:56識別子抜いても意味合いは同じじゃない?
(int*)
int (*)
後者は型についてるように見えない
0301デフォルトの名無しさん
2010/07/09(金) 20:25:53複雑な宣言子の結合が括弧によって変更されることがある。」
演算子の結合順序を変えるような括弧じゃない限り
論じるのは無駄。何を言いたいのかさっぱり不明。
0302デフォルトの名無しさん
2010/07/09(金) 20:47:48記号操作の話ならそれでいいけど、俺は意味論的な話をしてるんだが
どうレスしたらいいものか
0303デフォルトの名無しさん
2010/07/09(金) 20:56:16ポインタの話ですらない。
0304デフォルトの名無しさん
2010/07/09(金) 21:01:15意味論なんて言うなら、ますます括弧なんて重要じゃない。
要するにどうでもいいような文字の置き方に
さも意味があるような話を意味論って言ってるんじゃないのかね。
0305デフォルトの名無しさん
2010/07/09(金) 21:24:51#define N 1
という使用方法。
N かまわず置き換える。
0306デフォルトの名無しさん
2010/07/09(金) 21:26:550307デフォルトの名無しさん
2010/07/09(金) 21:30:21定数Nを #defineするのは、辞めた方が良いよ。
関数名や、変数名で大文字のNが含まれたら全替えする。
これにより、マクロを含めて#define全面禁止をモットーにした。
0308デフォルトの名無しさん
2010/07/09(金) 21:32:16constは変更不可能なだけで定数じゃない。
#defineが定数にあたるけど、別にどうだっていいよねー。
0309デフォルトの名無しさん
2010/07/09(金) 21:43:55意味論てのが何か分からんけど、識別子を評価する方法も
型で表現しようとしてるから、*が右に寄るんじゃないか?
言葉遊びするなら、int *pは
intへのポインタな変数p、ではなく、
*pとして評価すると(実体があれば?)intの値が得られる識別子p、
という解釈。
関数や配列の宣言も全てそう。
規格の文面なんて後付けだしな。
今テキトーに考えた。
0310デフォルトの名無しさん
2010/07/09(金) 21:47:39C言語乙
0311デフォルトの名無しさん
2010/07/09(金) 21:52:45あなたの日本語は間違いではありませんが、内容は嘘ですね。
0312デフォルトの名無しさん
2010/07/09(金) 21:53:45型を明示する陽表式ではなく、
「この条件を満たす何らかの型」という
陰伏式で解釈したらどうでしょう。
>int *p;はそう見えない
・識別子はpである。
・pの型は「演算子*による戻り値 *(p) の型がint型であるような、何らかの型」である。…(1)
この解釈だと、*は直接的には型に付きません。
ただし、(1)を満たす型はまさに(int*)ですから、
結果的には(int*)型の変数を宣言していることになり、
*は間接的には型についてると言えます。
0313デフォルトの名無しさん
2010/07/09(金) 21:56:170314デフォルトの名無しさん
2010/07/09(金) 22:17:500315デフォルトの名無しさん
2010/07/09(金) 22:27:15一緒にすんな
0316302
2010/07/09(金) 23:04:10これだ!!!こんな解釈がほしかった
やっと腑に落ちたわ、ありがとう
意味論ってのはあれだ、すまんかった
言葉のアヤってことでw
0317デフォルトの名無しさん
2010/07/09(金) 23:38:07int a,b; a*b a * b a* b a *bすべて同じであるように
int* c; int *c; ・・・も同じint * cになる
みんなするどいね
例)int *a,b;は結合規則により(一度*が右結合して、型になる)
(int ((*a),)b) → int (*a), b;→ int *aと(,)int b
int *a→ int *(a)→(a)を評価するとint *が返り値つまり型となる
0318デフォルトの名無しさん
2010/07/10(土) 01:04:040319デフォルトの名無しさん
2010/07/10(土) 01:28:200320デフォルトの名無しさん
2010/07/10(土) 01:52:09存じませんが、K&Rあたりでそう記述されてたからとかそのあたりでしょうか?
>>319
ありがとうございます、笑われただけで禁止はされていないみたいですね
wikiには方言もあったと書いてるので、これかもしれませんよ
まぁ、寝ます
0321名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:06:310322名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:14:200323名無しさん@そうだ選挙に行こう
2010/07/10(土) 17:03:51・ポインタを絡めた宣言が理解出来ない(しづらい?)
今のところ出て来たポイントはこの辺?
0324名無しさん@そうだ選挙に行こう
2010/07/10(土) 17:22:57よく挙げられる理由の典型例じゃん
これじゃ他のポインタスレと変わらんなあ…
0325名無しさん@そうだ選挙に行こう
2010/07/10(土) 17:56:250326名無しさん@そうだ選挙に行こう
2010/07/10(土) 18:24:49↑
これがポインタ
0327名無しさん@そうだ選挙に行こう
2010/07/10(土) 19:01:400328名無しさん@そうだ選挙に行こう
2010/07/10(土) 19:06:380329名無しさん@そうだ選挙に行こう
2010/07/10(土) 21:36:43ポインタを知る為にメモリの状態とアドレスをPrintfとか使ってチマチマ
やってた時、頭が沸騰しそうだったな
覚える為に、ここら辺の関係ない所で時間がかかり過ぎるのが問題じゃないかな
0330名無しさん@そうだ選挙に行こう
2010/07/10(土) 21:57:430331名無しさん@そうだ選挙に行こう
2010/07/10(土) 22:05:30ポインタの中身なんて理解する必要なっしんぐ。
C言語のプロトコルに従って書いてりゃどこでも動くコードのいっちょ上がり。
と言いたいところだが、そうもうまくいかないと思う。
0332名無しさん@そうだ選挙に行こう
2010/07/10(土) 22:15:050333名無しさん@そうだ選挙に行こう
2010/07/10(土) 22:21:550334名無しさん@そうだ選挙に行こう
2010/07/10(土) 23:32:31月を見ろ
0335名無しさん@そうだ選挙に行こう
2010/07/11(日) 01:52:01普通の高級言語なら実行時エラー、エラーメッセージで分かる内容のところを
いきなりOSからエラー返されたらビビるって
0336名無しさん@そうだ選挙に行こう
2010/07/11(日) 02:21:19エラーでりゃましなほうさ
0337名無しさん@そうだ選挙に行こう
2010/07/11(日) 10:28:09char *s = "test";
なんでこういうことが出来るのかいまだに理解できない
char s[] = "test";
とは違うの?
0338名無しさん@そうだ選挙に行こう
2010/07/11(日) 10:41:38前者と後者は本質的に違う。
前者は読み取り専用領域に置かれた文字列へのポインタを保持している。
後者は【文字の配列】そのもの。
まず、C言語のFAQでも見ようか。
http://www.kouno.jp/home/c_faq/c6.html#0
http://www.kouno.jp/home/c_faq/c1.html#32
0339名無しさん@そうだ選挙に行こう
2010/07/11(日) 10:54:02ちょっと嘘を交えて言うと
"test"は、プログラム開始時にOSが用意してくれる5バイトの
書き換え不可な配列として解釈される。
char *s = "test"; は、アドレスを指す4バイト変数sを作って
OSが用意した"test"の先頭のアドレスを代入する。
char s[] = "test";は、OSが用意した"test"と同じサイズの(5バイト)
配列を作って、"test"の内容をコピーする。
違いは大体こんなもん。
どこが嘘かは、興味があるならまた別途。
何故そう書けるのか、と言われると、Cが文法として、
そういう機能を持ってるから、としかよう言わんなぁ。
0340名無しさん@そうだ選挙に行こう
2010/07/11(日) 11:12:20{
char *a = "test";
char *b = "test";
char c[] = "test";
char d[] = "test";
printf("%d", a == b);
printf("%d", c == d);
printf("%d", a == c);
return 0;
}
0341名無しさん@そうだ選挙に行こう
2010/07/11(日) 11:37:130342名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:11:05前者
_s: dc.l __lbl
__lbl: dc.b 'test', 0
後者
_s: dc.b 'test', 0
0343名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:11:56scanfとか初期化式とかは、ポインタと少しは関係あるが、
関係ない部分で引っかかってる感じもする。
あまり関係ない所に全力でぶつかったり、教える側も全力で教えようとしていたら
それは学習コストは高くつくに決まっている。
自ら望んで全力で引っかかるのは構わないが、
「なぜ引っかかることを望んだのか」を他人に問い詰めるのは迷惑だ。
0344名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:26:25まず童貞を捨てる。
0345名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:55:12sprintf(s,"Hello world");
正常に動くようですがこのまま使って大丈夫でしょうか?
0346名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:57:49それが嫌なら窓を捨ててペンギン村にようこそ
0347名無しさん@そうだ選挙に行こう
2010/07/11(日) 13:00:39だめです。
というより
char *s = "test";
という使い方はほとんどしないから忘れてもいいかと。
0348名無しさん@そうだ選挙に行こう
2010/07/11(日) 13:07:40ならいいよ
0349名無しさん@そうだ選挙に行こう
2010/07/11(日) 13:39:110350名無しさん@そうだ選挙に行こう
2010/07/11(日) 14:12:44char *s="test";
*s="Hello world";
でいいじゃん
0351名無しさん@そうだ選挙に行こう
2010/07/11(日) 15:00:550352名無しさん@そうだ選挙に行こう
2010/07/11(日) 15:11:27ポインタはprintfされるとアドレスに変換される
暗黙に二度の変換を受けるという理不尽な仕様
0353名無しさん@そうだ選挙に行こう
2010/07/11(日) 15:24:41全て間違ってる。
0354名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:13:29int main(int ac, char **av)
{
char *a = "test";
char *b = "test";
char c[] = "test";
char d[] = "test";
printf("%d\n", a == b);
printf("%d\n", c == d);
printf("%d\n", a == c);
c[0] = 'C';
printf("%s\n", c);
try{
a[0] = 'A';
printf("%s\n", a);
}catch(...){
printf("catch\n");
}
return 0;
}
どうしたら Segmentation fault を出さないように出来ますか?
0355名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:16:220356名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:19:02「指してる」ってなんだ?と思ってた
はじめにscanfや関数の引数としての使い方から説明するから単体での理解がしにくい
アドレスを格納する変数ならそう言って欲しい。分かりやすくしようとしてわかりにくくなってるよたぶん
あと変数宣言の説明を軽くスルーしたり、ポインタをポインタ型とかint*型とか言わないのも問題な気がする
ポインタだけ特別枠の別物みたいにみえる
プログラミング習いたての人との共通認識を探ろうとしないのも分かりにくさに拍車をかけてる
難しいんだよー、だから分からなくても仕方ないんだよー、俺のせいじゃないよーってか
分からせる気ないだろうと
0357名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:41:32ある場所を指している=ポインタ
だからな
ポインタは変数のポインタ(キリッ)
じゃ判らん罠
0358名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:50:140359名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:51:40ポインタ (pointer)とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、
その位置を表現する変数の事をいう。有名な例としてはC/C++でのメモリアドレスを表すポインタが挙げられる。
なるほどなるほど〜
0360359
2010/07/11(日) 17:00:11変数って書いてあるけど、値のことだよね。
ポインタとは、オブジェクト(≒変数)の位置を表現する値を指す。
C/C++ではメモリアドレスを使用するのが一般的。
ポインタに対して演算を行うことにより、オブジェクトを取得したり、
またオブジェクトに隣接する位置のオブジェクトのポインタを
取得することができる。
ああ、こう書いちゃうと分からないんだよなあ。
やっぱ箱のポンチ絵無しには説明は無理だわ。
で、更に変数宣言がどういうものなのか書こうとすると
rationaleとか持ってこないと荷が重い。
0361名無しさん@そうだ選挙に行こう
2010/07/11(日) 17:02:110362名無しさん@そうだ選挙に行こう
2010/07/11(日) 17:03:070363名無しさん@そうだ選挙に行こう
2010/07/11(日) 17:03:12結構いるよね、ほのめかしはするけど実は答え知らない自称上級者
0364名無しさん@そうだ選挙に行こう
2010/07/11(日) 17:04:01ある夜
0365名無しさん@そうだ選挙に行こう
2010/07/11(日) 17:05:31値の出し入れ以外に
まともな文明の利器があったなんて知りませんでした。
もちろん人が解釈するものじゃないよね?
きちんと文法なんだよね?
0366名無しさん@そうだ選挙に行こう
2010/07/11(日) 18:35:29それ以外の用途では不要。
0367名無しさん@そうだ選挙に行こう
2010/07/11(日) 18:38:49おまえ楽な仕事なんだな
0368名無しさん@そうだ選挙に行こう
2010/07/11(日) 18:43:51ポインタと言った場合、ポインタ型のことか、
ポインタ型の変数のこと。
値はアドレス
0369名無しさん@そうだ選挙に行こう
2010/07/11(日) 19:32:13class Inner{
pubilc:
void hogehoge();
int fugafuga;
};
class Base{
public:
Inner *in;
void hoge();
int fuga;
};
Base b;としたとき
b.hoge は &Base::hoge
b.fuga は &Base::fuga
b.in は &Base::in
でいけると思うのですが
b.in->hogehoge
b.in->fugafuga
相当のアドレスを得るにはどうしたらいいのでしょうか?
0370名無しさん@そうだ選挙に行こう
2010/07/11(日) 22:22:12「いけると思うのですが」の時点で
いけてないことないか?
0371デフォルトの名無しさん
2010/07/11(日) 23:57:300372デフォルトの名無しさん
2010/07/12(月) 00:13:220373デフォルトの名無しさん
2010/07/17(土) 08:34:260374デフォルトの名無しさん
2010/07/17(土) 11:21:28なんだよこの訳語は。
0375デフォルトの名無しさん
2010/07/17(土) 11:57:590376デフォルトの名無しさん
2010/07/17(土) 12:28:150377デフォルトの名無しさん
2010/07/17(土) 13:30:16いちいち覚えちゃねえよ。
複数言語やってりゃ、記述が間違っていても何となく回避してるし。
子どもの時に乗った三輪車の善し悪しなんぞ誰もわからんのと同じ。
ぐだぐだ言うのは、三輪車をとっかえひっかえしている池沼と、書いた著者くらいのもん。
0378デフォルトの名無しさん
2010/07/17(土) 14:44:430379デフォルトの名無しさん
2010/07/17(土) 14:57:17デリとな
0380デフォルトの名無しさん
2010/07/17(土) 18:26:10複数言語やってても、そこにポインタ扱う言語が無かったらやっぱ引っかかるよ
0381デフォルトの名無しさん
2010/07/17(土) 21:35:13Javaじゃないからガッしてくれないよ
0382デフォルトの名無しさん
2010/07/17(土) 22:55:15詳細は以下から。
class Dog : public IAnimal
というクラスがあって、これをスマポでインスタンスを生成すると
void fanc(IAnimal animal)
に入れられなくなります。
どう書けばいいんですか?
0383デフォルトの名無しさん
2010/07/17(土) 22:57:19間接参照の概念さえあれば大体何がやりたいのかは分かる
0384デフォルトの名無しさん
2010/07/17(土) 23:00:17そのスマートポインタをデリファレンスすれば委員で内科医?
言語が判らんから具体的には答えられないが。
0385デフォルトの名無しさん
2010/07/17(土) 23:12:08アセンブラやればわかるようになる
0386デフォルトの名無しさん
2010/07/17(土) 23:12:10↓こういうふうに書いたら駄目なんですか?
何で入らないのかわかりません
std::shared_ptr<IAnimal> dog_ptr(new Dog());
0387デフォルトの名無しさん
2010/07/17(土) 23:16:15ポインタを実態を必要とする関数に渡したいなら、>384の言うように逆参照すればいい。
もしかして、単項*演算子も知らないのか?
0388デフォルトの名無しさん
2010/07/17(土) 23:18:59auto_ptr<Dog> p(new Dog());
func(*p);
0389デフォルトの名無しさん
2010/07/17(土) 23:54:24とりあえず.get()って付けたら入りました
func(dog_ptr.get());
全く意味わからないですが急場しのぎって感じで満足してます
やっぱもってるなってことで
0390デフォルトの名無しさん
2010/07/18(日) 00:01:100391デフォルトの名無しさん
2010/07/18(日) 00:37:28メモリの絵を描いて理解するんだ。
0392デフォルトの名無しさん
2010/07/18(日) 00:54:50ポインタは避けるが構造体 (クラス) は避けないって感覚は異常だよ
ふつうに考えるとポインタよりもクラスのほうが難しいはずだよ
なぜか知らないがクラスが難しいと言うのは恥ずかしい
ポインタが難しいと言うのは恥ずかしくないという空気に支配されている気がする
0393デフォルトの名無しさん
2010/07/18(日) 02:43:010394デフォルトの名無しさん
2010/07/18(日) 03:00:050395デフォルトの名無しさん
2010/07/18(日) 03:11:20ttp://tsushima.2ch.net/test/read.cgi/news/1279349199/
0396デフォルトの名無しさん
2010/07/18(日) 07:46:40ポインタのほうが構造体よりずっと難しい
ポインタは存在しないオブジェクトを指す可能性があるし、表記が複雑になる
構造体のほうが難しいと勘違いするのはポインタを理解していないからだ
0397デフォルトの名無しさん
2010/07/18(日) 11:21:38ようなポインタなら問題ないんだよな
JavaやPythonの間接参照に引っかかるようなヤツはそうそうおるまい
0398289
2010/07/18(日) 14:02:410399デフォルトの名無しさん
2010/07/18(日) 15:27:09Win32APIのほうがよっぽどマンドクセ。
0400デフォルトの名無しさん
2010/07/18(日) 15:32:39printf("%p", p)の出力を
〒100-0014 東京都千代田区永田町1丁目7−1
とかにすればイメージ沸きやすいと思う。
アドレスと値を同列に扱えてしまうのがコンピュータの強みでもあるが
混乱の基なんだよ。
0401デフォルトの名無しさん
2010/07/18(日) 16:42:460402デフォルトの名無しさん
2010/07/18(日) 21:56:05というか、我々の頃は、ちょっと言語がわかるようになったら、自然とそうなっていたような気がするのですがね。
0403デフォルトの名無しさん
2010/07/18(日) 22:05:16無駄の多い構文になってるのがアレなだけで
こういうアプローチ以外は不可能ってほど難しいものじゃないだろ
アセンブリなんてしなくてもよろしい
0404デフォルトの名無しさん
2010/07/18(日) 22:40:320405デフォルトの名無しさん
2010/07/18(日) 22:41:51どうやって動いてるかの概要ぐらいは分かってないと、
ポインタまわりのデバッグはやりづらいね。
0406デフォルトの名無しさん
2010/07/18(日) 23:20:21無駄が多いと感じる原因は「型」。
メモリ上には型がない。なぜなら必要ないから。
型がなくてもプログラムが動くことが分かれば、
ポインタが (構文の見た目ほどには) 難しくないことが分かる。
0407デフォルトの名無しさん
2010/07/18(日) 23:32:56そのような「型の必要がない」という事実を体験するには、アセンブラをやるのが手っ取りばやい、と。
0408デフォルトの名無しさん
2010/07/18(日) 23:39:290409デフォルトの名無しさん
2010/07/19(月) 00:21:35masm か‥‥‥。
0410デフォルトの名無しさん
2010/07/19(月) 00:28:080411デフォルトの名無しさん
2010/07/19(月) 04:25:480412デフォルトの名無しさん
2010/07/19(月) 19:19:38Cって、ポインタ依存度高過ぎる上に
そのポインタの扱いがフリーダムだからなぁ…
ポインタ依存度低めで、扱いがそこそこ厳しめなDelphiだと
ポインタで引っかかった経験はあまり無いぞ
0413デフォルトの名無しさん
2010/07/19(月) 20:28:280414デフォルトの名無しさん
2010/07/19(月) 20:36:460415デフォルトの名無しさん
2010/07/19(月) 20:45:45えーと、つまりポインタ自体の概念は難しくない。
そこに掛かる、文法や、派生概念が捕らえ方を
面倒にしてる。
ってこと?
0416デフォルトの名無しさん
2010/07/19(月) 20:58:11そんな感じかな?
例えば、C言語で
「純粋な参照渡し」が使えたり
ポインタに厳格な型があって明示的なキャストをしたとき以外では互換性が無かったり
文字列型をコア機能として持ってたり
動的配列をポインタを使わず使えたり
ポインタを利用するような標準ライブラリがそもそもほとんど無かったら?
本当にメモリを扱いたい時にしか使わない概念になってたら
ポインタで引っかかる人は相当に少なかったと思う
0417デフォルトの名無しさん
2010/07/19(月) 21:19:25配列の制限の多さにビビッタ覚えがあるなぁ。
配列を返すためにも、ポインタを使うんだよ。
と、師匠に言われて、俺の価値観が崩壊した。
0418デフォルトの名無しさん
2010/07/19(月) 22:28:12typedef使えばすっきりするからやってごらん
0419デフォルトの名無しさん
2010/07/19(月) 22:39:100420デフォルトの名無しさん
2010/07/19(月) 23:03:570421デフォルトの名無しさん
2010/07/20(火) 18:16:50C#のアンセーフポインタみたいな感じ?
0422デフォルトの名無しさん
2010/07/20(火) 21:07:04要は本当にメモリアドレスを扱う以外には使う必要がないってことか?
だとしたらまあそこそこ合ってるかな
ポインタ自体も出来る限り安全であるべきだとは思うが
0423デフォルトの名無しさん
2010/07/20(火) 21:31:430424デフォルトの名無しさん
2010/07/20(火) 22:29:23バグもでやすいしね。
一番いいのはCを使わないことだ。
0425デフォルトの名無しさん
2010/07/20(火) 22:35:46って話はないのかな。
0426デフォルトの名無しさん
2010/07/20(火) 23:28:340427デフォルトの名無しさん
2010/07/21(水) 05:13:38Cがあるじゃん
0428デフォルトの名無しさん
2010/07/21(水) 17:54:38ほとんどの言語はヒープのせいで最適化しづらい。
バグがいやなら、一番いいのは最適化を諦めることだ。
0429デフォルトの名無しさん
2010/07/22(木) 21:24:53http://www.atmarkit.co.jp/news/200909/07/lltv02.html
0430デフォルトの名無しさん
2010/07/23(金) 03:21:12Cの領域にGoが侵食し始めてるな。
あと5年もすればC?なにそれ?Cobolとかいうやつ?みたいな扱いになるよ。
0431デフォルトの名無しさん
2010/07/23(金) 10:48:10業務開発ではもうC使わないけどな
0432デフォルトの名無しさん
2010/07/23(金) 11:12:28Dがあるじゃん
0433デフォルトの名無しさん
2010/07/27(火) 23:15:080434デフォルトの名無しさん
2010/07/28(水) 01:14:470435デフォルトの名無しさん
2010/07/28(水) 02:43:480436デフォルトの名無しさん
2010/07/28(水) 03:27:360437デフォルトの名無しさん
2010/07/30(金) 05:16:260438デフォルトの名無しさん
2010/07/30(金) 19:26:59{
int b[10];
return *a;
}
aはポインタなのにbは配列
ポインタと配列は似ているとかいう解説にかなり混乱したもんだ
スタック・ヒープ・文字列あたりがメモリのどこに確保されるかも
一緒に覚えないとポインタはいつまでたっても和歌ランと思う
0439デフォルトの名無しさん
2010/07/30(金) 20:02:390440デフォルトの名無しさん
2010/07/30(金) 20:31:36それが許されるのは配列へのポインタとかだな。
要するに可変長配列とか多次元配列の要素とか。
0441デフォルトの名無しさん
2010/07/31(土) 08:01:22配列は領域が単に連続してるだけで先頭だけみたらポインタ
違うとかそういうもんじゃなくて比べられないだろ
ポインタの指す先が問題なんであって・・・
mallocでとった領域だって連続してるし
char *p = (char*)malloc(sizeof(char)*100);
char p[100];
とかどう違う?とか聞いたらまた混乱してしまうんだろか?w
こんなもんの違いなんてそう意識することないと思うけどねw
0442デフォルトの名無しさん
2010/07/31(土) 08:05:41理解してないとろくなコードをかけないところだな。
ASSERT(ポインタを理解している);と先頭に書いてあるようなもん。
中には五里霧中なままコード書いて金もらってる猛者もいるけどさw
0443デフォルトの名無しさん
2010/07/31(土) 11:03:12こいつはバカすぎる
0444デフォルトの名無しさん
2010/07/31(土) 11:07:43p=(char*)0
0445デフォルトの名無しさん
2010/07/31(土) 11:54:17夏休みだなw
0446デフォルトの名無しさん
2010/07/31(土) 12:19:14思うけど、人によって違うのか
ここら辺もポインタと配列の違いという話をするときに誤解しやすい要因かもね
0447デフォルトの名無しさん
2010/07/31(土) 12:42:33配列もポインタも大差ないと言いたいのか?
0448デフォルトの名無しさん
2010/07/31(土) 14:09:070449デフォルトの名無しさん
2010/07/31(土) 14:33:290450デフォルトの名無しさん
2010/07/31(土) 17:44:29sizeof(p)は微妙だな
ソースまたぐと正常な値返ってこないからなw
0451デフォルトの名無しさん
2010/08/01(日) 01:13:39どちらも同じ。
0452デフォルトの名無しさん
2010/08/01(日) 03:11:46わかる人からすればもっともな意見だとも思う
ただ、言語仕様的には明確に違うし、教える側がその辺はしょって初心者に説明するのが混乱の元だと思う
よく分からない例え、不正確な同一視は問題の先送りにしかならないんだよなぁ
いつかまとめて乗り越えなきゃいけない日が来る
0453デフォルトの名無しさん
2010/08/01(日) 04:38:200454デフォルトの名無しさん
2010/08/02(月) 00:14:510455デフォルトの名無しさん
2010/08/02(月) 00:32:14その点はjavaだろうとpythonだろうと引っかかる人は引っかかる
0456デフォルトの名無しさん
2010/08/02(月) 02:31:47□→□□□□
0457デフォルトの名無しさん
2010/08/02(月) 02:38:540458デフォルトの名無しさん
2010/08/02(月) 22:18:46p->a;
(*p).a;
同じだとしたら、なぜわざわざ
->
という演算子を用意したのでしょうか?
由来とかあったら教えてください。
0459デフォルトの名無しさん
2010/08/02(月) 22:26:580460デフォルトの名無しさん
2010/08/02(月) 22:43:06(void)(*(*(*p).a).b).c;
いちいち先頭に戻って挿入するなんて考えられない
(void)p[0].a[0].b[0].c;
これもなんか嫌だよ
0461デフォルトの名無しさん
2010/08/02(月) 22:45:290462デフォルトの名無しさん
2010/08/02(月) 22:57:310463デフォルトの名無しさん
2010/08/02(月) 23:02:44(void)(*(*(*foo).super)(foo)).hoge)((*(*foo).super)(foo));
一時変数使えよって感じだな
DirectXとかlibjpegとかCore Foundationでは構造体と関数ポインタでこんなことやっていたと思う
オブジェクト指向っぽく書けるから良く使う手法だけどね
0464デフォルトの名無しさん
2010/08/03(火) 00:20:42> (void)(*(*(*p).a).b).c;
配列のポインタとか、関数のポインタとかが複数からむと、そんな記述に現実なるじゃん。
何故構造体だけが -> なんてものを用意されて優遇されているのか。
0465デフォルトの名無しさん
2010/08/03(火) 00:27:01*だけが前置
0466デフォルトの名無しさん
2010/08/03(火) 00:52:40優遇後 p->a p[i] p()
0467デフォルトの名無しさん
2010/08/03(火) 07:29:00ドット演算子もこの仕様に変えたら
p.a.b.c;
って書けるじゃん。
0468デフォルトの名無しさん
2010/08/04(水) 19:18:18int a[10];
a[0]=10;
a[1}=20;
a[2]=a[0]+a[1];
このとき、a[2]はいくつになるか答えなさい
0469デフォルトの名無しさん
2010/08/04(水) 19:23:440470デフォルトの名無しさん
2010/08/04(水) 23:44:590471デフォルトの名無しさん
2010/08/05(木) 13:50:200472デフォルトの名無しさん
2010/08/05(木) 17:12:400473デフォルトの名無しさん
2010/08/05(木) 18:00:550474デフォルトの名無しさん
2010/08/07(土) 18:13:250475デフォルトの名無しさん
2010/08/07(土) 21:35:180476デフォルトの名無しさん
2010/08/08(日) 23:22:060477デフォルトの名無しさん
2010/08/09(月) 11:55:58初期化せずに使うミスをするとかそういうこと?
0478デフォルトの名無しさん
2010/08/09(月) 12:32:32こうゆう書き方とかしちゃうんじゃね?
*ptr++ ptr+sizeof(*ptr)
正直なんでポインタで引っかかる人がいるのか理解できない
0479デフォルトの名無しさん
2010/08/09(月) 12:46:48もっと近道は無いのか
無いなら無いことを証明するべきじゃないか
と愚痴っているうちに時間が過ぎて行きます
0480デフォルトの名無しさん
2010/08/09(月) 14:41:58p=&x;
*p=30;
これで、pしか変更してないように見えるはずなのにxが30になる
これがポインタのすべてだろ
0481デフォルトの名無しさん
2010/08/09(月) 14:50:41そんな程度なら参照でも挫折するだろ
0482デフォルトの名無しさん
2010/08/09(月) 14:55:13struct node {
int value;
struct node *next;
}
struct node *list = ???;
struct node *n;
// 略
struct node **tmpnext = &n->next;
struct node *orgnode = n->next - sizeof (int);
0483デフォルトの名無しさん
2010/08/09(月) 14:56:45struct node *orgnode = tmpnext - sizeof (int);
0484デフォルトの名無しさん
2010/08/09(月) 18:32:09本来ポインタとは、ポインタが何かを理解してる人間だけが使えばいいところを
C言語は初心者ですらポインタと無関係ではいられないからだろう。
0485デフォルトの名無しさん
2010/08/09(月) 19:02:11どうしてそんな言葉を当てちゃったのみたいな
まあ俺自身まだポインタのとこまで勉強してないからよくわからんが
0486デフォルトの名無しさん
2010/08/09(月) 19:04:57車輪だな
しかも劣化した汚ねぇ車輪だな
車輪(スポーク)はケツの皺だな
∴ 汚ねえケツだなぁ
ってことで
>>482
のような小汚いソースを見るとTDNを思い出す
0487デフォルトの名無しさん
2010/08/09(月) 23:02:46char** t = (char**)malloc(10*sizeof(char*));
int i;
for( i=0; i<10; i++){
t[i] = (char*)malloc(100*sizeof(char));
}
こんなふうにメモリ取ってこなきゃならんのをけっこう忘れると思う。
あとは
int test(int a[5][10])
のような引数の時とか微妙に型チェックがめんどくさかった気がする。
0488デフォルトの名無しさん
2010/08/10(火) 02:14:12int[] a;
a[0] = 0;
#引っかからない言語
my @a;
$a[0] = 0;
0489デフォルトの名無しさん
2010/08/10(火) 02:25:180490デフォルトの名無しさん
2010/08/10(火) 23:49:56ローカルで定義された参照を返すとか
0491デフォルトの名無しさん
2010/08/15(日) 14:26:41宣言多くなるかもだけど実質中身同じだしってことか
0492デフォルトの名無しさん
2010/08/15(日) 18:07:05それさ、単に宣言してない変数を
自動的に作るってだけじゃね?
0493デフォルトの名無しさん
2010/08/29(日) 00:40:47ポインタ変数を参照渡ししたい場合もあるのですが、それがかなわないので、しかたなしに2重ポインタになる局面は多いと思います。
とはいっても何とかなった場面もありましたが。
http://hibari.2ch.net/test/read.cgi/tech/1280653311/663
0494デフォルトの名無しさん
2010/08/29(日) 00:51:310495デフォルトの名無しさん
2010/08/29(日) 11:41:57ポインタはなるべく使うべきでないというドクトリンでもあるのか?
ポインタを使えばできることはポインタを使えばいいだけのことだろ。
0496デフォルトの名無しさん
2010/08/29(日) 12:32:46C++ なら参照渡しにするでしょうね。そのほうがわかりやすい。
int func(int &*p)
0497デフォルトの名無しさん
2010/08/29(日) 12:51:590498デフォルトの名無しさん
2010/08/29(日) 13:03:19それは参照を理解していないだけでしょう?
0499デフォルトの名無しさん
2010/08/29(日) 13:18:35どっちが正しいか客観的に判断する方法もないし。
「あんたがわかってないだけでしょ」って言ったもん勝ちか。
0500デフォルトの名無しさん
2010/08/29(日) 13:44:58へー
0501デフォルトの名無しさん
2010/08/29(日) 13:51:10初めて聞いた。
int **a;これが二重ポインタだと思ってた。
0502デフォルトの名無しさん
2010/08/29(日) 14:38:44良い人から辞めちゃうよね
んでもって、腹黒い人とか、他人を動とも思わない人とか、
図々しい人とか、・・・そんなのばかりがテコでも動かないぜって
感じで居座り続ける・・・
会社って、こうやってダメになっていくんだと思う
それはそのまんま居座り族・牛耳り族が社会をダメにしていくって
ことなんだ。。。
0503デフォルトの名無しさん
2010/08/29(日) 16:49:350504デフォルトの名無しさん
2010/08/29(日) 17:25:28それもそうですねえ。
ちょうど宿題スレでポインタのポインタを扱う(正確にはポインタのポインタを使いたいところを使ってはいけない状況に縛られる)状況でプログラムを作成したので、
もののついで、1) ポインタのポインタを使うプログラム、2) ポインタの参照を使うプログラム、を実際に書いてみました。
私の感性では、やっぱり参照を使ったほうがわかりやすい、と思うのですが、どうでしょうかね。
出題内容:http://hibari.2ch.net/test/read.cgi/tech/1280653311/615
ポインタのポインタを使って書いたもの:http://codepad.org/MpmPDEc3
参照を使ったもの:http://codepad.org/nHqWWH51
0506デフォルトの名無しさん
2010/08/29(日) 18:00:59ポインタだけでつくっています。
http://hibari.2ch.net/test/read.cgi/tech/1280653311/689
0507499
2010/08/29(日) 18:08:12何で無駄なポインタのポインタやら、ポインタの参照やら使ったプログラム書くんだか。
0508デフォルトの名無しさん
2010/08/29(日) 18:19:53>>506 では、2分木に対するデータの追加を扱っていますが、
ポインタのポインタをつかわなければ、
struct node *root;
root = add_node(root, data);
という形になり、これでは再帰が深くなると無駄な代入が繰り返されてしまいます。
本当に代入が必要なのはデータの追加が行われたところのノードですから、そのようにコードをかいて、
sturcut node *root;
add_node(&root, data)
という形にするのが本当だと思います。
参照を使うと、
struct node *root;
add_node(root, data)
とかけますし、add_node() 自体の記述でも、* や & を省くことができます。
具体的なコードの記述例は >>504 のリンク先を参照してください。
0509499
2010/08/29(日) 18:27:00>ポインタのポインタをつかわなければ、
>struct node *root;
>root = add_node(root, data);
>という形になり、これでは再帰が深くなると無駄な代入が繰り返されてしまいます。
それはロジックが悪い。
そんなに代入を繰り返さなくても出来る。考えてみ。
>参照を使うと、(略)* や & を省くことができます。
参照でコードが短くなるのは当然だが、同時に、「値が変化している」という情報も失われる。
以下のような例がありえる。
struct HOGE* hoge;
func1(hoge);
func2(hoge); //ここで内容をいじっている!
func3(hoge);
これは以下のようにしたほうが「中で何かしている」感じがわかりやすくなる。
func1(hoge);
func2(&hoge);
func3(hoge);
値を変える参照は、短くなるからと無闇に使うと危険ですよ。
0510デフォルトの名無しさん
2010/08/29(日) 18:31:38>それはロジックが悪い。
>そんなに代入を繰り返さなくても出来る。考えてみ。
いや、二分木や線形リストに関しては、ポインタのポインタを使わない限り、無駄な代入が繰り返されてしまいます。
ポインタのポインタを使わずにスマートな方法があるというのなら、それは是非知りたいところです。実例を示してください。
>値を変える参照は、短くなるからと無闇に使うと危険ですよ
それはそうですね。後から読むときにわかりにくいのは事実です。
0511499
2010/08/29(日) 18:34:27無礼な言葉を吐くだけ吐いて、出来ないとなったら教えてください、かよ。おめでたいガキだな。
コードを示してください。
私はすでにポインタのポインタを使ったもの、参照をつかったもの、ポインタのポインタを使っていないものの3種を示しています。
時間はたっぷりありますから、アイディアだけでも示してください。
話はそれから。
0513499
2010/08/29(日) 18:43:48無礼者に使う時間などないよ。
おまえよりもうちょっとマシな誰かが、気が向いたらコード書いてくれるかもしれないから、それまで待ってれば?
よく検討もせずに
>それはロジックが悪い。
というほうがよっぽど無礼ですね。こちらは動くコードを書いた上で意見を述べているのですけれども。
コードを示してください。
話はそれから。
0515499
2010/08/29(日) 18:50:23代替コードも書いている。
おまえにタダで見せる気にならないだけだ。
誰か奇特な人が見せてくれるまで口あけて待っとけ。
0516デフォルトの名無しさん
2010/08/29(日) 20:34:55何か既視感があるな・・・
口だけなら「コードを書いている」といくらでもいえます。
それに「見せるきにならない」といいますが、
仮に見せていただければ、私はただただ低頭して「私が馬鹿でした」と発言して消えるでしょう。
それはあなたにとっては、大満足なのではないですか
動くコードを見せて実証することで、私の今までの発言を全否定できるにもかかわらず、それをせずにうそぶくのみ。
これでは、実証するアイディアなりコードなりがないと推測せざるをえません。推測ですけれどもね。
コードを示してください。
話はそれから。
0518499
2010/08/29(日) 20:38:25おまえが馬鹿(というよりは、低レベル)なことは、俺にとってははっきりしてるからな。
別にこんな便所のラクガキの場所で示す必要も無い。
逆に、示してやればおまえのレベルを引き上げてしまう。バカバカしい。
ど素人はど素人のまま、学生の宿題でもやってるのがお似合いだよ。
だいたい、教えて欲しいなら、最初の暴言を謝るのが順序だろう。それもせずにただ出せなんて図々しい。
0519デフォルトの名無しさん
2010/08/29(日) 20:41:44ふつーに
struct data *alloc_root(void);
int add_data(struct data *root, char *name, char *tel);
とか作る
ひとつ可能性があるとすれば、非再帰的に記述することですかね。
線形リストならば、それは可能ですが、2分木だと結構むずかしくなります。たぶん各ノードにワークエリアを設けて
戻るノードを記憶しなければならないでしょうね。
昔書いた非再帰的なコードをあげておきます。ポインタのポインタは使っていますが。
http://codepad.org/n3raxalm
私は再帰的なアルゴリズムのみしか念頭にありませんでした。
もし非再帰的に記述することを示唆しておれば、大変失礼いたしまた。
0521デフォルトの名無しさん
2010/08/29(日) 21:27:330522デフォルトの名無しさん
2010/08/29(日) 21:31:53ええ、binary tree でノードの追加なり総なめを行うのなら、親ノードの位置を逐一記録しておかなければならないでしょうね。
ノードを追加したら、追加されて新しく親ノードになったところをなんらかの形で覚えておかないといけないでしょう。
もしかすると、ノードごとにワークを持つ必要はないかもしれませんが。(>>520 はノードごとにワークをもっていました。)
0523デフォルトの名無しさん
2010/09/01(水) 22:08:27バイナリツリーでそんな実装するわけねーだろ
0524デフォルトの名無しさん
2010/09/01(水) 23:05:14http://hibari.2ch.net/test/read.cgi/tech/1280653311/735
0525デフォルトの名無しさん
2010/09/04(土) 03:15:330526デフォルトの名無しさん
2010/09/04(土) 07:12:230527デフォルトの名無しさん
2010/09/04(土) 10:47:37ありがとう!
0528デフォルトの名無しさん
2010/09/04(土) 15:28:580529デフォルトの名無しさん
2010/09/10(金) 19:18:42C言語での書き方で悩む事もあるんだよ
>>55みたいな
0530デフォルトの名無しさん
2010/09/10(金) 19:19:320531デフォルトの名無しさん
2010/09/10(金) 19:53:480532デフォルトの名無しさん
2010/09/10(金) 23:54:01const は一番近い場所にある token が変更不可能になる
っていう理解で桶?
0533デフォルトの名無しさん
2010/09/11(土) 00:09:14近いってどっちだよ、ってなるぞ
0534デフォルトの名無しさん
2010/09/11(土) 17:57:59理屈を抜きにするから応用利かないけど。
この二つ暗記な。
int *p[] ポインタの配列
int *const p コンストポインタ
だからこそ、
配列のポインタが (*p)[] だと想像できるし、
コンストintへのポインタが int const *だと分かる。
0535デフォルトの名無しさん
2010/09/11(土) 18:44:36constが後置修飾になってるほうがポインタそのものをconstにしてるだけ
int const もconst int も int を定数にしてるだけなんだし
0536デフォルトの名無しさん
2010/09/11(土) 20:25:13いまは
int const * p;
と
int * const p;
の違いの話をしているんじゃまいか
0537デフォルトの名無しさん
2010/09/11(土) 20:41:58ポインタの配列は(*p)[] これだし、
constポインタはconst (int *)pこう書きたい。
イメージどおりには行かんね。
0538デフォルトの名無しさん
2010/09/11(土) 20:52:42hds
0539デフォルトの名無しさん
2010/09/11(土) 21:44:430540デフォルトの名無しさん
2010/09/11(土) 21:54:39int const *p;
int * const p;
0541デフォルトの名無しさん
2010/09/11(土) 22:22:420542デフォルトの名無しさん
2010/09/12(日) 16:15:020543デフォルトの名無しさん
2010/09/13(月) 18:36:27それは C の最強の武器を放棄したに等しい。
0544デフォルトの名無しさん
2010/09/13(月) 19:10:55kwsk
0545デフォルトの名無しさん
2010/09/13(月) 20:12:37int const *p => const int の ポインタ
int * const p => int の const ポインタ
0546デフォルトの名無しさん
2010/09/13(月) 20:19:340547デフォルトの名無しさん
2010/09/13(月) 20:24:150548デフォルトの名無しさん
2010/09/13(月) 20:29:200549デフォルトの名無しさん
2010/09/13(月) 20:36:05int i = 100, j = 200;
const int *a, *b; // const int
int const *c, *d; // const int
int *const e = &i, *const f = &i; // intへのconstポインタ
int const *const g = &i, *const h = &i; // const intへのconstポインタ
*a = j; // error: assignment of read-only location
*b = j; // error: assignment of read-only location
*c = j; // error: assignment of read-only location
*d = j; // error: assignment of read-only location
e = &j; // error: assignment of read-only variable `e'
f = &j; // error: assignment of read-only variable `f'
*g = j; // error: assignment of read-only location
*h = j; // error: assignment of read-only location
g = &j; // error: assignment of read-only variable `g'
h = &j; // error: assignment of read-only variable `h'
return 0;
}
0550デフォルトの名無しさん
2010/09/13(月) 20:38:02const int *a, *b; // const intへのポインタ
int const *c, *d; // const intへのポインタ
0551デフォルトの名無しさん
2010/09/13(月) 20:51:050552デフォルトの名無しさん
2010/09/14(火) 08:42:30* が複数ある場合も何番目の * と * の間に const があるかで意味が決まる
0553デフォルトの名無しさん
2010/09/14(火) 17:48:160554デフォルトの名無しさん
2010/09/15(水) 00:05:240555デフォルトの名無しさん
2010/09/15(水) 00:11:29巡回するなら普通はスタック使うだろ?
ってマジレスしたらいかんかったのだろうか
>>523
仕様によってはあり得る
0556522
2010/09/15(水) 00:28:58この問題、宿題スレの方で実際にコードを書いていただき、戻る位置をおぼえない方法を示していただきました。
すぱっと非再帰に書き下すきれいなコードでした。>>524
でも、二分木は再帰で書きたいもの、とちょっと負け惜しみ。
0557デフォルトの名無しさん
2010/09/15(水) 00:46:28最適化を考えると大概再帰よりループ展開の方が速い
どっちでも書けるようになったほうがいいぞ
0559デフォルトの名無しさん
2010/09/15(水) 13:06:41あと、再帰でも、無駄なコピーなしに実装できる。
絶対できないとか頑張ってないで、ちょっと考えてみ。
0560デフォルトの名無しさん
2010/09/15(水) 13:48:49アルゴリズム関係は向いてないんじゃないかね
0561デフォルトの名無しさん
2010/09/15(水) 18:12:27二重ポインタか参照を使わないと無理ではないでしょうか?
0562デフォルトの名無しさん
2010/09/15(水) 19:54:07人を疑う前に少しは考えろよ
0563デフォルトの名無しさん
2010/09/20(月) 13:34:24嘘書くなよ
0564デフォルトの名無しさん
2010/09/21(火) 07:13:430565デフォルトの名無しさん
2010/09/27(月) 23:59:03const int* a とかにしとけ。
int const *aとか使わんだろ。
0566デフォルトの名無しさん
2010/09/28(火) 00:29:200567デフォルトの名無しさん
2010/10/03(日) 17:10:520568デフォルトの名無しさん
2010/10/03(日) 17:52:31勉強しなおそうね
0569デフォルトの名無しさん
2010/10/03(日) 17:58:19int const * const a;
or
const int * const a;
0570デフォルトの名無しさん
2010/10/03(日) 18:31:19上と下はどうちがうの?
0571デフォルトの名無しさん
2010/10/03(日) 18:57:08かわらない。
0572デフォルトの名無しさん
2010/10/03(日) 19:17:280573デフォルトの名無しさん
2010/10/03(日) 19:22:55修飾子が被っているが無視されるので問題ない
まぁ、書いた人はそんなこと意図していなかっただろうけど
0574デフォルトの名無しさん
2010/10/03(日) 19:25:25どっちが正しいっていうか一般的っていうか
0575デフォルトの名無しさん
2010/10/03(日) 20:27:370576デフォルトの名無しさん
2010/10/24(日) 18:26:180577デフォルトの名無しさん
2010/10/24(日) 19:10:290578デフォルトの名無しさん
2011/02/06(日) 02:34:020579デフォルトの名無しさん
2011/02/06(日) 10:06:34被ってはいないだろ
0580デフォルトの名無しさん
2011/02/06(日) 10:48:42○ const int
○ int const
× const int const
○ const int * const
○ int const * const
× const int const * const
○ const int *
○ inst const *
× const int const *
○ int * const
○ int *
0581デフォルトの名無しさん
2011/02/06(日) 11:55:22> ○ const int *
> × inst const *
○ int const *
inst になってしまそうになる気持はわかる
0582デフォルトの名無しさん
2011/02/06(日) 16:59:24C* c;
c->*p;
0583デフォルトの名無しさん
2011/02/07(月) 11:33:100584デフォルトの名無しさん
2011/02/21(月) 22:33:30.980585デフォルトの名無しさん
2011/02/27(日) 00:22:54.55コンストintへのポインタへのコンストポインタへのポインタへのコンストポインタでOK?
0586デフォルトの名無しさん
2011/02/27(日) 00:29:38.880587デフォルトの名無しさん
2011/02/27(日) 01:21:24.77(指定子に限りどちらからでも修飾可能)
マンバポインタといっしょで *const で一塊と見たほうがわかりやすいね。
int *p;
int ( *func )();
int *const q = p;
int ( *const funk )() = func;
class C;
int C::* r;
int ( C::* funx )();
0588デフォルトの名無しさん
2011/02/27(日) 21:17:19.780589デフォルトの名無しさん
2011/03/04(金) 21:22:36.79{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
};
で初期化出来ますが、
*abc[][3] の配列(というか *abc[][3] を指すポインタ)は、
char **xyz[][3] = {abc, def, ...};
じゃ代入出来ないんですけど、
どう書いたら良いでしょうか?
0590デフォルトの名無しさん
2011/03/05(土) 00:30:23.52*abc[][3]に対して、abcは*(*)[3]ね
&abcは、*(*)[][3]ね
char *(*xyz)[3] = abc;
{abc, def, ...}は、配列とかにしたいんだろうから
char *(*xyz[])[3] = {abc, def, ...};
配列にしたいので、xyz[]になる
0591デフォルトの名無しさん
2011/03/05(土) 00:43:58.31char *(*xyz[])[3] = {abc, def, ...};
ならいけますが
char *(*xyz[])[3] = {
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
},
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
},
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
},
...
};
は無理ですよね?
0592デフォルトの名無しさん
2011/03/05(土) 00:52:24.23{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
}
が[4][3]
""が*
その配列なので、[]
char *(xyz[])[4][3]の方がわかりやすいかな
0593デフォルトの名無しさん
2011/03/05(土) 06:04:54.10char *abc[][3] = {
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
...
...
...
};
なら縦方向に可変長に出来るのに、
char *(*xyz[])[3] = {
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
},
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"}
},
{
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"aho", "baka", "shine"}
},
...
...
};
は無理ですよね?
ってことです。
0594デフォルトの名無しさん
2011/03/05(土) 06:14:40.270595デフォルトの名無しさん
2011/04/11(月) 21:47:20.95**、が何示してるか分からないだろ。
0596デフォルトの名無しさん
2011/04/12(火) 22:33:04.77二次元配列へのポインタを[]を使わないで書けるようにまずはなれ
0597デフォルトの名無しさん
2011/04/15(金) 01:00:43.52> ">私のささやかな経験から言わせてもらうと、伝統的に大学のコンピュータ
> サイエンスのカリキュラムで教えられているもので、多くの人がうまく理解
> できないものが2つあった: ポインタと再帰だ。
> "
なんか再帰が苦手だったというか、最初ハノイの塔とかでも自分で自分を呼ぶというのが
どうもよくわからなくて苦労したが、同じ名前の関数を呼ぶと考えたらあっさり理解できたな
初心者の頃。
でもトレースするのはやっぱり苦手。
0598デフォルトの名無しさん
2011/04/15(金) 12:01:39.81自分で自分を呼ぶと考えるからややこしいんだよ。
例えば階乗なんてこれだけだ。
自然数nの階乗とは:
nが0か1の場合、1
そうでない場合、n-1の階乗にnをかけた結果
これをCでそのまま書くだけ。
unsigned factrial(unsigned n)
{
if (n == 0 || n == 1) return 1;
return factrial(n - 1) * n;
}
ハノイの塔だろうがフィボナッチ数列だろうがツリー探索だろうがみんなこれの応用だ。
なんなら解説してもいいけど、ここではスレ違いだな。
0599デフォルトの名無しさん
2011/04/15(金) 12:18:02.65末尾再帰は単純なループに置き換え可能だそうですが
>>598 はどうなりますか?
0600デフォルトの名無しさん
2011/04/15(金) 13:00:03.37考え方をちょっと変える必要がある。
>自然数nの階乗とは:
>nが0か1の場合、1
>そうでない場合、n-1の階乗にnをかけた結果
ここで、n-1の階乗を返す関数の代わりにn-1の階乗にnをかけた結果を返す関数を用意する。
unsigned fact_sub(unsigned n, unsigned r)
{
if (n == 0 || n == 1) return r; // 0! * r or 1! * r
return fact_sub(n - 1, n * r); // (n-1)! * r
}
これを呼ぶように>598を書き換える。
unsigned factrial(unsigned n)
{
return fact_sub(n, 1);
}
C++なら、unsigned factrial(unsigned n, unsigned r = 1)としてしまえば一関数で済む。
尤も、こんなことするまでもなく最近のgccは>598をループに書き換えるけどね。
0601デフォルトの名無しさん
2011/04/17(日) 06:21:40.62呼び出したところに関数と同じ内容のブロックがあり、
それが延々と続いてるとイメージすれば分かりやすい
それはまさにツリーと同じ構造だ
0602デフォルトの名無しさん
2011/04/17(日) 06:44:15.01再帰で書けと言っても書けない奴が多いのか、再帰のロジックを読める
くせに書けない奴が多い理由がわかった。
0603デフォルトの名無しさん
2011/04/17(日) 09:02:18.74「まずuntilループに書き換える」
「ループ内で再代入する変数は全て引数として渡す」
って2点を教えてやれ
0604デフォルトの名無しさん
2011/04/17(日) 09:04:11.420605デフォルトの名無しさん
2011/04/17(日) 09:11:00.700606デフォルトの名無しさん
2011/04/17(日) 21:34:44.55例えばアッカーマン関数は末尾最適化出来ない
0607デフォルトの名無しさん
2011/04/19(火) 01:21:52.48ttp://kmaebashi.com/programmer/pointer.html
>K&Rによれば、Cの宣言は、「変数が現われ得る式の構文を真似た(P.114)」そうである。
>しかし、本質的に全く異なるものを無理に似せようとしたため、
>結局わけのわからない構文になってしまっている。
># Cの作者Dennis Ritchieが最近開発した新しい言語 Limboは、一見
># C like だが、宣言の構文はしっかりPascal風のものに直してある...
># ずるい(^^;
0608デフォルトの名無しさん
2011/04/19(火) 01:46:12.61同じ*だと思っていたからどうにも理解できなかったわ。
0609デフォルトの名無しさん
2011/04/19(火) 19:42:14.51前置版 → 後置版
int *p; → int p*;
int (*p)[99]; → int p*[99];
int *p[99]; → int p[99]*;
int *(**p[5])[3][2]; → int p[5]**[3][2]*;
int (*pf)(void) → int pf*(void);
int (*(*(*(*pf)[5])(void))(void))[3]; → int pf*[5]*(void)*(void)*[3];
結果:
後置版はカッコを付けなくても一意的に意味がつくので、
宣言がすっきりする
後置版の方が本来は読みやすいはずだが、今のところ、
個人的にはかえって読みにくい(「*p」表記に毒されてしまったのか^p^)
0610デフォルトの名無しさん
2011/04/19(火) 20:35:44.53両立できるのか?
0611デフォルトの名無しさん
2011/04/19(火) 20:44:13.820612デフォルトの名無しさん
2011/04/19(火) 20:51:39.73使い易さ・読み易さが格段に落ちることは無いと思う
ポインタpに対して、(*p)という記述を自発的に封印して
p[0]という記述に統一した場面を想像すればいい
この場合、実行コーディングの使い易さ・読み易さが
格段に落ちることは無いよね
(*seito).kokugo = 100; → seito[0].kokugo = 100;
*(*hoge).(*fuga) = NULL; → hoge[0].fuga[0][0] = NULL;
後置版の場合、(*p) が p* に置き換わるだけだから、これは
*p が p[0] に置き換わったのと同じことで、やっぱり
使い易さ・読み易さが格段に落ちることは無いのでは?
(*seito).kokugo = 100; → seito*.kokugo = 100;
*(*hoge).(*fuga) = NULL; → hoge*.fuga** = NULL;
0613デフォルトの名無しさん
2011/04/19(火) 20:57:02.70p* = 10; と p *= 10; の区別が紛らわしいって話だよね
それは別の記号を使えばいいだけでは…
ポインタの「*」には、*のかわりに@を使うことにする、とか
p@ = 10; p *= 10;
0614デフォルトの名無しさん
2011/04/19(火) 20:58:52.09そのままでよさそうだな
0615デフォルトの名無しさん
2011/04/19(火) 21:23:17.01弄りまくるも何も、文法的には何も弄ってないのだが…
仮に弄っているように見えたとしても、>>612-613で全て完結してる
(*p) のかわりに p[0] を使う文法は、今のままのC言語で普通に使える。
後置版を考えるというのは、「全ての(*p) を p[0] に統一しましょう」
と言っているのと同じことで、実は何も弄ってないでしょ?
( (*p)は前置き表現なのに対し、p[0]は後置き表現 )
ただ、それなら「p*」とか「p@」とか書かないで
「p[0]」でいいじゃんって話になるなw
0616デフォルトの名無しさん
2011/04/21(木) 11:55:23.48ポインタもその類の気がする。
0617デフォルトの名無しさん
2011/04/22(金) 09:54:08.260618デフォルトの名無しさん
2011/04/23(土) 05:57:17.53p[0]っていう後置版が存在してるから、わざわざp* などという後置版を
新設する意味は無かった。単にp[0]を使えばよいのだった
ならば、宣言時にもp[0]を拝借して、「int p[0];」を
ポインタの宣言として使ったらどうか?
今のC言語では、「int p[0];」という宣言は使われてない(コンパイラに怒られる)。
従って、この宣言に何か意味をつけて使用しても、問題は起きない
0619デフォルトの名無しさん
2011/04/23(土) 06:00:26.47int *p; → int p[0];
int (*p)[99]; → int p[0][99];
int *p[99]; → int p[99][0];
int *(**p[5])[3][2]; → int p[5][0][0][3][2][0];
int (*pf)(void) → int pf[0](void);
int (*(*(*(*pf)[5])(void))(void))[3]; → int pf[0][5][0](void)[0](void)[0][3];
なんか微妙だ^p^
配列との区別がつきにくい…
宣言自体は読みやすい(先頭のintを無視すれば、左から右へ英語読みできる)のだが
0620デフォルトの名無しさん
2011/04/23(土) 06:11:49.34∧_∧∩ /先生!土曜日の早朝にそんなこと
( ´∀`)/< 考えるだけでなく、書込までするのは
_ / / / \あまりにも不毛だと思います!
\⊂ノ ̄ ̄ ̄ ̄\  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
||\ \
||\|| ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄||
.|| ||
0621デフォルトの名無しさん
2011/04/23(土) 06:32:33.92懐かしいAAまで使って凝ってるなw
そんなお前の方がよっぽど不毛だわ
0622デフォルトの名無しさん
2011/04/23(土) 10:19:21.16最大の問題点はC言語やそのライブラリが
ポインタ酷使し過ぎなことだと思う
・参照型が使える
・参照渡しが使える
・文字列は、基本型もしくは構造体である
・配列は明示しない限り範囲外アクセス不可
始めからこのくらいやれば
半端な知識の人間がポインタに触れることはまずなかったはずだし
本当にアドレスを扱いたいとき以外ポインタ使わなかったろうから
うっかりさんが大量発生することもなかっただろう
C/C++以外にも確かDelphiとかポインタあるはずだが
あんまりポインタで詰まるのを聞かない
それは本当に滅多に使わないからだと思う
0623デフォルトの名無しさん
2011/04/23(土) 11:16:02.38アセンブラの代わりに使える低水準言語でなくなる事は、本末転倒だと思う。
Cをそのように使いたいなら、C++でお茶を濁せばいいだけだと思う。
0624デフォルトの名無しさん
2011/04/23(土) 12:23:44.25参照なんて結局んところ、[]演算子のオーバーロード時に使いたいだけちゃうんかと。
MyData &operator[](foo f)して、mydata[bar][baz]させたいだけちゃうんかと。
0625デフォルトの名無しさん
2011/04/24(日) 03:29:25.86いや、当然C言語なんだから低水準なものは扱えるべきだよ。
何もポインタ自体を廃止しろと言ってるワケじゃない。
ポインタに依存するものが多過ぎるでしょ、って話。
0626デフォルトの名無しさん
2011/04/24(日) 03:47:38.83速度を上げるためのポインタ参照だから
0627デフォルトの名無しさん
2011/04/24(日) 03:53:03.71別にシステムプログラミング用途で不合理、不適合ってわけじゃないからな。
変えろとか言われても知らんがな。
0628デフォルトの名無しさん
2011/04/24(日) 03:54:49.92実際は何故かプログラミングの教材にすら使われる言語なのだが
0629デフォルトの名無しさん
2011/04/24(日) 03:58:20.96ごね方が謎過ぎる
0630デフォルトの名無しさん
2011/04/24(日) 12:25:36.830631デフォルトの名無しさん
2011/04/24(日) 13:50:37.04「高級言語でもないものを、高級言語であるかのように扱ったから」
だな
0632デフォルトの名無しさん
2011/04/24(日) 21:20:11.120633デフォルトの名無しさん
2011/04/24(日) 21:30:52.470634デフォルトの名無しさん
2011/04/25(月) 02:57:24.98先天的に才能がない人間も、プログラミングをするようになっただけなんじゃね?
0635デフォルトの名無しさん
2011/04/25(月) 12:39:41.860636デフォルトの名無しさん
2011/04/25(月) 18:54:12.210637デフォルトの名無しさん
2011/04/25(月) 18:55:36.130638デフォルトの名無しさん
2011/04/27(水) 08:05:24.620639天使 ◆uL5esZLBSE
2011/07/04(月) 23:31:18.49そんな言語使ってる奴ってどうみてもゴミだと思うんだけど
もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの?
そうか、二度と話かけんなよ
ゴミは何いってもゴミ
0640デフォルトの名無しさん
2011/07/05(火) 02:37:31.170641天使 ◆uL5esZLBSE
2011/07/06(水) 15:13:34.56「「「「「 つまりアレだな、スレタイに対する回答は 」」」」」(キリ
∧∧∧∧∧∧∧∧∧∧(きリッッ!キリッッッッ!!きリッ!!!キリッッッッ!!!!
∨
「「「「「 「高級言語でもないものを、高級言語であるかのように扱ったから」 」」」」」(←きリッッッ!!!!キリッッ!!!!
∧∧∧(キリ!!
0642デフォルトの名無しさん
2011/11/11(金) 10:08:45.32Cが出た頃の昔はポインタで高効率とかあったけど、
今のコンパイラなら最適化が優れてるから
無理に使う必要ない。
ワザと判り難いプログラミングの手本見て、
真似するとか低脳な教え手から習うなよw
コンパイラがショボかった昔の技法なんだよ。
0643デフォルトの名無しさん
2011/11/11(金) 14:31:23.820644デフォルトの名無しさん
2012/02/05(日) 15:15:53.57sizeof(b)=8;
になるのは何で?bはint型だから4じゃないの?
0645デフォルトの名無しさん
2012/02/05(日) 18:25:06.21int *だわな。
0646デフォルトの名無しさん
2012/02/05(日) 18:26:17.390647デフォルトの名無しさん
2012/03/04(日) 21:32:57.04全くモノにならなかった。
しかしついさっき、ようやく、ようやく開眼した。
ポインタ変数と、それが指し示すデータの実体を
同じメモリの中で考えるから位置関係が気になって混乱する。
メモリが一つで一直線にあるのではなく、
データ専用のメモリと、ポインタ専用のメモリが別々にあると
考えて、二つを並べることで理解できた。
つまり地面にメモリが二本垂直に突き立っているイメージ。
右のメモリにはデータがあり、
左のメモリにはポインタ変数があって右のメモリのアドレスを指している。
ポインタのポインタなら、三本めのメモリが立っていて
真ん中のメモリのアドレスを指している。
こんな簡単なことだったんだ。
人生が開けた感じ。とても清々しい気持ちだ。
次は構造体を頑張るぞ。
0648デフォルトの名無しさん
2012/03/04(日) 23:30:43.7430年もかかるんなら、プログラマに向いてねぇよ
0649デフォルトの名無しさん
2012/03/05(月) 00:14:24.980650デフォルトの名無しさん
2012/03/05(月) 00:18:44.22>>647の頭の中ではMapみたいにkey領域とvalue領域があるのかなー・・・。
0651デフォルトの名無しさん
2012/03/05(月) 01:12:04.93相変わらず君らはレベルの低いレスを付けるのだな。
ポインタで引っかかる人は、みな私のように
頭の中にメモリのイメージを作れずに苦労しているのだよ。
二段メモリの概念は素晴らしい。これでポインタの本を書けるかも。
私を30年も苦労させたリッチーを、卒業祝いに一発殴りたいところだが
亡くなったそうだからチャラにしてやる。
これからはプログラムを作りまくるぞー。
0652デフォルトの名無しさん
2012/03/05(月) 08:33:39.670653デフォルトの名無しさん
2012/03/05(月) 10:13:34.99*をつけると変数の中身をアドレスにしてアクセスする。アクセス先の型はintとする。
最初に*hogeはint型だが、*を外したらアドレスになる、と覚えようとしたら混乱した。
0654デフォルトの名無しさん
2012/03/06(火) 07:45:17.53そこで多段メモリですよ。
以下のようにイメージすれば、ポインタなんて簡単だ。
先にも言ったとおり、初心者がポインタでつまづくのは、
リニアなメモリの中にデータとポインタが混在したイメージを
頭の中で処理しきれないから。
だったら、処理しやすいイメージに変えてしまえば良い。
実際のメモリ配置がコンパイラの実装に依存する以上、
このイメージが決定的にまずいということはないはず。
1.右のメモリにはデータがある
2.真ん中のメモリには1へのポインタ変数がある
3.左のメモリには2へのポインタ変数がある
4.ポインタ変数に付く*の数は、その変数のあるメモリの
何段前のメモリを見に行くかを示すものである
0655デフォルトの名無しさん
2012/03/06(火) 08:24:45.300656デフォルトの名無しさん
2012/08/15(水) 12:08:10.120657デフォルトの名無しさん
2012/08/15(水) 13:29:54.51モナドとか理解できんのかね?
0658デフォルトの名無しさん
2012/08/15(水) 13:37:19.59ばりばりに書いているエンジニアで再帰がよく判っていない奴がしばしば居るし、
ポインタをイメージできないのに再帰を使いたがる奴が少なくとも一人居たし。
0659デフォルトの名無しさん
2012/08/15(水) 13:48:25.42ポインタはホントにメモリの一点をポイントしてるだけなんだがねぇ。
そこに自分用の領域が有るかはわからんけどさ〜。
0660デフォルトの名無しさん
2012/08/15(水) 13:53:51.130661デフォルトの名無しさん
2012/08/15(水) 16:26:01.330662デフォルトの名無しさん
2012/08/15(水) 16:33:53.21読解力が無いので
0663デフォルトの名無しさん
2012/08/15(水) 23:04:57.62そもそも、ポインタの概念自体が古いから。 END。
いくら元になっているつっても、もうC言語自体古いし、使う技術者も古い。
いまどき使ってるのはサポート系の企業でしかないよ。覚える必要はない。
もう現場ではC言語は業界標準ではない。今はPHPとRubyとJavaだけ覚えていればそれ以外の言語は不要。
0664デフォルトの名無しさん
2012/08/15(水) 23:18:42.38ポインタ知らないとドライバすら書けん。
0665デフォルトの名無しさん
2012/08/16(木) 01:09:33.42Java の new にあたるのは ruby や PHP では何?
0666デフォルトの名無しさん
2012/08/16(木) 22:35:19.330667デフォルトの名無しさん
2012/08/16(木) 22:36:10.360668デフォルトの名無しさん
2012/08/17(金) 23:37:43.26ありがたみが分かるよ
0669デフォルトの名無しさん
2012/08/18(土) 12:53:36.340670デフォルトの名無しさん
2012/08/18(土) 13:02:08.75そういやどこぞで間違えた奴がいたね。
0671デフォルトの名無しさん
2012/08/20(月) 10:43:58.280672デフォルトの名無しさん
2012/08/20(月) 12:42:01.42ポインタとは、メモリの一点を指し示すための変数である。(ドヤッ
0673デフォルトの名無しさん
2012/08/21(火) 02:29:36.26ポインタとは、ある形をした入れ物に入れるための、その空間とぴったり同じ形をしたもののことだ。
0674デフォルトの名無しさん
2012/08/21(火) 02:45:04.35底が抜けてるんですね。わかります。
0675デフォルトの名無しさん
2012/08/21(火) 10:30:40.710676デフォルトの名無しさん
2012/08/23(木) 15:14:31.210677デフォルトの名無しさん
2012/08/23(木) 20:43:37.04苦吟苦心したのだがこれが精一杯。http://toro.2ch.net/test/read.cgi/tech/1344350210/292
0678デフォルトの名無しさん
2012/08/24(金) 20:41:52.86http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm
0679デフォルトの名無しさん
2012/08/25(土) 02:07:52.57もう4年も前だし。その連載、今思い出したけどポインタに限らず間違いだらけでどうしようもなかった。
0680デフォルトの名無しさん
2012/08/25(土) 03:31:23.67エピさん大活躍、C++やテンプレートの人かと思ってましたが
0681デフォルトの名無しさん
2012/08/25(土) 10:05:15.15あの企画、編集サイドの都合があるからだろうけど、没にしない限り筆者は赤っ恥晒したまんまだね。
0682デフォルトの名無しさん
2012/08/25(土) 12:05:14.720683デフォルトの名無しさん
2012/08/25(土) 21:42:42.04http://s04.megalodon.jp/2008-0328-1941-14/builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm
0684デフォルトの名無しさん
2012/08/25(土) 22:17:37.84でもエピさんの本は、まだよくわからないんだ‥‥。
0685デフォルトの名無しさん
2012/08/27(月) 13:13:42.040686デフォルトの名無しさん
2012/08/28(火) 16:08:14.88すべてがメモリ上とは限らない、単にレジスタである場合もある、みたいな反論を聞いたことがある。
0687デフォルトの名無しさん
2012/08/28(火) 17:03:37.630688デフォルトの名無しさん
2012/08/30(木) 02:14:22.26そういやregister変数に対してポインタ取ったらどういう形にコンパイルされるのかって規格で決まってるのかな?
0689デフォルトの名無しさん
2012/08/30(木) 03:22:15.01レジスタ変数のアドレスは取れると規格で決まってる
0690デフォルトの名無しさん
2012/08/30(木) 03:31:47.10§6.5.3.2 Address and indirection operators
Constraints
1 The operand of the unary & operator shall be either a function designator, the result of a
[] or unary * operator, or an lvalue that designates an object that is not a bit-field and is
not declared with the register storage-class specifier.
これはどう訳すべきか
0691デフォルトの名無しさん
2012/08/30(木) 03:51:46.05function designator ってなんだろう?
0692デフォルトの名無しさん
2012/08/30(木) 08:54:10.30Cではill、C++ではwell
0693デフォルトの名無しさん
2012/08/30(木) 19:18:14.14規格を探すと
5.3.1 Unary operators [expr.unary.op]
2 The result of the unary & operator is a pointer to its operand. The operand shall be an lvalue
or a qualifiedid. In the first case, if the type of the expression is “T,” the type of the result is
“pointer to T.” In particular, the address of an object of type “cv T” is “pointer to cv T,” with
the same cv-qualifiers. For a qualified-id, if the member is a static member of type “T”,
the type of the result is plain “pointer to T.” If the member is a nonstatic member of class C
of type T, the type of the result is “pointer to member of class C of type T.”
これでC99と違って特にregisterに言及してない辺りなのかなあ
>>691
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Flvalue.htm
これの「関数指定子」って奴か?
JISのもあるけど読んでも意味わからん
0694デフォルトの名無しさん
2012/10/17(水) 10:29:13.86ポインタは生成されたが、まだ値が代入されていない。
値が代入された場合、ポインタが指しているデータは、削除されるかもしれない。
削除されても、ポインタに通知されない。
ポインタに値が代入されることで、以前、指していたデータを見失う。
0695デフォルトの名無しさん
2012/10/17(水) 10:40:41.46入門書にも間違いが多いからかな
0696デフォルトの名無しさん
2012/10/17(水) 13:09:18.06アドレスと、アドレス操作だけの話なのに。
0697デフォルトの名無しさん
2012/10/17(水) 18:49:50.880698デフォルトの名無しさん
2012/10/17(水) 20:45:46.16*n = 5;
0699デフォルトの名無しさん
2012/10/17(水) 23:21:30.21貴方のPCは死にました。
0700デフォルトの名無しさん
2012/10/18(木) 16:28:53.870701デフォルトの名無しさん
2012/10/18(木) 19:29:36.881を足すという命令になります。それによってtempに格納される値は102になります。
http://wizardbible.org/31/31.txt
???
0702デフォルトの名無しさん
2012/10/18(木) 19:34:31.33ふぇー ひどいサイトだなこりゃ
0703デフォルトの名無しさん
2012/10/18(木) 19:35:23.12当たり前だろ
*pointer だから pointerの指す値を取り出して +1 してるだけなんだから
0704デフォルトの名無しさん
2012/10/18(木) 20:39:35.45(pointer)は変数testのアドレスを指してるので(*pointer)の中身はtestである。
んで、(*pointer)=2600ってしてるので、その瞬間にtestは2600になる。
(*pointer)+1をtempに代入しているので、tempは2601になる。
アドレスをいじる要素はないね。
0705デフォルトの名無しさん
2012/10/18(木) 22:03:40.890706デフォルトの名無しさん
2012/10/18(木) 22:11:05.460707デフォルトの名無しさん
2012/10/18(木) 22:13:24.410708デフォルトの名無しさん
2012/10/18(木) 22:50:56.330709デフォルトの名無しさん
2012/10/18(木) 22:52:21.430710デフォルトの名無しさん
2012/10/18(木) 23:35:52.37俺も考えると、一番最初はそれで悩んだ覚えあり。
今は、いかなる解釈も考えないようにしている。
0711デフォルトの名無しさん
2012/10/21(日) 19:34:11.47のですが、2次元配列(配列の配列)のところでワケわかめになってますorz
int a[3][3] = { {10,20,30,}, {40,50,60}, {70,80,90} };
このような配列を宣言した場合、
�@ &a
�A a
�B *a (または a[0])
これらのアドレスはみな同じになります。 全部違う意味をもつということは
漠然とは分かるのですが、�@〜�Bが具体的に何を意味しているのか、自分
では説明できません(今使っている入門書籍でもこれらの違いについては
記述がありません)。
たぶん、これが理解できていないと、配列のアドレス情報を関数へ渡したり、
他のポインタ変数へ渡す時に困ると思うのですが・・・。
アホな私でも分かるように説明して頂けないでしょうか?
0712デフォルトの名無しさん
2012/10/21(日) 22:46:42.51->* を理解するまでに半万年かかりそうだなw
0713デフォルトの名無しさん
2012/10/22(月) 00:12:35.50int *c = *a;
0714デフォルトの名無しさん
2012/10/22(月) 03:15:10.57初心者にも分かるように説明してやれ
それが出来ないなら、お前も同じレベルということだw
0715デフォルトの名無しさん
2012/10/22(月) 04:35:23.24金払えと思う
0716デフォルトの名無しさん
2012/10/22(月) 08:39:03.910717デフォルトの名無しさん
2012/10/22(月) 08:53:53.68安倍さんは「強い日本」「美しい日本」にしたいということで、まずは憲法9条の改正を目指す。
総裁選も盛り上がり、自民党が一気に国民の期待を集めている。
勢いに乗る安倍晋三総裁は、次期衆院選で憲法改正を争点のひとつにする意向を示している。
詳細 2012/10/21
http://www.zakzak.co.jp/society/politics/news/20121021/plt1210210709000-n1.htm
0718デフォルトの名無しさん
2012/10/22(月) 09:03:44.50int a[3][3] = { {10,20,30,}, {40,50,60}, {70,80,90} };
このような配列を宣言した場合、
�@ &a
�A a
�B *a (または a[0])
これで違いが出る理由について考えて見てはどうですか?
http://codepad.org/TGTgwWBK
0719デフォルトの名無しさん
2012/10/22(月) 11:29:34.12よく考えたら配列に+1するようなことってあまり意識したことがなかったな。
0720711
2012/10/22(月) 13:54:44.85どうもご親切に有難うございます。
おっしゃるように、それぞれをインクリメントした場合のアドレスの増分
を確認してみました。
�@ &a : 0x24 = 36 バイト → 2次元配列全体のサイズ(3x3x4)
�A a : 0xC = 12 バイト → サブ配列( {10,20,30} )のサイズ(3x4)
�B *a : 0x4 = 4 バイト → サブ配列の要素(int)のサイズ(4)
( a[0]は*aと同じ)
これからいえる事は、
�@は、この2次元配列(配列の配列)をひとかたまり(?)として捉えた場合の先頭アドレス
�Aは、その中のサブ配列をそれぞれひとかたまりとして捉えた場合の先頭配列の先頭アドレス
�Bは、その先頭のサブ配列の中の先頭要素(int)のアドレス
用語が適切かどうかは別として、理解の仕方としては正しいのでしょうか?
それから、これらのアドレス(あるいはポインタ)を使って配列の中の要素を参照する場合、
�Aと�Bは使えるけれども、�@はスケールが大きすぎて(?)使えない、ということになりますね?
>>719 さんも有難うございます。
0721デフォルトの名無しさん
2012/10/22(月) 14:01:38.700722デフォルトの名無しさん
2012/10/29(月) 11:54:10.24それがJavaの理解をさまたげているらしい。
0723デフォルトの名無しさん
2012/10/29(月) 12:03:23.51i=123;
p=&i;
*p;
pはiのアドレス *pには123が
int *p;と*pは別物でしょうか?
0724デフォルトの名無しさん
2012/10/29(月) 12:07:40.68*p はポインタpの指してる先の内容をくださいな
「*p」という同じ記号列だけど意味が違う
0725デフォルトの名無しさん
2012/10/29(月) 12:10:40.96ぬるぽが多発するよね
0726デフォルトの名無しさん
2012/10/29(月) 12:11:50.28どうもありがとう
なんかここだへんがまぎらわしい
0727デフォルトの名無しさん
2012/10/29(月) 12:17:26.27って考える方がまぎらわしくなくていいと思う。
初期化だけは注意が必要だけど。
int *p = hoge; 「*pはintですよ。ただしpはhogeにしといてね。」
0728デフォルトの名無しさん
2012/10/29(月) 12:20:48.680729デフォルトの名無しさん
2012/10/29(月) 12:25:39.65みたいなのはどうする?
0730デフォルトの名無しさん
2012/10/29(月) 12:26:07.07q*p;
同じ *p という列でもこの例だと掛け算。 * という記号は状況によって意味がいろいろあるの
0731デフォルトの名無しさん
2012/10/29(月) 12:27:07.390732デフォルトの名無しさん
2012/10/29(月) 12:27:58.50とか
hoge (*a)[];
とか
優先順位が判らんくて混乱する
0733デフォルトの名無しさん
2012/10/29(月) 12:31:27.18ところでc言語って20年ぐらい続いているんだよな
その前がpascala,fortranとかこの二つの言語はどうなっている?
なんかプログラム自動的に書くツールができてPG,SEは減りそうなんだよな
0734デフォルトの名無しさん
2012/10/29(月) 12:41:52.60日本語でどうぞ。
>ところでc言語って20年ぐらい続いている
は?
>pascala
そんなものありません。
>なんかプログラム自動的に書くツールができてPG,SEは減りそうなんだよな
日本語でどうぞ。
まぁ、「プログラムを自動的に生成」できたとして、それを行なう為にSEは必要だね。
0735デフォルトの名無しさん
2012/10/29(月) 12:44:05.08それはunixというOSを書いた名残でそういう言語仕様になっている。
そのハードウェアよりのプログラムのところがポインタなんだよな
C言語自体は進化しているか分からないが、発展したのにC++という言語があるけど
元のCもつかわれている。
自分のことでもうしわけないが、組み込みの勉強をしようとポリテクに申し込んだら
落ちた。多分若者優先だったかも
ハードウェアよりのC言語を勉強するとJavaの理解もはやいと思う。
0736デフォルトの名無しさん
2012/10/29(月) 12:49:18.27そこなんだよな。
普通の変数を 「型名 変数名 (= 初期値);」 で一般化して覚えてると
ポインタが絡んできた途端に頭の中のルールが混乱する。
0737デフォルトの名無しさん
2012/10/29(月) 13:00:02.77自分で書くときはtypedefしとけ。
0738デフォルトの名無しさん
2012/10/29(月) 13:03:21.26pascala->pascalですよ
>ところでc言語って20年ぐらい続いているよ
バブル崩壊あたりからあるよ
Javaは2000年あたりに知った。
pはint*というintのポイント型を宣言している
ただ上流工程のSEだけ生き残ってあとは減りそうだけどな
人海戦術から自動化していきそうだけどな
0739デフォルトの名無しさん
2012/10/29(月) 13:08:04.97C言語は他の言語より長く使われていることは確か
0740デフォルトの名無しさん
2012/10/29(月) 13:34:42.45とっくの昔から自動化できる部分はじゃんじゃん自動化してる。
ITなんて自動化の固まりじゃん。
何が自動化できてないって?
0741デフォルトの名無しさん
2012/10/29(月) 14:30:58.31危険性が高いのものも同上
0742デフォルトの名無しさん
2012/10/29(月) 15:25:22.350743デフォルトの名無しさん
2012/10/29(月) 18:44:39.59int *a, **b, c, ***d; こう書けるようにしてくれてるんだから、
int* a;
int** b;
int c;
int ***d;
などと書く必要性をまったく感じない。
0744デフォルトの名無しさん
2012/10/29(月) 19:56:33.54int* func(); の方が int *func(); より見やすいとかその程度の理由
0745デフォルトの名無しさん
2012/10/29(月) 20:03:10.71int *p; は「トークン*pはint型の数値を返す」
int (*p)(void);は「トークン(*p)(void)はint型の数値を返す」
と統一的に読める。でも直感的では無い。
0746デフォルトの名無しさん
2012/10/29(月) 20:07:16.810747デフォルトの名無しさん
2012/10/29(月) 20:27:15.86int* a と書くのはC++な人
int * a と書くのは変な人
と習った。
そーいうもんかと思い、以後Cで書く場合はint *a、C++で書くときはint* aと書くことにしている
0749デフォルトの名無しさん
2012/10/29(月) 20:29:47.93int & a
0750デフォルトの名無しさん
2012/10/29(月) 20:31:08.950751デフォルトの名無しさん
2012/10/29(月) 20:46:52.69int* p; と書くのは許せるが、
INT _tmain(INT iArgumentCount, LPTSTR *lppszArgumentVariables, LPTSTR lpszEnvironmentVariables)
と書いた奴は許せない。
0752デフォルトの名無しさん
2012/10/29(月) 20:55:05.22argc, argvをぐだぐだにしてるのが許せないの?
LPTSTR *こういう使い方が許せないの? もっとシンプルにconst TCHAR **としないから許せないの?
0753デフォルトの名無しさん
2012/10/29(月) 21:35:16.04俺はchar *argv[]の書き方が好みだ。
何故なら、char型へのポインタの配列だからだ。
0754デフォルトの名無しさん
2012/10/29(月) 22:05:20.05ポインタで受け取ってるだけであって配列ではないのだから。
0755デフォルトの名無しさん
2012/10/29(月) 22:14:00.280756デフォルトの名無しさん
2012/10/29(月) 22:19:09.26配列なのか、
表記で分けて読みやすくするのがいいかと。
何ごとも読みやすさ優先。by リーダブルコード
0757デフォルトの名無しさん
2012/10/29(月) 22:24:21.830758デフォルトの名無しさん
2012/10/29(月) 22:32:01.31単一なのか配列なのか区別するのに * と [] を使い分ければいいんじゃねってこと。
文字列操作のライブラリは軒並char *だから完全に統一とか無理だけど。
0759デフォルトの名無しさん
2012/10/29(月) 22:39:04.710760デフォルトの名無しさん
2012/10/29(月) 22:53:31.92実体は配列の先頭 終端は別途もらうか、約束事の番人で打ち切るまでにするか
0761デフォルトの名無しさん
2012/10/31(水) 06:57:33.910762デフォルトの名無しさん
2012/10/31(水) 13:06:23.740763デフォルトの名無しさん
2012/10/31(水) 13:09:14.290764デフォルトの名無しさん
2012/10/31(水) 13:19:22.810765デフォルトの名無しさん
2012/10/31(水) 13:23:46.440766デフォルトの名無しさん
2012/10/31(水) 15:03:39.68void * realloc(void * allocated, size_t size)
{
void * ptr = NULL;
if (size) {
ptr = malloc(size);
if (ptr == NULL) return NULL;
if (allocated) memcpy(ptr, allocated, size);
}
free(allocated);
return ptr;
}
#if 0
最強って言ってもそれだけではなんもできない子。
#endif
0767デフォルトの名無しさん
2012/10/31(水) 16:00:40.050768デフォルトの名無しさん
2012/10/31(水) 17:16:07.31ptrの宣言位置がムカつく
0769デフォルトの名無しさん
2012/10/31(水) 21:48:57.550770デフォルトの名無しさん
2012/10/31(水) 22:09:27.72ほほぉ、では手本を一つ宜しく。
0771デフォルトの名無しさん
2012/11/01(木) 00:33:03.400772デフォルトの名無しさん
2012/11/01(木) 07:25:56.44そもそも、再アロケートが発生するような設計などしない。
0773デフォルトの名無しさん
2012/11/01(木) 09:33:57.28見てると眠くなるコードだったので書き直した
void *realloc(void *allocated, size_t size)
{
if(size){
if(!(void *ptr = malloc(size))) return ptr;
if(allocated){
memcpy(ptr, allocated, size);
free(allocated);
}
return ptr;
}
return allocated;
}
0774デフォルトの名無しさん
2012/11/01(木) 10:18:35.580775デフォルトの名無しさん
2012/11/01(木) 18:32:43.250776デフォルトの名無しさん
2012/11/01(木) 20:10:43.45そもそも初期化は式なのか
0777デフォルトの名無しさん
2012/11/01(木) 20:51:00.020778デフォルトの名無しさん
2012/11/01(木) 20:53:09.720779デフォルトの名無しさん
2012/11/01(木) 21:00:29.750780デフォルトの名無しさん
2012/11/01(木) 21:21:40.770781デフォルトの名無しさん
2012/11/01(木) 22:15:48.070782デフォルトの名無しさん
2012/11/01(木) 22:54:00.44そもそもこれ標準ライブラリ関数のreallocと動作違うし
0783デフォルトの名無しさん
2012/11/01(木) 23:08:38.750784デフォルトの名無しさん
2012/11/01(木) 23:11:24.440785デフォルトの名無しさん
2012/11/01(木) 23:40:59.54それは振る舞いが同等であればよいというだけの話。
規格は実装を規定しない。
0786デフォルトの名無しさん
2012/11/01(木) 23:43:38.640787デフォルトの名無しさん
2012/11/01(木) 23:45:31.636.5.3.3 Unary arithmetic operators ぐらい読んでから喋れ
0788デフォルトの名無しさん
2012/11/02(金) 03:15:20.10バカ発見w
0789デフォルトの名無しさん
2012/11/02(金) 03:24:52.131、2、3ではなく
甲、乙、丙、だったらどうなのか???
ポインタはアドレス「甲」を指す。
0790デフォルトの名無しさん
2012/11/02(金) 03:25:56.97日本の住所(アドレス)は、漢字プラス数字だから、比喩として成り立ってない。
0791デフォルトの名無しさん
2012/11/02(金) 05:48:08.05>欧米の住所(アドレス)は、数字だけだから
本当か?
0792デフォルトの名無しさん
2012/11/02(金) 09:54:09.56の発言の意図がわからんw
何を狙って書いたの?w
> 最強って言ってもそれだけではなんもできない子。
これだけでも良いから説明してほしい。
0793デフォルトの名無しさん
2012/11/02(金) 10:06:44.55malloc が realloc 呼んでたらどうすんの?
0794デフォルトの名無しさん
2012/11/02(金) 10:09:47.980795デフォルトの名無しさん
2012/11/02(金) 10:41:12.500796デフォルトの名無しさん
2012/11/02(金) 14:07:27.48どうかなんのか?どうもしないだろ
0797デフォルトの名無しさん
2012/11/04(日) 06:58:41.780798デフォルトの名無しさん
2012/11/04(日) 23:35:17.220799デフォルトの名無しさん
2012/11/05(月) 01:29:38.77コメは
番地 通り 都市名 州名 zip
なので数字は番地とzipだけ
欧はしらん
0800デフォルトの名無しさん
2012/11/05(月) 22:17:26.400801デフォルトの名無しさん
2012/11/06(火) 22:26:41.60毎回メモリコピーをするreallocは糞。
0802デフォルトの名無しさん
2012/11/07(水) 00:02:55.730803デフォルトの名無しさん
2012/11/07(水) 19:11:24.930804デフォルトの名無しさん
2012/11/11(日) 18:33:35.60例えば
int i=1.5;
int j=(int)i;
int* k=&i;
上のキャスト演算子のほうは「iをintに変えて」って意味だけど
じゃあ「iのポインタを示して(iをポインタに変えて)」ってしようとすると*じゃなく&になるのが感覚として馴染めないな
と言ってもC#で画像扱う際にちょっと触った程度なんだけど
宣言する時には*=ポインタ
キャスト?する時には*=値
ややこし過ぎる
0805デフォルトの名無しさん
2012/11/11(日) 18:48:30.200806804
2012/11/11(日) 18:50:30.75とりあえずC#で実際試したら
float f=1.5f;
int* i=(int*)(int)f;
ってやれば問題無いみたいだからまあ、これなら多少は解り易い
0807デフォルトの名無しさん
2012/11/11(日) 21:40:31.64関数の戻り値ではなく「引数を使って」ポインタを返すのに使える
関数が一つしか値を返せないC/C++では重要なテクニック かもしれない
0808デフォルトの名無しさん
2012/11/11(日) 23:16:01.640809デフォルトの名無しさん
2012/11/11(日) 23:26:05.120810デフォルトの名無しさん
2012/11/12(月) 07:17:47.090811デフォルトの名無しさん
2012/11/12(月) 09:39:19.29char str[] = "This is a pen.";
...
strcpy(str, "You is a big fool man.");
0812デフォルトの名無しさん
2012/11/12(月) 10:31:18.87そもそも、例えばstruct {char r, g, b;}を返す位なら全くオーバーヘッドはない場合もあるよ。
0813デフォルトの名無しさん
2012/11/12(月) 10:33:29.48>strcpy(str, "You is a big fool man.");
~~
この辺?w
0814デフォルトの名無しさん
2012/11/12(月) 10:34:42.770815デフォルトの名無しさん
2012/11/12(月) 11:16:59.220816デフォルトの名無しさん
2012/11/12(月) 11:25:34.940817デフォルトの名無しさん
2012/11/12(月) 12:24:33.690818デフォルトの名無しさん
2012/11/12(月) 17:56:04.030819デフォルトの名無しさん
2012/11/12(月) 19:50:25.77みんなが自分の好きな漫画や野球のページを見てる時に
自分だけこれみよがしに2chにつないでAAとかを周りに見せてたこと
しかも「このページって何?」って聞かれた時に「ヤバイ奴らの集会所みたいなもん」とか答えたこと
さらに友達に2chへの行きかたを教えるためにヤフーで2chって検索させて
でてきたリンクをクリックして2chのトップページが表示された瞬間に
そいつの耳元で「Welcome to Underground」ってささやいたこと
0820デフォルトの名無しさん
2012/11/12(月) 21:15:50.25まじめに質問
you is ... って語感としてどう訳すればぴったりになるの?サリンジャーとかが使っているの?
0821デフォルトの名無しさん
2012/11/12(月) 21:22:19.84ストリートファイターシリーズの元ってキャラがプレイヤー倒した時に言ってた気がする。
0822デフォルトの名無しさん
2012/11/13(火) 05:29:30.070823デフォルトの名無しさん
2012/11/13(火) 19:49:44.520824デフォルトの名無しさん
2012/11/13(火) 19:57:01.840825デフォルトの名無しさん
2012/11/14(水) 11:17:33.530826デフォルトの名無しさん
2012/11/14(水) 23:39:03.620827デフォルトの名無しさん
2012/11/15(木) 20:00:53.260828デフォルトの名無しさん
2012/11/22(木) 00:50:43.600829デフォルトの名無しさん
2012/11/23(金) 10:09:53.15ロングパスだが、これ結構判ってない奴が多い
>a[2]=2[a]が*(a+2)と等しいことを
等しくない
これを等しいと思ってる奴はバグ製造機なので身近に居たら要注意
0830デフォルトの名無しさん
2012/11/23(金) 12:04:14.04それ、何かのギャグ?
つーか、理由を書かなきゃギャグ認定しかできないよ。
0831デフォルトの名無しさん
2012/11/23(金) 22:03:54.17仕様書に
The definition of the subscript operator [] is that E1[E2] is
identical to (*((E1)+(E2))).
と, 書いてあるんだが
> >a[2]=2[a]が*(a+2)と等しい
の, なにが問題なの?
0832デフォルトの名無しさん
2012/11/24(土) 01:14:56.07それ、何かのギャグ?
つーか、理由を書かなきゃギャグ認定しかできないよ。
0833デフォルトの名無しさん
2012/11/24(土) 03:58:37.50メガネに見えた
0834デフォルトの名無しさん
2012/11/24(土) 09:44:45.86>831
0835デフォルトの名無しさん
2012/11/26(月) 03:13:42.94これは何に見える?
ー>*
0836デフォルトの名無しさん
2012/11/26(月) 10:52:35.650837デフォルトの名無しさん
2012/11/26(月) 11:30:54.40>>11
ロングパスだが、これ結構判ってない奴が多い
>a[2]=2[a]が*(a+2)と等しいことを
等しくない
これを等しいと思ってる奴はバグ製造機なので身近に居たら要注意
0838デフォルトの名無しさん
2012/11/27(火) 00:47:02.670839デフォルトの名無しさん
2012/11/27(火) 06:54:14.900840デフォルトの名無しさん
2012/11/27(火) 09:53:42.030841デフォルトの名無しさん
2012/11/29(木) 13:18:51.19a がポインタ変数であり有効なアドレスが代入されているという
前提をつけないとイコールにはならないね。
0842デフォルトの名無しさん
2012/11/29(木) 15:04:46.14a[2]==2[a]
0843デフォルトの名無しさん
2012/11/29(木) 20:06:35.54普通, 代入は := だろ? メタ文法的には…
0844デフォルトの名無しさん
2012/11/30(金) 00:22:33.03コード一行でも多く書こうぜ、人生は短いぞ
0845デフォルトの名無しさん
2012/12/06(木) 21:27:35.85[1]の文言は, 計算機の構造でもコンピュータの構造でもいいけどさ
0846デフォルトの名無しさん
2012/12/06(木) 21:56:04.68そんなことはない。
TK-80の頃からアセンブラでバリバリやってきた俺でさえ
Cのポインタはわからないのだから。
わかる頃にはもう人生が終わろうとしているだろうよ。
0847デフォルトの名無しさん
2012/12/06(木) 22:00:19.24それ単に才能ないだけじゃないの?
0848デフォルトの名無しさん
2012/12/06(木) 22:03:09.64才能ないヤツがワンボードマイコンで
バリバリアセンブリ組めるかよw
0849デフォルトの名無しさん
2012/12/06(木) 22:03:38.01普通はそこまで考えないよね。
ある程度Cが使えてるような人でさえ、コンパイル時に決まる
もの、リンク時に決まるもの、ランタイムに決まるものの区別
ができてない人がいたりする。
0850デフォルトの名無しさん
2012/12/06(木) 22:20:15.26ポインタがどう実装されるかくらい見てないのかよ
0851デフォルトの名無しさん
2012/12/06(木) 22:22:14.790852デフォルトの名無しさん
2012/12/06(木) 22:33:56.0510年前に覚えたからぼやけてる。
0853デフォルトの名無しさん
2012/12/06(木) 22:41:26.78と覚えた。
0854デフォルトの名無しさん
2012/12/06(木) 23:14:49.210855デフォルトの名無しさん
2012/12/07(金) 11:32:17.00LSI-C80を使うとよく判るぞ。
0856デフォルトの名無しさん
2012/12/07(金) 11:43:10.120857デフォルトの名無しさん
2012/12/08(土) 01:00:18.02構造体の定義の中に*付きの自分自身の構造体名…?
なんだこれは。もう頭が爆発しそうだよ。
0858デフォルトの名無しさん
2012/12/08(土) 01:43:58.39コンピュータで処理されるのは名前で処理されるんではなくて数字で処理されるのさ。
ただ、コード書くときは高級言語では名前を使うんだ。
んで、連結リストの((*selfname)は次の要素の場所を指す数字が入ってるわけさ。
コンピュータはその数字が正常値なら、見ると直ちにメモリ上の場所を把握できるんだ。
で、次を探すときはそれを使う。
配列だって、あれの(*selfname)は常に隣を指すから暗黙の省略が可能なだけで、意味的には存在するだぜ。
0859デフォルトの名無しさん
2012/12/08(土) 02:03:48.78ターゲットCPUが違うでよ
0860デフォルトの名無しさん
2012/12/08(土) 07:44:16.720861デフォルトの名無しさん
2012/12/08(土) 12:00:44.33ポインタについて正しく理解してないとそういうことになる。
0862デフォルトの名無しさん
2012/12/08(土) 13:15:17.62最初に登録したノードが最後に・最後に登録したノードが先頭に来るのが
馴染めなかった。
0863デフォルトの名無しさん
2012/12/08(土) 13:49:23.260864デフォルトの名無しさん
2012/12/08(土) 14:45:45.25もしかして:設計ミス
0865デフォルトの名無しさん
2012/12/08(土) 14:53:38.150866デフォルトの名無しさん
2012/12/08(土) 19:59:55.150867デフォルトの名無しさん
2012/12/09(日) 01:54:00.840868デフォルトの名無しさん
2012/12/09(日) 06:47:19.05ああ何となくわかった。
構造体定義での*構造体名は、構造体の中に自分自身があるという
魔術的な宣言ではなく、「同じ構造をしたデータのアドレスを
この位置に持ちますよ」という宣言に過ぎないのか。
ポインタは難しいな。1バイトのアドレスを示すに過ぎない
ポインタ変数自身にデータ型があることが、ポインタの宣言の解釈を
必要以上に難解にしている気がする。
0869デフォルトの名無しさん
2012/12/09(日) 07:14:46.81C++やJavaのクラス宣言なんかもそうだし。
0870デフォルトの名無しさん
2012/12/09(日) 11:36:47.72宣言って、ロジックには直接関係しない部分だから
頭が無意識に理解を拒否しているのかも知れん。
0871デフォルトの名無しさん
2012/12/09(日) 12:33:03.41そうそう。そんな感じ。
ちなみにポインタはsizeof(pointer)でサイズ取れるよ。
だいたいCPUのint長になってる。
0872デフォルトの名無しさん
2012/12/09(日) 13:08:51.03その表現は誤解を招く。
sizeof(pointer)で取れるのはポインタそのもののサイズで、
ポインタが指しているオブジェクトではない。ということが
その表現ではわかりにくい。
0873デフォルトの名無しさん
2012/12/09(日) 13:16:17.300874デフォルトの名無しさん
2012/12/10(月) 10:40:32.93その表現は誤解を招く。
先ず、CPUのint長という言葉が判り難い。
次に、CPUアーキテクチャとcの整数型のサイズとは直接関係がない。
最後に、整数型のサイズとポインタのサイズも一致するとは限らない。
0875デフォルトの名無しさん
2012/12/14(金) 15:26:58.21そりゃポインタ理解出来なくて当然だわなw
0876デフォルトの名無しさん
2012/12/14(金) 16:46:47.260877デフォルトの名無しさん
2012/12/14(金) 21:15:32.130878デフォルトの名無しさん
2012/12/14(金) 22:38:07.190879デフォルトの名無しさん
2012/12/18(火) 15:05:13.25Cの文法がハードルを上げてる
0880デフォルトの名無しさん
2012/12/18(火) 15:30:54.000881デフォルトの名無しさん
2012/12/18(火) 16:11:48.990882デフォルトの名無しさん
2012/12/19(水) 08:29:40.590883デフォルトの名無しさん
2012/12/19(水) 21:17:19.670884デフォルトの名無しさん
2012/12/19(水) 22:14:27.880885デフォルトの名無しさん
2012/12/19(水) 22:46:04.56Cはカミソリのように切れ味鋭いツール」
『プログラミング作法』p.105 ブライアン・カーニハン、ロブ・パイク
0886デフォルトの名無しさん
2012/12/20(木) 15:22:37.890887デフォルトの名無しさん
2012/12/21(金) 05:21:59.830888デフォルトの名無しさん
2012/12/21(金) 05:49:16.750889デフォルトの名無しさん
2012/12/21(金) 08:17:53.720890デフォルトの名無しさん
2012/12/21(金) 08:44:54.530891デフォルトの名無しさん
2012/12/21(金) 08:52:22.730892デフォルトの名無しさん
2012/12/22(土) 16:46:53.73確かに
そういえば中古ソフトがかなり安く買えた
激安中古ソフト販売( ・∀・) イイネ!
ググってみて
0893デフォルトの名無しさん
2012/12/22(土) 22:04:35.210894デフォルトの名無しさん
2012/12/22(土) 22:13:47.570895デフォルトの名無しさん
2012/12/24(月) 01:39:22.03ポインタはアドレスを記憶する変数だ。
配列名は先頭要素1byte目のアドレスをもつ定数だ。
ポインタがわからないのはなんで先頭1byteのアドレス
を記憶するだけで配列要素にアクセスできるのか、そして
C++ではdelete [] p でどうしてメモリが正しく解放できるのか?
そこを理解できるかどうかだろう。
0896デフォルトの名無しさん
2012/12/24(月) 07:20:26.19常識だろw
0897デフォルトの名無しさん
2012/12/24(月) 08:57:23.890898デフォルトの名無しさん
2012/12/24(月) 12:49:21.65> ポインタはアドレスを記憶する変数だ。
ちがうな。整数は変数じゃないだろ。
ポインタ変数がアドレスを記憶する変数だ。
0899デフォルトの名無しさん
2012/12/24(月) 14:24:41.03int **s;とか何のことかさっぱり。
それに二次元配列やら構造体やら関わってくるとカオス。
0900デフォルトの名無しさん
2012/12/24(月) 16:56:25.73箱では破綻するとかいうやつはちゃんと理解してないやつ
0901デフォルトの名無しさん
2012/12/24(月) 17:24:11.05中途半端に抽象化されてるとこから教えても
初心者には理解しづらいし用途も分からない
0902デフォルトの名無しさん
2012/12/24(月) 19:19:46.25オレは類似でバケツがいいんじゃないかと思ってる。
水のかさが変数のバリュー。
配列の説明はいいけど、ポインタの説明は難しいな。
C++になったら、ポインタより参照だし、ナマのポインタってライブラリ書かないと使わないしなぁ。
0903デフォルトの名無しさん
2012/12/24(月) 20:15:18.18箱に荷物が入っているのが普通の変数。
荷物の置いてある場所を書いたメモが入ってるのがポインタ。
0904デフォルトの名無しさん
2012/12/24(月) 21:54:47.47データ型という高級言語の概念がごっちゃに
なっている無茶な言語。
実用的な高級言語がCしかなかった時代はとうに過ぎており、
組み込み系の仕事をする人、処理速度が必要なアプリを
開発する人、言語研究者など以外は、今からCを学ぶ必要は
ないと言える。
0905デフォルトの名無しさん
2012/12/24(月) 23:41:16.320906デフォルトの名無しさん
2012/12/25(火) 00:26:21.94つまずいてる人は時間を無駄にしたくなければ、こんな欠陥言語捨ててアセンブラやるべき
0907デフォルトの名無しさん
2012/12/25(火) 00:48:15.430908デフォルトの名無しさん
2012/12/25(火) 01:16:41.40キチンとポインタとして動作していれば、メモリアドレスと対応しない実装でも問題ない。
>>893でも書いたが、同じ表記が左辺値と右辺値で参照レベルが一つずれるのを無意識に使っているのに、
ポインタが出た時点で急に参照レベルを意識させられるから混乱するのだろう。
a=a+1;
最初のaは変数という入れ物、次のaは変数aの中身の値を意味している。
変数名と変数の中身という使い分けを無意識にやっているわけ。
0909デフォルトの名無しさん
2012/12/25(火) 02:25:49.18理由もなく漠然とCを学びたいって人だろうから
回れ右してポインタのない言語に行くことを勧める。
変数に*や[]を付けたり外したりして参照レベルを
切り替えるような言語には手を出すな。
一つの言語をマスターできなかったことは口惜しいだろうが
それで世の中の誰が困るわけでもない。割り切れ。
0910デフォルトの名無しさん
2012/12/25(火) 08:44:15.82そんなもんだよ
0911デフォルトの名無しさん
2012/12/25(火) 09:51:37.32変数名はメモリのある位置を指し示すショートカットのような物だと思えばよい。
もしこのメモリの中身にもショートカットが入っていたら、それがポインタだ。
そのショートカットが指し示す先にもショートカットが入っていたら、それがポインタのポインタだ。
0912デフォルトの名無しさん
2012/12/25(火) 10:06:00.20たしかに右辺に*が来て、デリファレンスして使うのはイメージしやすいが、
左辺に*付きできて、そこに代入する、ってところは確かに一瞬不安になる。
0913デフォルトの名無しさん
2012/12/25(火) 12:58:53.35アナルに指突っ込むと気持ちいいだろ?
違う世界に行けるだろ?
そういう意味合いでこの記号が使われてるんだよ
0914デフォルトの名無しさん
2012/12/25(火) 13:18:59.06だがCのポインタが本質の理解を妨げる害悪であることは確かだ。
入門者にCを勧めるやつは地獄に落ちろ。
0915デフォルトの名無しさん
2012/12/25(火) 13:27:33.410916デフォルトの名無しさん
2012/12/25(火) 22:36:29.410917デフォルトの名無しさん
2012/12/26(水) 01:29:03.50A=$A;"hogehoge"
みたいに、明示的に変数の中身を取るという演算子を要求される。
あるいはTclでもいい。
値のイレモノの中身を見るには何らかの操作がいると認識させれば1段階クリア。
0918デフォルトの名無しさん
2012/12/26(水) 02:50:56.93>407 >419 >605 >697 >901 >906 >916 のいうとおりかもしれない
0919デフォルトの名無しさん
2012/12/26(水) 02:53:52.620920デフォルトの名無しさん
2012/12/26(水) 07:13:41.04こんな簡単なの人に教えてもらうなよグズw
int f(void *&arg);
このarg ってなんだ?
0922デフォルトの名無しさん
2012/12/26(水) 15:30:57.05引数書き換える方法でGO でもポインタ渡しにしたくないので参照渡しで
0923デフォルトの名無しさん
2012/12/26(水) 16:56:06.730924デフォルトの名無しさん
2012/12/26(水) 19:50:05.000925デフォルトの名無しさん
2012/12/26(水) 20:29:47.400926デフォルトの名無しさん
2012/12/27(木) 02:09:48.92見張ってるから見つかるんだよ
0927デフォルトの名無しさん
2012/12/27(木) 08:31:02.19それを「投影機制」と言います
0928デフォルトの名無しさん
2012/12/27(木) 09:08:37.550929デフォルトの名無しさん
2012/12/27(木) 11:20:03.60デタラメ
それに医師でもないのに他人に病名を付けるのは医師法違反
0930デフォルトの名無しさん
2012/12/27(木) 11:52:55.84その仮引数名をaugと名付けたのはお前だろw
お前が答えられるはずだ
0931デフォルトの名無しさん
2012/12/27(木) 20:15:32.61見張ってないのにどうやって見つけるのさ
まさか偶然ググって飛んできたとか言わないよね
0932デフォルトの名無しさん
2012/12/27(木) 20:50:43.32見えるだろうが
アホか
0933デフォルトの名無しさん
2012/12/27(木) 21:26:44.75それを見張ると言うのだよ
0934デフォルトの名無しさん
2012/12/27(木) 22:11:35.60もしかしてチョン?
0935デフォルトの名無しさん
2012/12/28(金) 04:33:12.520936デフォルトの名無しさん
2012/12/28(金) 10:56:12.890937デフォルトの名無しさん
2012/12/28(金) 10:59:32.980938デフォルトの名無しさん
2012/12/28(金) 11:55:31.29その対象へのポインタと値を保存しておいて定期的に比較します。
対象のポインタがスタックにあるような場合にはスコープアウトにも気を使います。
0939デフォルトの名無しさん
2012/12/29(土) 11:47:48.23なお今でも被害者続出中
0940デフォルトの名無しさん
2012/12/29(土) 12:52:32.32アセンブラの代替言語として最初から開発されたんだからポインタを入れてガリガリに
使うのは既定路線だった
0941デフォルトの名無しさん
2013/01/09(水) 07:14:31.73猿でもわかるぞw
0942デフォルトの名無しさん
2013/01/09(水) 08:30:50.630943デフォルトの名無しさん
2013/01/09(水) 10:21:00.600944デフォルトの名無しさん
2013/01/09(水) 12:49:00.69「配列とポインタの違いは?」
バカ「同じだよそんなこともわかんないのか低能wwwww」
「出直してこい猿」
0945デフォルトの名無しさん
2013/01/09(水) 12:57:52.14配列とポインタの違いは?w
0946デフォルトの名無しさん
2013/01/09(水) 18:27:03.400947デフォルトの名無しさん
2013/01/09(水) 18:43:44.40Cの文法を制限するだけで落ちこぼれがだいぶ減らせるかもね。
ポインタ経由の配列的アクセス禁止
(p[i] と書くな、*(p+i) と書け)
配列名のポインタ化禁止
(p = array と書くな、p = &array[0] と書け)
みたいな。
0948デフォルトの名無しさん
2013/01/09(水) 18:50:31.650949デフォルトの名無しさん
2013/01/09(水) 19:11:58.640950デフォルトの名無しさん
2013/01/09(水) 19:24:04.26そんなこざかしい事考えるなよw
配列は、データの集合を表す構造であり、
ポインタは、メモリのアドレスを格納し、そのアドレスへアクセスできるようになる変数だぞw
これ以上でも以下でもないw
ポインタの参照先アドレスにどういうデータを格納するかは、定義には関係ないww
0951デフォルトの名無しさん
2013/01/09(水) 19:40:49.73つけただけだからねぇ。
そもそもデータの集合とかそういう概念すらない。
0952デフォルトの名無しさん
2013/01/09(水) 19:56:05.84いくら本を読んでもわからないや。
ポインタのポインタって一体何なんだろう。
何のためにそんなものを使うんだろう。
蛇が自分のしっぽを飲み込んでしまう話、
クラインの壺、メビウスの輪…果てしないポインタの連鎖に
俺の脳は思考を停止する。
0953デフォルトの名無しさん
2013/01/09(水) 20:03:23.62まあ、配列をデータの集合と解釈するのも、
使う側のアプローチの問題でしかないからなw
配列が本質的に持ってるものではないな
0954デフォルトの名無しさん
2013/01/09(水) 22:20:38.53ポインタ変数を引数にとって確保した領域のアドレスを入れて返すときに要るだろ。
0955デフォルトの名無しさん
2013/01/10(木) 00:22:30.740956デフォルトの名無しさん
2013/01/10(木) 01:35:36.020957デフォルトの名無しさん
2013/01/10(木) 01:40:40.740958デフォルトの名無しさん
2013/01/10(木) 01:43:18.84間接参照のありがたみって、最近だとCPUパワーで吹き飛んでしまうからなぁ。
それでも、一歩上に行くんだったらできないと困るけど。
0959デフォルトの名無しさん
2013/01/10(木) 02:48:03.02艶っぽいんたー
0960デフォルトの名無しさん
2013/01/10(木) 07:37:04.260961デフォルトの名無しさん
2013/01/11(金) 11:41:01.710962デフォルトの名無しさん
2013/01/11(金) 20:45:02.36言語仕様が誤っている
0963デフォルトの名無しさん
2013/01/12(土) 13:04:17.95なぜポインタが必要なのかがわからないからだ
ポインタが必要な理由がわからないのは
40年も昔のチープな環境向けの苦し紛れの小細工であり現代では不要なものだからだ
博物館にでも並べるべき見事なテクニックの数々ではあるが
実用的な価値はほぼゼロ
零戦に乗って21世紀の戦争を戦うようなものだ
0964デフォルトの名無しさん
2013/01/12(土) 13:11:09.46メモリーマップドIOとかも時代遅れだしな〜。
0965デフォルトの名無しさん
2013/01/12(土) 14:11:19.71???
I/O 空間持ってるCPUの方が時代遅れで、汎化できてない糞CPUなんだが
0966デフォルトの名無しさん
2013/01/12(土) 14:13:39.26PC98とかあのへんを思い出しながら書いたんであんまり深い意味は無い。
ビデオメモリがメインメモリにマップされてたんだよな。確か。
0967デフォルトの名無しさん
2013/01/12(土) 14:23:17.83*&
0968デフォルトの名無しさん
2013/01/12(土) 17:58:58.11MC68000みたいなアドレス空間が最初から広いCPU向け。
0969デフォルトの名無しさん
2013/01/12(土) 18:26:52.59それのどこがメモリーマップドIO
0970デフォルトの名無しさん
2013/01/12(土) 20:22:26.99つうてもほとんど盲腸だろう
PC/ATでもPCI以降はメモリ空間の方にI/O持ってる板のほうが多いんでないかい
0971デフォルトの名無しさん
2013/01/13(日) 14:08:12.96うち メインメモリで使うのが 640kB、それ以外を適宜 I/Oに割り当て
権限のない領域の操作をCPUが弾いてくれるなら
I/O空間を分ける必要はないかなぁ
0972デフォルトの名無しさん
2013/01/13(日) 15:07:59.26残念だがx86はメモリマップドじゃない、9801も同じこと
i386〜ならIOを隔離することは可能だったはず
0974デフォルトの名無しさん
2013/01/13(日) 19:52:12.110975デフォルトの名無しさん
2013/01/13(日) 20:52:42.55IO空間が独立しているCPUでもメモリマップドで実装することもあるよ。
0976デフォルトの名無しさん
2013/01/14(月) 00:15:38.22たしか
A0000h - BFFFFh:VRAM
E0000h - E7FFFh:VRAM
F0000h - FFFFFh:BIOS
だったような気がするが、空いている所を適宜I/Oで埋めてくれ
0977デフォルトの名無しさん
2013/01/14(月) 02:19:04.70チップに接続してI/Oのアドレス空間を別に持つかってだけの話。
もちろんI/O専用チップを使っていてもメモリマップドにすることは
できる。
だが一般論としてx86 PC(の16bitモード)はメモリマップドI/Oとは
言わない。
0978デフォルトの名無しさん
2013/01/14(月) 07:42:37.97死ねやお前らw
0979デフォルトの名無しさん
2013/01/14(月) 12:03:06.500980デフォルトの名無しさん
2013/01/14(月) 18:21:36.410981デフォルトの名無しさん
2013/01/14(月) 23:02:21.70に対する話なので、誰もそういう事は言っていない
0982デフォルトの名無しさん
2013/01/15(火) 00:02:33.980983デフォルトの名無しさん
2013/01/15(火) 01:17:13.910984デフォルトの名無しさん
2013/01/15(火) 06:24:03.86ビデオメモリがメインメモリにマップされてたんだよな。確か。
0985デフォルトの名無しさん
2013/01/15(火) 06:45:55.72何で蒸し返した。
0986デフォルトの名無しさん
2013/01/15(火) 07:24:16.550987デフォルトの名無しさん
2013/01/15(火) 10:49:10.630988デフォルトの名無しさん
2013/01/15(火) 12:13:49.540989デフォルトの名無しさん
2013/01/15(火) 12:41:31.40次はマ板でどうぞ
0990デフォルトの名無しさん
2013/01/15(火) 16:03:40.560991デフォルトの名無しさん
2013/01/15(火) 19:47:54.730992デフォルトの名無しさん
2013/01/15(火) 19:52:41.720993デフォルトの名無しさん
2013/01/15(火) 23:19:28.350994デフォルトの名無しさん
2013/01/15(火) 23:57:12.410996デフォルトの名無しさん
2013/01/16(水) 00:30:56.350997デフォルトの名無しさん
2013/01/16(水) 00:33:37.650998デフォルトの名無しさん
2013/01/16(水) 01:17:41.730999デフォルトの名無しさん
2013/01/16(水) 01:19:07.651000片山博文MZパンク ◆0lBZNi.Q7evd
2013/01/16(水) 01:20:45.4610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。