ポインタを難しいと言う奴が理解できない
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/07/27(日) 10:47:14int * p = &i;//int型ポインタpにiのアドレスを代入する
簡単。
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。
0002デフォルトの名無しさん
2008/07/27(日) 10:52:495ポイント
0003デフォルトの名無しさん
2008/07/27(日) 10:52:54str2 = "別の文字列"; //OK
上と下どっちを使うか状況によって異なる。
同じとかいってしまっているお前は、結局何も理解出来ていない。
0004デフォルトの名無しさん
2008/07/27(日) 11:03:14puts(">>1は天才");
else
puts(">>1は愚か者");
0005デフォルトの名無しさん
2008/07/27(日) 11:20:52つ、釣られないぞ!
0006デフォルトの名無しさん
2008/07/27(日) 11:25:57かけ算と紛らわしいので嫌い
0007デフォルトの名無しさん
2008/07/27(日) 11:28:070008デフォルトの名無しさん
2008/07/27(日) 11:47:270009デフォルトの名無しさん
2008/07/27(日) 11:54:39*(s+5)
s[5] (⇒ Compile時に*(s+5)に変換される)
5[s] (⇒ Compile時に*(s+5)に変換される)
は全部同じ意味だから当たり前だろ。
0010デフォルトの名無しさん
2008/07/27(日) 11:59:120011デフォルトの名無しさん
2008/07/27(日) 12:04:28構造体とポインタの絡みくらいは理解しておく必要がある。
これを理解しておかないとWindowsプログラミングの入門書すら読めない。
しかし今は良書が揃っているので馬鹿でなければ2〜3週間で習得できるだろう。
「C言語 ポインタ完全制覇」
(言わずと知れたポインタのバイブル。これを読めば99.9%の人はポインタが得意になる。Amazonでも2chでも類を見ない程の高評価。)
http://www.amazon.co.jp/review/product/4774111422/
「C言語ポインタが理解できない理由」
(人によって好き嫌いがあるが、気軽に読める)
http://www.amazon.co.jp/review/product/4774114316
他
0012デフォルトの名無しさん
2008/07/27(日) 12:05:52はずれはお前の頭だ
0013デフォルトの名無しさん
2008/07/27(日) 12:08:340014デフォルトの名無しさん
2008/07/27(日) 12:09:480015デフォルトの名無しさん
2008/07/27(日) 12:13:01char *const str2 = "abcde";
これならよかったのに
0016デフォルトの名無しさん
2008/07/27(日) 12:17:00char (*p)[6] = &str1; // OK
char (*p)[6] = &str2; // Error
if (sizeof str1 == sizeof str2) {
puts("same");
} else {
puts("different"); // こっちが出力される
}
0017デフォルトの名無しさん
2008/07/27(日) 12:19:34str2[0] = 'A'; // 未定義動作
これもだな。
0018デフォルトの名無しさん
2008/07/27(日) 12:24:26str1は実体を持つ(char*6 = 6byte)
"abcde"は定数でメモリのナンチャラ領域に密かに存在したまま。
0019デフォルトの名無しさん
2008/07/27(日) 12:26:530020デフォルトの名無しさん
2008/07/27(日) 12:28:310021デフォルトの名無しさん
2008/07/27(日) 12:29:482.str1の指す領域は変更可能で、str2に関しては未定義。
って感じ?
0022デフォルトの名無しさん
2008/07/27(日) 14:42:45ポインタは理解できる。
がしかし、
ポインタのポインタが出てくるともう俺の頭はオーバーヒートしてしまう。
すんませんVBしか触ったことがないもので。
0023デフォルトの名無しさん
2008/07/27(日) 15:05:01>>11の本を買って視覚的に学んだほうが早い
0024デフォルトの名無しさん
2008/07/27(日) 15:10:210025デフォルトの名無しさん
2008/07/27(日) 15:44:48ポインタはどうやって学ぶべきか
http://pc11.2ch.net/test/read.cgi/tech/1193166476/l50
0026デフォルトの名無しさん
2008/07/27(日) 17:48:22そうでもない
ポインタはどうやって学ぶべきか part2
http://pc11.2ch.net/test/read.cgi/tech/1217147291/
0027デフォルトの名無しさん
2008/07/27(日) 20:26:10ポインタが理解できているという言葉も怪しいな。
0028デフォルトの名無しさん
2008/07/27(日) 22:12:42大抵ポインタは配列の表現を変えた物と認識している
で、ポインタのポインタ=二次元の配列と考えてしまい混乱する
0029デフォルトの名無しさん
2008/07/27(日) 22:47:46mov eax,esi
と
mov eax,[esi]
の違いがわからないのと一緒。
この違いがわかればポインターが難しいはずがない。
0030デフォルトの名無しさん
2008/07/27(日) 22:51:400031デフォルトの名無しさん
2008/07/27(日) 22:55:39ポインタが分かる・分からないという話自体、ど素人が好む話題だから
0032デフォルトの名無しさん
2008/07/27(日) 23:48:03・どういう場合にどういう風にポインタを使うべきなのか
この二点を誰も説明してくれないんだよなあ。
山ほど解説書を買ったけど、前者について解説している本は皆無。
後者については、関数の引数を参照渡しして直接更新して返す
サンプルくらいしかない。
これで理解して使えという方が無理だ。
0033デフォルトの名無しさん
2008/07/28(月) 00:01:19そう、だから理解しないでなんとなくコード書いて、
そのうちなんとなくみんな分かってきた気になるというのが現状。
悩んでいる暇があったらとりあえず何か書いてみ。
0034デフォルトの名無しさん
2008/07/28(月) 00:19:34いや、俺は理論から入る人間だから
使う必要性を理解してからでないと使いたくないんだ。
ただ一つ、最近の本で「配列とポインタではポインタの方が
実行速度が速い」という記述を読んだ。
これだよこれ。こういうのをなぜ一番に言わないかね。
初心者は、同じことを配列でできるのに、なぜわざわざポインタを
使うのか、そのことで悩んでるんだから。
「配列とポインタはやってることは同じだけどポインタの方が速い」
この一言だけでポインタを使う理由になるじゃないの。
0035デフォルトの名無しさん
2008/07/28(月) 00:31:32俺も理論から入る人間だからこそ言える。
たぶんそういう考えの俺らはPG/SE/PMには向いてないよ。
0036デフォルトの名無しさん
2008/07/28(月) 00:33:24必要有か無か、流行るか流行らないか、の判断も付かないうちから、最新技術に興味を示す。
0037デフォルトの名無しさん
2008/07/28(月) 00:34:15配列とポインタでは配列のほうが実行速度が速い
0038デフォルトの名無しさん
2008/07/28(月) 00:37:12プログラムなんてどんな言語で作られたモノであろうと結局はCPUがメモリのアドレスを行ったり来たりしている。
隠蔽されてないアセンブラ・Cが速いのは当たり前。
勿論、零細企業で小規模システムの開発しかしていない人にとってはJavaどころかVBでも十分
0039デフォルトの名無しさん
2008/07/28(月) 00:38:130040デフォルトの名無しさん
2008/07/28(月) 01:04:180041デフォルトの名無しさん
2008/07/28(月) 01:15:48もっと紛れのない文法の高級アセンブラが普及すべきだった
0042デフォルトの名無しさん
2008/07/28(月) 01:28:28書いてないようなら捨ててしまえ。
0043デフォルトの名無しさん
2008/07/28(月) 02:17:17>>41もいってるが文法がクソなだけ。
先にポインタの概念を取得してからCに入れば
表現の違いでしかないんだけどな。
0044デフォルトの名無しさん
2008/07/28(月) 02:25:06やっぱプログラミングの入門書には
データ構造の話とかも書くべきだよな。
>>34
ちょwwwwwwwwwwそんな理由www
0045デフォルトの名無しさん
2008/07/28(月) 04:56:20それが事実じゃないからさ
ポインタと配列は別物であり、使える場所も変わってくる
例えば関数の引数として使えるのはポインタだけで
配列使ってるように見えるのは見せ掛けで実はポインタ使ってるとか
そういう細かい事実があるわけ
今の処理系じゃポインタの方が速いなんてことも別にないし
0046デフォルトの名無しさん
2008/07/28(月) 07:36:31ハァ?
メモリ上の配列とポインタの事言ってんだったら変わらねーよ。
例え配列がスタックで、ポインタの方をヒープのつもりで発言してても、
確保に時間が掛かるだけで、アクセス速度は変わらん。
0047デフォルトの名無しさん
2008/07/28(月) 07:57:28まー配列の方が当たりをつけやすい場面が多いとはおもうけど
それをもって速いってのもなぁ。
0048デフォルトの名無しさん
2008/07/28(月) 08:01:370049デフォルトの名無しさん
2008/07/28(月) 08:02:33→できないのかな?
0050デフォルトの名無しさん
2008/07/28(月) 08:18:57メモリアドレスを意識できなくちゃいけないしな。
ポインタ自体の演算や型キャストもできるわけだし
高級言語にくらべたら無法に近い。
>>48
一見関係ないように思えるけど……。
0051デフォルトの名無しさん
2008/07/28(月) 08:21:03malloc関数で動的にメモリを確保して使う場合と
scanf関数の引数だろ。
これ以外でポインタを使う香具師はDQN。
0052デフォルトの名無しさん
2008/07/28(月) 09:20:26機械語レベルの話だから別にいいよ
説明する気もないし
0053デフォルトの名無しさん
2008/07/28(月) 09:34:29>>29にたどり着く。
0054デフォルトの名無しさん
2008/07/28(月) 10:04:59| | | | | | | | | | || | |
| | | レ | | | | | J || | |
| | | J | | | し || | |
| レ | | レ| || J |
J し | | || J
| し J|
J レ
/V\
/◎;;;,;,,,,ヽ
_ ム::::(l|l゚Д゚)| …うわぁ
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
0055デフォルトの名無しさん
2008/07/28(月) 10:17:480056デフォルトの名無しさん
2008/07/28(月) 10:27:07× 説明する気もないし
○ 説明する能力もないし
0057デフォルトの名無しさん
2008/07/28(月) 10:32:512. 構造体を関数にコピーレスで渡したい際にどうしても必要
3. 別関数内の変数の値を変更したい際にどうしても必要
4. メモリを動的に確保する際にどうしても必要
5. 特殊なデータ構造を実現する際にどうしても必要
ポインタがどうしても必要になるケースは、普通はこのくらいかね。
他にも使う状況はなくはないと思うが。
0058デフォルトの名無しさん
2008/07/28(月) 11:07:44煽っても何もでないよ
0059コピペ
2008/07/28(月) 11:11:54void func(char c){
c = 'z';
}
int main(){
char subarac = 'a';
func(subarac);
printf("%c",subarac);
}
mainの人「'a'って書いた紙を渡すよ」
func作業員「じゃあそれをコピーして使いますね」
mainの人「なんでんなことすんだよそのまま使えよ」
func作業員「コピーしたのをzと書き換えました」
mainの人「じゃあくれ」
func作業員「これはあなたのものではなく私たち作業員のものです、渡せません」
mainの人「結果、手元にあるaと書かれた紙が表示されるのであっためでたしめでたし」
0060デフォルトの名無しさん
2008/07/28(月) 11:27:13c = 'z';
}
int main(){
char subarac = 'a';
func(subarac);
printf("%c",subarac);
}
この場合を教えてくれ
0061デフォルトの名無しさん
2008/07/28(月) 11:29:54ひと目で間違いに気づかないとか、もうね…
0063デフォルトの名無しさん
2008/07/28(月) 11:48:37好きなところに移動してデータを置ける。
開けた先がお風呂だと大変なことになる。
0064デフォルトの名無しさん
2008/07/28(月) 12:12:38お風呂が溢れちゃいますね。
0065,,・´∀`・,,)っ
2008/07/28(月) 12:20:57コンパイルエラー
006660
2008/07/28(月) 12:53:55PPP.C(2) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'int' で異なって
います。
PPP.C(6) : warning C4047: '関数' : 間接参照のレベルが 'char *' と 'char' で異な
っています。
PPP.C(6) : warning C4024: 'func' : の型が 1 の仮引数および実引数と異なります。
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
/out:PPP.exe
PPP.obj
0067デフォルトの名無しさん
2008/07/28(月) 13:17:34おお、いいね。
これを五つの章構成にして
実例とともに詳細解説を加えれば
画期的なポインタの解説書になるよ。
たぶん、今までこういう本はなかったよ。
本を出したら俺は印税の一割でいいよ。
0068デフォルトの名無しさん
2008/07/28(月) 13:24:02可変個引数で渡せる
0069デフォルトの名無しさん
2008/07/28(月) 13:33:44p[i]というのは*(p+i)でしかないのだから。
# だからこそi[p]という書き方もできるわけで、3["abcd"]なんてこともできると。
0070デフォルトの名無しさん
2008/07/28(月) 13:34:48気づかない奴もいるかも知れない。
0071デフォルトの名無しさん
2008/07/28(月) 13:38:560072デフォルトの名無しさん
2008/07/28(月) 13:41:340073デフォルトの名無しさん
2008/07/28(月) 13:49:320074デフォルトの名無しさん
2008/07/28(月) 13:51:02char func(char c);
int main(void)
{
char subarac = 'A';
subarac = func(subarac);
printf("%c\n",subarac);
return 0;
}
char func(char c)
{
c = 'Z';
return c;
}
>>59先生できました\n
0075デフォルトの名無しさん
2008/07/28(月) 13:57:23だと長さが5の配列の実体が出来ると思ってたんだけど違うのか?
char *str2 = "abcde";
だとリテラル"abcde"のアドレスをstr2に代入すると思ってたんだけど違うのか?
0076デフォルトの名無しさん
2008/07/28(月) 13:58:47>だと長さが5の配列の実体が出来ると思ってたんだけど違うのか?
違う。長さは6。
>char *str2 = "abcde";
>だとリテラル"abcde"のアドレスをstr2に代入すると思ってたんだけど違うのか?
あってる。
0077,,・´∀`・,,)っ
2008/07/28(月) 13:59:35いいや
配列p[]を *(p+i)でアクセスするのは無理だろ
0078デフォルトの名無しさん
2008/07/28(月) 14:08:47自信満々に書く前に、ちょっと確認してみたら?
#include <stdio.h>
int main()
{
int i = 3;
int p[] = {1, 2, 3, 4, };
printf("%d\n", *(p + i));
printf("%d\n", i[p]);
return 0;
}
0079デフォルトの名無しさん
2008/07/28(月) 14:12:55なんで長さが5なの?
0080デフォルトの名無しさん
2008/07/28(月) 14:25:110081デフォルトの名無しさん
2008/07/28(月) 14:30:490082デフォルトの名無しさん
2008/07/28(月) 14:52:49あと、できればスタックとヒープの違いぐらいは理解して欲しいけど。
そもそもC言語の場合、スタックにたくさん積みたくない→ポインタの概念導入、っていう流れの気がする。
0083,,・´∀`・,,)っ
2008/07/28(月) 15:11:47すまぬ
だがこういうのよく使わないかな?
sizeof (a) /sizeof (a[0])
ポインタと配列混同すると痛い目にあう例だが
0084デフォルトの名無しさん
2008/07/28(月) 15:24:41のつながりがよくわからないです
0085デフォルトの名無しさん
2008/07/28(月) 15:31:52配列とポインタの区別がよくできていないことが判りますね。
int main()
{
short i;
short a[3];
short * p;
printf("%u, %u\n%u, %u, %u, %u\n%u, %u, %u, %u\n",
sizeof(i), sizeof(& i),
sizeof(a), sizeof(* a), sizeof(a[0]), sizeof(& a),
sizeof(p), sizeof(* p), sizeof(p[0]), sizeof(& p));
return 0;
}
0086デフォルトの名無しさん
2008/07/28(月) 15:44:43short (*pa)[3] = a;
0087デフォルトの名無しさん
2008/07/28(月) 20:14:21(コンパイラだかリンカだかの制約でスタックには○○MBしか積めないルール)
他の言語でも同じなんですか??
Java,VB,Ruby
0088デフォルトの名無しさん
2008/07/28(月) 20:18:51そんな危険な宣言すんなよ。
0089デフォルトの名無しさん
2008/07/28(月) 20:20:33仮想メモリとして扱う処理系もあるし、そのエラーと言うのは全部の処理系で確認した?
0090デフォルトの名無しさん
2008/07/28(月) 20:21:29>C言語でint[100000000000000]とかにしちゃうとエラーになるんですけど
sizeof(int) が4だとして、300テラバイトを超えるメモリを割り当てられる処理系が思いつかない。
0091デフォルトの名無しさん
2008/07/28(月) 20:21:58$ ./a
2, 4
6, 2, 2, 4
4, 2, 2, 4
ところで
short *ponta = a;
とやってもsizeof(ponta)は4byteでしかない。
aを使わずにqが指すshort配列の大きさを調べることはできないの?
0092デフォルトの名無しさん
2008/07/28(月) 20:22:49と
ポインタの配列
の違いと宣言文法が分からない。
0093デフォルトの名無しさん
2008/07/28(月) 20:24:31>aを使わずにqが指すshort配列の大きさを調べることはできないの?
aを使わずにpontaが指すshort配列の大きさを調べることはできないの?
0094デフォルトの名無しさん
2008/07/28(月) 20:26:41int[200万]あたりでエラーになる。メモリは6GB積んでるのに
0095デフォルトの名無しさん
2008/07/28(月) 20:28:44アホか
それはポインタの配列だろ
0096デフォルトの名無しさん
2008/07/28(月) 20:37:57short (*p2a)[X]; // p2aは short[X] を指すポインタ
short *(p2a[X]); // p2a[X] は short を指すポインタ
short *p2a[X]; // 同上
>>93
不可能。
>>94
その配列が静的か動的かによって違う。
つか、6GB積んでたって全部1プロセスで使えるとも限らん。
>>95
1から勉強し直せ。
0097デフォルトの名無しさん
2008/07/28(月) 21:15:46結局ポインタの配列ってのは?
0098デフォルトの名無しさん
2008/07/28(月) 21:31:54[アドレス][アドレス][アドレス][アドレス]・・・
と言う風にアドレス空間にポインタの配列が確保されていて、アドレスが入っている。
・配列のアドレス
アドレス
↓
[データ][データ][データ][データ][データ]・・・
配列の先頭アドレス。インクリメント時にサイズだけインクリメントされる。
・配列のアドレスを保持するポインタ
ポインタ
↓
[アドレス]
↓
[データ][データ][データ][データ][データ]・・・
これが
(*p)[i];
だと思う。「配列のアドレス」を略して「配列」って呼ぶのはちょっとどうかなと思う。
わかりにくい。
0099デフォルトの名無しさん
2008/07/28(月) 21:33:21int i, *p, *a;
・・・
p = a + i;
って書き方はしないようにしてる。
int i, *p, *a;
・・・
p = &a[i];
って書くようにしてる。
理由は俺がアホで理解しにくいから、
0100デフォルトの名無しさん
2008/07/28(月) 21:34:04char charray[10];
ポインタといっても変数なので、他の型と同じように配列を宣言して使うことができます。
char *chr_ptr[10]; (char* chr_ptr[10];でもいい)
2次元配列のことをポインタの配列だという人がたまにいますが、ちょっと違います。
ポインタの配列は2次元配列などではなくあくまでもポインタ変数の配列で、上のように宣言したものは1次元配列です。
メモリの確保のされ方からいって、2次元配列とポインタ配列は全く違うものです。
0101デフォルトの名無しさん
2008/07/28(月) 21:35:580102デフォルトの名無しさん
2008/07/28(月) 21:37:330103デフォルトの名無しさん
2008/07/28(月) 21:41:120104デフォルトの名無しさん
2008/07/28(月) 21:45:46ポインタはどうやって学ぶべきか
http://pc11.2ch.net/test/read.cgi/tech/1193166476/l50
ポインタはどうやって学ぶべきか part2
http://pc11.2ch.net/test/read.cgi/tech/1217147291/l50
ポインタ死ねよ。
http://pc11.2ch.net/test/read.cgi/tech/1171172537/l50
0105デフォルトの名無しさん
2008/07/28(月) 21:46:070106デフォルトの名無しさん
2008/07/28(月) 21:48:53167 :デフォルトの名無しさん:2007/11/03(土) 14:30:24
>>157
char **p;
と書いて配列へのポインタと解釈することなんてありえるか?
配列へのポインタといったら
char (*p)[N];
じゃないのか?
168 :デフォルトの名無しさん:2007/11/03(土) 14:31:55
>>167
int main(int argc, char **argv)
170 :デフォルトの名無しさん:2007/11/03(土) 14:32:48
>>168
それはポインタの配列
0107デフォルトの名無しさん
2008/07/28(月) 21:51:27(intへのポインタ)の配列
int* ponta[10];
(int配列)へのポインタ
int(* ponta)[10];
0108デフォルトの名無しさん
2008/07/28(月) 21:52:51int* ponta;
??
int(* ponta);
0109デフォルトの名無しさん
2008/07/28(月) 21:56:49特にメモリ上でどう表現されるかについて考えるといい。
(a) 3つの int[5] からなる配列 int a[3][5]
(b) 3つの int* からなる配列 int* a[3]
(c) int[5] へのポインタ int (*a)[5]
(a) と (b) は似たようにアクセスできるかもしれないが全くの別物。
(a) から (c) に自動変換が効くのは一般の配列の場合と同様。
0110デフォルトの名無しさん
2008/07/28(月) 21:58:34**argv は文字列配列の先頭アドレスが確保されている配列の先頭アドレスのポインタ。
言い換えると文字列群の各文字列の先頭へのアドレスが配列で保持されていて、その配列の先頭アドレス。
"test"
"yaruo"
"bararaika"
と文字列があったら、 "test"の "t" のアドレス、"yaruo" の "y" のアドレス、 "baranaio" の "b" のアドレス
が
[アドレス][アドレス][アドレス]
と言う風に格納されていて、その一番最初のアドレスが argv。
要するに、
argv が指すアドレス
↓
[アドレス][アドレス][アドレス]
↓ ↓ ↓
"test" "yaruo" "bararaika"
ってなってる。
0111デフォルトの名無しさん
2008/07/28(月) 21:59:02里佳石井素股
0112デフォルトの名無しさん
2008/07/28(月) 22:14:16>**argv は文字列配列の先頭アドレスが確保されている配列の先頭アドレスのポインタ。
文字列配列じゃなくて、文字列または文字配列じゃね?
「文字列群」が文字列配列であるかはどうかは**argvには関係ねぃし。
0113デフォルトの名無しさん
2008/07/28(月) 22:21:44ポインタの配列なのだが、
星が二つついてるのだからあくまで
ポインタのポインタと理解しなければならない。
0114デフォルトの名無しさん
2008/07/28(月) 23:15:58この書き方が好きだ
0115デフォルトの名無しさん
2008/07/28(月) 23:25:43書けるのは「配列の名前」で、それは配列の実体へのポインタをそう呼んでいるだけ。
char a[128]; というときの a 自体は配列ではない。a は「配列の名前」で、それは [128] という配列実体へのポインタ。
その a へのポインタは、char (*a)[128];
0116デフォルトの名無しさん
2008/07/29(火) 01:27:340117デフォルトの名無しさん
2008/07/29(火) 01:56:11シンタクス・シュガーではなく、
シンタクス・ビターになっとる。
0118デフォルトの名無しさん
2008/07/29(火) 01:59:280119デフォルトの名無しさん
2008/07/29(火) 01:59:30[]も*も同じだと思えばいいんだよ。そのうち違いが分かってくるさ。
0120デフォルトの名無しさん
2008/07/29(火) 06:53:10俺は改めてコの業界の糞さを思い知らされた。
>>115
自慢げに適当な嘘並べるな。
オブジェクト「a」そのものは配列であり、その右辺値が「配列の先頭を指すポインタ」になるだけだ。
0121デフォルトの名無しさん
2008/07/29(火) 07:17:112ちゃんに書き込む人間はみんな糞ですがなにか?
オレモナー
0122デフォルトの名無しさん
2008/07/29(火) 12:06:30いまだにここが分からない
ポインタに何故文字列を代入できるの?
0123デフォルトの名無しさん
2008/07/29(火) 12:09:35"abcde"はconstな文字列(≒char配列)ですが、右辺値はconstな文字列へのポインタになります。従って、代入できるわけです。
char foo[] = "abcde"した後、char * p = fooと言うように代入できるのと同じことです。
0124デフォルトの名無しさん
2008/07/29(火) 12:41:40それは文字列の書かれてる場所を教えてるだけ。
文字列自体は別にある。
だからその後に str2 = NULL; なんてやったら、"abcde" のありかは永久に失われる。
0125デフォルトの名無しさん
2008/07/29(火) 12:50:00の"abcde"はstaticな感じって言えばいいのかな?
constな無名変数とでも言うか
0126デフォルトの名無しさん
2008/07/29(火) 13:31:55たとえば、右辺に"abcde"を書くということは、
あるアドレス(仮にXとする)に対して、
Xにaの文字コード97をセット
X+1にbの文字コード98をセット
X+2にcの文字コード99をセット
X+3にdの文字コード100をセット
X+4にeの文字コード101をセット
X+5に0をセット
以上を行って、左辺にXを渡している
上の例だと、*(str+3)をintにでもキャストして眺めると、100が入ってるはず
この領域は変更付加
その意味ではstaticだけど、配列の宣言と一緒にやった場合は例外
詳しくは、「文字列リテラルの変更」でググると解説が
0127デフォルトの名無しさん
2008/07/29(火) 13:44:37どちらで宣言するかで、動作が変わる
具体的に言うと、sizeof()の動作が、ポインタの場合はポインタのサイズ(通常は4)を返すが、
配列の場合は使用バイト数を返す
混乱のもとは、[]記号が、宣言、右辺値、左辺値、それぞれのケースで意味が微妙に違うところ
整理してないと、すぐわからなくなる
0128デフォルトの名無しさん
2008/07/29(火) 13:50:45一言で言い表せないよねなかなか
0129デフォルトの名無しさん
2008/07/29(火) 16:30:04こういう表現って普通に使います?
おいら使ったことないんだけど。
0130デフォルトの名無しさん
2008/07/29(火) 16:33:520131デフォルトの名無しさん
2008/07/29(火) 16:37:360132デフォルトの名無しさん
2008/07/29(火) 16:39:59使う時にキャストするから。
0133デフォルトの名無しさん
2008/07/29(火) 17:47:59横WIDTH個、縦HEIGHT個の長方形のchar配列を動的に確保したい時、
char (*tbl)[WIDTH] = malloc(sizeof(char)*WIDTH*HEIGHT);
とかやる。
tbl[y][x] = data;
とかいうふうにアクセスする。
>>130
論外
>>132
おまえだけ
0134デフォルトの名無しさん
2008/07/29(火) 17:53:27char * tbl = malloc(WIDTH * HEIGHT)で確保して、
static inline unsigned offset(int width, int x, int y) {return x + y * width;}みたいな関数を用意して、
tbl[offset(WIDTH, x, y)] = dataと言う風にアクセスするかな。
0135デフォルトの名無しさん
2008/07/29(火) 19:18:00なるほどそういうことですか。ようやく意味がわかりました。
0136デフォルトの名無しさん
2008/07/29(火) 19:19:31まったく無責任な想像だが、メッセージ通信処理とかで使えそうかなぁ。
1個のチャンクが固定長でうんちゃらかんちゃらとか。まーよー知らんけど。
0137デフォルトの名無しさん
2008/07/29(火) 19:30:180138デフォルトの名無しさん
2008/07/29(火) 20:08:03現実問題としてポインタ周りで困ることはあんまりないな。
0139デフォルトの名無しさん
2008/07/29(火) 21:49:47って有ったとき、p++てやると、
pは4バイト移動するって考えると分かりやすいな。
0140デフォルトの名無しさん
2008/07/30(水) 09:42:39で、実際はそうはならないので混乱する、と。
でも混乱するのは理解が足りない所為だよ。
0141デフォルトの名無しさん
2008/07/30(水) 10:18:13処理を順次実行したい場合の関数ポインタの配列とか。
後は可読性を捨ててでも処理速度を稼ぎたい時とかかなぁ。
使わない方がコード的に遅くて長くても安全って場合の方が多いよなぁ。
特に複数人でコードを書く場合は。
0142デフォルトの名無しさん
2008/07/30(水) 13:05:372次元以上だったら最大値規定して最初から配列取るわ。
0143デフォルトの名無しさん
2008/07/30(水) 13:24:17それC99じゃないとWIDTHを変数にできないから困る。
できればやりたいんだけどね。
0144デフォルトの名無しさん
2008/07/30(水) 14:20:470145デフォルトの名無しさん
2008/07/30(水) 14:42:36#define TRF(sex) &sex
main(int itn, char PTA PTA)
{
int itn;
scanf("%d", TRF(itn));
write(itn, 4);
}
0146デフォルトの名無しさん
2008/08/01(金) 20:47:45int a[100] = { 1, 2, 3, 4, 5,・・・・,100 };
int *po;
po = a;
int cnt;
1)
for( cnt = 0 ; cnt < 100 ; cnt++ ){
0147デフォルトの名無しさん
2008/08/01(金) 20:54:15すいません。誤爆しました
0148デフォルトの名無しさん
2008/08/01(金) 21:24:47int *********************************a;
0149デフォルトの名無しさん
2008/08/02(土) 03:41:140150デフォルトの名無しさん
2008/08/02(土) 03:59:130151デフォルトの名無しさん
2008/08/02(土) 09:25:34それ自体はよくできているプログラムだし、公開されているインタフェースも
ちゃんとしていた。しかしまぁ、これを作った人(ベテランプログラマー)は
よく自分で理解できるもんだ、と素直に関心した。
0152デフォルトの名無しさん
2008/08/02(土) 11:03:570153デフォルトの名無しさん
2008/08/03(日) 00:55:510154デフォルトの名無しさん
2008/08/03(日) 06:29:000155デフォルトの名無しさん
2008/08/04(月) 12:13:42書いた本人はリタイアして該当コードは最初から書き直しになった。
0156デフォルトの名無しさん
2008/08/04(月) 12:50:32ルールが決まってて単純にそのルールを繰替えし適用するだけだから
機械にやらせた方が絶対安全
0157デフォルトの名無しさん
2008/08/05(火) 01:41:35何次元だろうとどうでもいいじゃん。
0158デフォルトの名無しさん
2008/08/05(火) 01:50:07小原積分計算する時に。
0159デフォルトの名無しさん
2008/08/05(火) 01:51:390160デフォルトの名無しさん
2008/08/05(火) 11:32:01ポインタにダブルだとかトリプルだとか属性があるような解釈の仕方をするから理解できないんじゃないの?
アスタリスクが並ぶのがいやならtypedefすればいいだけの話だし、そうしてしまえばただのポインタと同じことじゃないか。
0161デフォルトの名無しさん
2008/08/17(日) 11:40:50そういうのになってくると泣ける程複雑になる
こういうのってtypedef使ってもいいんだよね?
よくポインタの理解度を試すようなクイズで「typedefを使わずに」とかあるけど、
日常的に使っててもできる気がしないわ
0162デフォルトの名無しさん
2008/08/17(日) 11:45:54そういうクイズは無視でおkだと思う
0163デフォルトの名無しさん
2008/08/18(月) 10:52:16Cエキスパート:出来るけど見にくいからtypedef
なんちゃってプログラマ:出来ないからtypedef、人間コンパイラになる必要はないと言い訳
0164デフォルトの名無しさん
2008/08/18(月) 11:50:21型を抽象化するために使うべきだと思う。
0165デフォルトの名無しさん
2008/08/18(月) 23:01:110166デフォルトの名無しさん
2008/08/20(水) 12:54:58規格からルールを理解すれば少しは楽になるんだろうかね?
0167デフォルトの名無しさん
2008/08/20(水) 13:03:320168デフォルトの名無しさん
2008/08/20(水) 13:13:53読めなければそれが読めるようになるまで簡単な物から読んだり
パッチ作ったりしてオープンソースコミュニティに貢献してりゃ10年もすりゃ
今君が想像してる程度のエキスパートには楽になれる
って以前言われたことがある
0169デフォルトの名無しさん
2008/08/20(水) 20:50:49確かに俺がブラインドタッチできるように
なったのは、毎日PCをさわるようになって
10年くらい経ってからのような気がする。
人間、何事も10年は精進が必要なんだね。
0170デフォルトの名無しさん
2008/08/20(水) 20:51:550171デフォルトの名無しさん
2008/08/20(水) 21:00:020172デフォルトの名無しさん
2008/08/20(水) 21:09:59いや、10年くらいかかっても不思議じゃないと思うぜ。
人さし指タイピングから始めた俺は、タッチタイピングに切替えるだけでかなりの年月を費したが。
それでもまだブラインドタッチにはたどり着けない。
英語キーボードと日本語キーボードを行ったり来たりした日にはもう大変。
0173デフォルトの名無しさん
2008/08/20(水) 21:11:17どんな言語でも10年は使わなきゃほげほげって書いてたからだいたいあってると思う
0174デフォルトの名無しさん
2008/08/21(木) 15:14:41どうせ出力見ただけじゃ経過は見えないんだから
0175デフォルトの名無しさん
2008/08/23(土) 03:19:03運指が偏ってると年食ってからバネ指とか悪影響もあるから気をつけろ
0176デフォルトの名無しさん
2008/08/23(土) 10:16:240177デフォルトの名無しさん
2008/08/24(日) 02:44:08無理に使わなくていいと思うぞ。それを必要と感じる時が来たらそうすればいいんじゃないか。
0178デフォルトの名無しさん
2008/08/26(火) 11:35:40#define typedef_func_ptr(returntype, yobidasikiyaku ,functionname) \
returntype (yobidasikiyaku * functionname)
main()
{
typedef_func_ptr(int, WINAPI, ptrMessageBox)(HWND, LPSTR, LPSTR, UINT);
ptrMessageBox = MessageBox;
ptrMessageBox (NULL, "セクロス", "セクロス", MB_OK);
}
0179デフォルトの名無しさん
2008/09/07(日) 07:05:32っていうセンパイの言葉でわかった
0180デフォルトの名無しさん
2008/09/07(日) 10:13:02これ定説。
0181デフォルトの名無しさん
2008/09/07(日) 15:10:11これが基本ですね、マクロしかりテンプレートしかり各種ライブラリしかり
0182デフォルトの名無しさん
2008/09/07(日) 15:54:490183デフォルトの名無しさん
2008/09/07(日) 18:37:35図を描いてみればアホでもわかるだろ。描こうともしないでわからないとかほざく無能は氏ね。
構造を把握したうえで、「たぐりよせる」操作と「矢印を作る」操作がわかればあとは簡単。
0184デフォルトの名無しさん
2008/09/07(日) 20:09:49ところで、ポインタには型がある事をお忘れなく。
0185デフォルトの名無しさん
2008/09/08(月) 14:20:46例えを用いずに話して相手が理解出来るなら最初っから躓いてないだろ。
0186デフォルトの名無しさん
2008/09/08(月) 14:26:310187デフォルトの名無しさん
2008/09/08(月) 14:39:55実際にPGを組ませてビシビシしごく。
ついてこれない香具師は見捨てる。
0188デフォルトの名無しさん
2008/09/08(月) 16:52:47喩え話ってのはどーしたって誤謬があるわけで
「理解“した気に”させる」効果しかない。
0189デフォルトの名無しさん
2008/09/08(月) 21:50:34ポインタ使ったプログラムの動きは見えてくるんだよな。
そんな低レベルなことまで意識しなきゃならないというのは、
教える側にするとちょっと面倒でもある。
0190デフォルトの名無しさん
2008/09/08(月) 21:52:100191デフォルトの名無しさん
2008/09/08(月) 22:12:10template<classT>
class Shortcut
{
T *pTarget;
// ショートカットを設定
void SetShortcut( T &target ) { pTarget = ⌖ }
// ショートカット先にデータを設定
void SetData( T data ) { *pTarget = data; }
};
名前は>>179から頂きますた。
0192デフォルトの名無しさん
2008/09/08(月) 22:15:310193デフォルトの名無しさん
2008/09/08(月) 22:18:250194デフォルトの名無しさん
2008/09/08(月) 22:22:030195デフォルトの名無しさん
2008/09/08(月) 22:23:430196デフォルトの名無しさん
2008/09/08(月) 22:25:110197デフォルトの名無しさん
2008/09/08(月) 23:14:41metafunc<type>もポインタっぽく思える
metafunc<type>::valueとかで参照できたりするし
0198デフォルトの名無しさん
2008/09/08(月) 23:22:20+とか-とかも定義しようぜ
0199デフォルトの名無しさん
2008/09/08(月) 23:44:12この点だけは、リッチー先生を殴る権利が俺たちにあると思うよ。
俺が言語設計者なら、Data_Pointed_by(ポインタ変数)にする。
あとポインタ変数の型をなくし、すべて1バイトを示すものとする。
ポインタ変数のインクリメント・デクリメントも1バイト単位。
0200デフォルトの名無しさん
2008/09/08(月) 23:47:01どうしてもポインタをモノにできなかった奴の定番台詞ですな
0201デフォルトの名無しさん
2008/09/08(月) 23:57:39それなんてCのご先祖様BCPL、特に後半。
0202デフォルトの名無しさん
2008/09/08(月) 23:57:44そんな糞設計の言語を誰が使うんだよw
0203デフォルトの名無しさん
2008/09/08(月) 23:58:41四角から四角へ矢印を引いた図は書けるんだけど、アドレスの存在が意識されにくい図になってる。
つまりこんな図。
□→□
int aという変数にはaという値と&aという値があり、
int *pという変数にはpという値と&pという値と*pという値がある。
これらの5つの要素を図中に明示しないと上手な説明とはいえないね。
0204デフォルトの名無しさん
2008/09/09(火) 02:04:43ポインタ演算で型に応じてポインタが進むのは知っているのですが、
その「どの型ならいくつ進む」という情報は実行ファイル中にどういうふうに保存されているのでしょう?
0205デフォルトの名無しさん
2008/09/09(火) 03:02:00静的に決まる型を解釈して、そういう言うアセンブラコードに変換されてるんだよ
坊や。
0206デフォルトの名無しさん
2008/09/09(火) 03:08:51ああ、CやC++じゃそんな芸当出来ないかw
0207デフォルトの名無しさん
2008/09/09(火) 08:44:30コンパイラが吐いたasm読めば分かるよ。
よく分からなかったら、型を変えて見比べてみる。
0208デフォルトの名無しさん
2008/09/09(火) 09:41:450209デフォルトの名無しさん
2008/09/09(火) 10:20:57Cは兎も角、C++にはRTTIってもんがあるわけだが。
0210デフォルトの名無しさん
2008/09/09(火) 10:53:060211デフォルトの名無しさん
2008/09/09(火) 23:25:55いやいやdynamic_castはデバッグ用途ではないだろ。
しょっちゅう使うものでもないけれど。
0212デフォルトの名無しさん
2008/09/10(水) 00:42:46→わざわざ多態性のメリットを殺さずに、仮想関数で解決すべき。
○dynamic_castでオブジェクトの型を判別し、判別している側の振る舞いを変える
→これはあり得る。けど委譲で解決したいかな。
0213デフォルトの名無しさん
2008/09/10(水) 01:52:31予め考えられる型を全部網羅してコーディングしてるだけだしなぁ。
新たに組み込んだhogehogeクラスのポインタとか実装が無いと動かんだろ?
あ、仮想関数で呼んでもらえば自前で用意しておくだけで追加が簡単か/
0214デフォルトの名無しさん
2008/09/11(木) 00:05:54setObject(new Hoge);
//別のところ
Hoge h = (Hoge)getObject(); //戻り値の型はObject型
帰ってくるオブジェクトは絶対さっきsetObjectしたときの引数という場合。
もしこれがC++だったらboost::polymorphic_downcastの出番だな。
0215デフォルトの名無しさん
2008/09/11(木) 14:58:51インターフェースを利用できない理由があるの?
0216デフォルトの名無しさん
2008/09/11(木) 20:59:100217デフォルトの名無しさん
2008/09/11(木) 23:36:59setObjectやgetObjectは既存のライブラリで、しかも標準だったり有名だったりして
自分が手を加えられるような存在ではないんだ。
0218デフォルトの名無しさん
2008/09/12(金) 01:27:350219デフォルトの名無しさん
2008/09/12(金) 03:01:530220デフォルトの名無しさん
2008/09/12(金) 03:16:36Javaが理想に近いが、記述が冗長すぎてこれも結局は糞。
これからはロジック書きのみに集中できてシンプルな
記述で済む言語がトレンドになる。
0221デフォルトの名無しさん
2008/09/12(金) 08:40:390222デフォルトの名無しさん
2008/09/12(金) 09:00:57ロジックといえばprologやマイナーですがCoq, ETIも見逃せません
0223デフォルトの名無しさん
2008/09/12(金) 11:33:37バターナイフ振り回して「包丁は危険だから糞」って言ってる訳ですね、わかります
0224デフォルトの名無しさん
2008/09/12(金) 11:53:190225デフォルトの名無しさん
2008/09/12(金) 12:06:38まあJavaでも十分メモリを意識すると思うが。
>>219
メモリモデルはポインタとかより遙かに悩ましいね。
0226デフォルトの名無しさん
2008/09/12(金) 12:32:18「文字列」などという型はありません。
0227デフォルトの名無しさん
2008/09/12(金) 12:33:06つ[COBOL]
0228デフォルトの名無しさん
2008/09/12(金) 13:02:56Haskellをどうぞ
0229デフォルトの名無しさん
2008/10/04(土) 11:47:170230デフォルトの名無しさん
2008/10/04(土) 12:01:50char * str2 = "abcde";
>上と下は同じでどっちを使ってもいい。
これは間違い。str1は書き込みできるが、str2は書き込みができないことがある。
0231デフォルトの名無しさん
2008/10/04(土) 12:19:38どっちも書き込めないときがあるだろ。
パソコン上ではどちらも書き込めるが、
ROM化環境などではどちらも固定される事がある。
これらの最大の違いは、sizeof(); で返される値。
char str1[] = "abcde";
char * str2 = "abcde";
printf("%d¥n",sizeof(str1));
printf("%d¥n",sizeof(str2));
やってみそ
0232デフォルトの名無しさん
2008/10/04(土) 12:28:250233デフォルトの名無しさん
2008/10/04(土) 12:28:59あとは書式の問題でなれだな。
てすぐ結論をだそうとする漏れorz..
0234デフォルトの名無しさん
2008/10/04(土) 12:44:58配列に書き込めないコンパイラがあるの?
0235デフォルトの名無しさん
2008/10/04(土) 12:50:49そんなこと言ったらきりないだろ。
str1にconstがついているなら文句なしに書き込み不可だけど。
0236デフォルトの名無しさん
2008/10/04(土) 12:51:43多分、配列自体に代入する式が評価中に存在すれば固定領域ではなく揮発領域に設定されるんだろうな。
まあ、ポインタという代物はその操作をコンパイラには分からせなくするチカラもある訳で、
配列で指定した領域にポインタ参照で書き込もうとしたら落ちるとかはあるよ。
0237デフォルトの名無しさん
2008/10/04(土) 12:59:42すまんが何をいってるのかさっぱりだ
バッググラウンドを簡単に説明してくれないか
○○と言う本やコンパイラのマニュアルに書いてあった、でもいいから
0238デフォルトの名無しさん
2008/10/04(土) 13:14:21「世間には色んなコンパイラがある」ってこと。
0239デフォルトの名無しさん
2008/10/04(土) 13:18:31ポインタ経由だと、これに書き込めない環境があるってこと?
ないだろ。
0240デフォルトの名無しさん
2008/10/04(土) 13:21:27最適化されてなければな。
だからおまいの脳内環境だけで結論出すなよw
0241デフォルトの名無しさん
2008/10/04(土) 13:23:080242デフォルトの名無しさん
2008/10/04(土) 13:23:55ウンコな処理系ってよくあるから。
0243デフォルトの名無しさん
2008/10/04(土) 13:26:290244デフォルトの名無しさん
2008/10/04(土) 13:37:360245デフォルトの名無しさん
2008/10/04(土) 13:39:580246デフォルトの名無しさん
2008/10/04(土) 13:44:29>>239 が、ポインタ経由だと書き込めないってどんな処理系だよ。
0247デフォルトの名無しさん
2008/10/04(土) 13:50:24だからさ、世の中には色んなコンパイラがあって、色んな環境で色んなCPUが色んな場所で動いてるわけよ。
その全部のローカルな俺様コンパイラ的な物では定数は全部固定データなワケよ。
特に初期化宣言以降どこに右辺に現れない変数も固定な訳よ。 わかる?
0248デフォルトの名無しさん
2008/10/04(土) 13:51:26ああ、適正だ。
どこにも左辺に現れない変数な。
0249デフォルトの名無しさん
2008/10/04(土) 13:55:33定数を書き込み禁止領域に置くコンパイラってこと?
それごく普通のコンパイラじゃん
文字列リテラルを書き換えようとして落ちるのはANSI仕様上も問題ない
知ったか乙
0250デフォルトの名無しさん
2008/10/04(土) 13:55:430251デフォルトの名無しさん
2008/10/04(土) 13:56:24言わんとすることはわかったよ
0252デフォルトの名無しさん
2008/10/04(土) 13:57:51おたくの「分野」の、どのコンパイラでそういう最適化をするのか書けばいっぱつで終了する話題だろ。
0253デフォルトの名無しさん
2008/10/04(土) 13:59:13だからさ、
char t[] = "abc";
t[0] = "0";
とかあれば、このtは書き換え出来る領域に"abc"をコピーしてくるけど、
char t[] = "abc";
char *p;
p = &t[1];
*p = "0";
とかすると、落ちるとか普通にある訳よ。
0254デフォルトの名無しさん
2008/10/04(土) 14:02:56そんな事言ってちゃ、ここでマトモな議論が出来なくなるわけで。
0255デフォルトの名無しさん
2008/10/04(土) 14:05:55落ちるどころかコンパイルすら通らないだろうな
0256デフォルトの名無しさん
2008/10/04(土) 14:06:21ふつーにコンパイラのバグだよね。
0257デフォルトの名無しさん
2008/10/04(土) 14:08:52そだね。
0258デフォルトの名無しさん
2008/10/04(土) 15:40:17PICとかPICとか、あとはPICとか。
0259デフォルトの名無しさん
2008/10/04(土) 16:33:17> パソコン上ではどちらも書き込めるが、
> ROM化環境などではどちらも固定される事がある。
知ったか乙
汎用OS下でも処理系によって違うんだよ。
そもそもANSI読んだのか?
0260デフォルトの名無しさん
2008/10/04(土) 16:37:03PIC?あんなヘタレ石に組込みを代表されてたまるかいw
0261デフォルトの名無しさん
2008/10/04(土) 16:38:32処理系によって異なるのに、ANSI読んでも意味無いだろw
0262デフォルトの名無しさん
2008/10/04(土) 16:47:22規格で「パソコン上ではどちらも書き込める」ように定められてるかどうか、そうでないか確認するんだから、意味あるだろ。
0263デフォルトの名無しさん
2008/10/04(土) 16:48:28ANSIにそんな但し書きあるなら見てみるワ
0264デフォルトの名無しさん
2008/10/04(土) 16:52:58但し書きがないんなら「> パソコン上ではどちらも書き込めるが」ってのはウソってことか?
0265デフォルトの名無しさん
2008/10/04(土) 16:55:31それはWindows上のVCの実際の動きから書いてるから嘘じゃないだろ。
0266デフォルトの名無しさん
2008/10/04(土) 17:05:00べつに特定の環境の話はしてないだろ。
書き込める環境もあるし、書き込めないのもあるって話だから、>>231がウソってことになる。
0267デフォルトの名無しさん
2008/10/04(土) 17:35:370268デフォルトの名無しさん
2008/10/04(土) 18:15:050269デフォルトの名無しさん
2008/10/05(日) 16:29:00ポインタのポインタとか、
二次元配列のポインタを取る時に
= の右がconstだったりすると左が酷いことになる
まずそんなことはやらないとは思うけど
0270デフォルトの名無しさん
2008/10/05(日) 17:05:490271デフォルトの名無しさん
2008/10/05(日) 18:49:32警告だったら無視する習慣があったら、実行時に死亡だね?
0272デフォルトの名無しさん
2008/10/05(日) 22:45:27無視しても問題ないものでもなるべく除去するよう心がけるべき
0273デフォルトの名無しさん
2008/10/05(日) 22:46:270274デフォルトの名無しさん
2008/10/05(日) 22:47:090275デフォルトの名無しさん
2008/10/05(日) 23:13:45int main()でいいじゃない。
argvだけ使って、argcは使っていないというのなら、int main(int, char** argv)で。
0276デフォルトの名無しさん
2008/10/10(金) 00:30:51> 混乱のもとは、[]記号が、宣言、右辺値、左辺値、それぞれのケースで意味が微妙に違うところ
プリーズ詳しく
0277デフォルトの名無しさん
2008/10/16(木) 15:38:48誰か突っ込んでやれよ。。
0278デフォルトの名無しさん
2008/10/16(木) 15:59:36t[0] = "0"; とかありえないし。
0279デフォルトの名無しさん
2008/10/17(金) 01:41:520280デフォルトの名無しさん
2008/10/17(金) 09:24:27>>255 で既に。
0281デフォルトの名無しさん
2008/10/19(日) 10:01:08char *t[1];
t[0] = (char *)malloc(072);
t[0] = "0";
puts(t[0]);
}
0282デフォルトの名無しさん
2008/10/19(日) 10:08:110283デフォルトの名無しさん
2008/10/19(日) 12:28:45malloc無いとメモリリークしないだろ
0284デフォルトの名無しさん
2008/10/20(月) 13:05:51しないよ。直後にmain()から抜けているから。
それより、なんで58バイト確保するのかそっちが知りたい。
0285デフォルトの名無しさん
2008/10/20(月) 13:58:560286デフォルトの名無しさん
2008/10/20(月) 14:12:04円周率にはある言葉が隠されているということを!
円周率という永久に続く小数
3.1415926…
これの小数点第93299341桁目から先をみてほしい
…0721454525520877136375156…
最初の8文字に着目だ。
そう"07214545"とは「オナニーしこしこ」のことある。
これはどういうことだ?
神は我々に何を訴えようとしているんだ…
0287デフォルトの名無しさん
2008/10/20(月) 14:19:280288デフォルトの名無しさん
2008/10/20(月) 14:23:070289デフォルトの名無しさん
2008/10/20(月) 16:21:490290デフォルトの名無しさん
2008/10/20(月) 16:22:280291デフォルトの名無しさん
2008/10/21(火) 00:27:210292デフォルトの名無しさん
2008/10/21(火) 10:48:530293デフォルトの名無しさん
2008/11/03(月) 11:56:34なに、オナニーで演習することが大事だといっているのです。簡単なことです。♂も♀も。
0294デフォルトの名無しさん
2008/11/06(木) 02:43:45そろそろ浮動小数アドレスとか複素数アドレスとか出てきてもいい頃
いやその前に負数アドレスが先か
0295デフォルトの名無しさん
2008/11/06(木) 02:45:15おまえはなにをいってるんだ?
0296デフォルトの名無しさん
2008/11/06(木) 02:59:380297デフォルトの名無しさん
2008/11/06(木) 04:08:470298デフォルトの名無しさん
2008/11/06(木) 11:32:020299デフォルトの名無しさん
2008/11/06(木) 12:42:45それはROMとRAMを32KBずつ割り当ててるだけジャン
0000-7FFF : ROM
8000-FFFF : RAM
今見ると少ないメモリでよくやってたな
0300デフォルトの名無しさん
2008/11/06(木) 13:31:510301デフォルトの名無しさん
2008/11/06(木) 14:14:3232KiB + 32KiB 以外の構成は思いつかないのかアホタレ。
0302デフォルトの名無しさん
2008/11/06(木) 14:36:45アドレスバスをフルデコードしないでミラーイメージになっている場合もあるだろうけど。
0303デフォルトの名無しさん
2008/11/06(木) 16:16:420304デフォルトの名無しさん
2008/11/06(木) 17:01:51素朴な疑問だけど、その環境で0c000h-0ffffhは何もない状態なの?
例えば8080やz80のようにリセット直後にはSPが0になるようなCPUだったら
SPを設定するまでスタックが使えなくて不便だと思うのだけど。
つーか、>302が想定している次元と>303が想定している次元が噛み合ってない希ガス。
0305デフォルトの名無しさん
2008/11/06(木) 18:16:57「符号付整数」だと捉えると、アドレス範囲が
0x8000〜0xFFFF、0x0000〜0x7FFF となって
非常に見づらくね?つか上下逆にならね?」
程度の主張。
そういえば (>>294 は知らんだろうが) ポインタが
{アドレス, バイト位置} だの {セグメント, オフセット} だのという
構造を持ってるてのは有り得る。
>素朴な疑問だけど、その環境で0c000h-0ffffhは何もない状態なの?
ROMがないなどとは一言も書いてないんだけど、何でそう思ったのか。
>8080やz80のようにリセット直後にはSPが0
PCも 0x0000。
0306デフォルトの名無しさん
2008/11/12(水) 23:25:210307デフォルトの名無しさん
2008/11/13(木) 01:35:590308デフォルトの名無しさん
2008/11/14(金) 19:05:44I/Oだったり、スワップアウトされてたり。
0309デフォルトの名無しさん
2008/11/15(土) 01:37:090310デフォルトの名無しさん
2009/01/23(金) 12:26:310311デフォルトの名無しさん
2009/01/23(金) 14:21:340312デフォルトの名無しさん
2009/01/23(金) 14:46:000313デフォルトの名無しさん
2009/01/23(金) 17:24:59ポインタが難しいと勘違いされているのは、Cでは「配列のサイズチェックをしない」というポリシーがある
ために、バグで配列の範囲外をポイントしてしまったとき、デバッグが難しくなるからだ。
また、1個のオブジェクトへのポインタも、オブジェクトの配列へのポインタも、同じに扱われることも
(これも、大きな意味では「サイズチェックをしない」ことの弊害だ)難しさを倍加している。
もしこれが、「オブジェクトへの参照」であり、更に、「確保されたオブジェクト範囲外をアクセスすると
アサーションが発生する」という仕様であれば、ポインタなんて全然難しくない。
結局ポインタのせいにしているだけで、ポインタが難しいと思っている人は、
Cの「出来る限り高速に、出来る限りチェックは省き、プログラマは完全無欠であるべき」
というポリシーに付いていけないだけだと思う。
0314デフォルトの名無しさん
2009/01/23(金) 20:48:110315デフォルトの名無しさん
2009/01/24(土) 00:09:380316デフォルトの名無しさん
2009/01/24(土) 00:25:31そう見えちゃうとハマるんじゃねーの。
int a, b;
a=b;
aは変数、bは変数の中に入っている値
int a, *b;
a=*b;
*bは bという場所に入っている数値をアドレスとしてみて、そのアドレスの中にある値
*b=a;
*bはbという場所に入っている数値をアドレスとしてみたその場所で、その中にaの中の値を入れる
てな感じで。
左辺値だと代入する場所、右辺値だとその場所にある値、と参照レベルが一段変わる(用に見えなくもない)
shellだとaに値を代入するときはa=b、値を参照するときは$aで、aは変数、$をつけるとその値、とまあ参照レベルが統一されている。
と、ポインタわからんという人がなぜ出るのかを考えていたらそういうこともあるんじゃねーのかな、という結論に至った。
0317デフォルトの名無しさん
2009/01/26(月) 11:28:07それは、理解できる人間の理屈。理解できない人はそんなレベルで理解できていないわけではない。
ある意味、虫食い算は計算できるのに方程式が解けないと嘆く中学生のようなもんだ。
0318デフォルトの名無しさん
2009/02/04(水) 11:04:42アスタリスクだと掛け算とごっちゃになるから嫌いなんだよ
0319デフォルトの名無しさん
2009/02/04(水) 11:31:18是如何に。
0320デフォルトの名無しさん
2009/02/04(水) 14:20:23a**b とかじゃないの?
0321デフォルトの名無しさん
2009/02/04(水) 18:13:000322デフォルトの名無しさん
2009/02/04(水) 21:24:040323デフォルトの名無しさん
2009/02/05(木) 08:40:05>>6
>>320
大昔のHP-Cで =* という独自拡張された演算子
(*= と同じなんだけど、式の値は演算“前”の左辺) があって
a=*b なんて書くと「ambiguous だぜ。演算子の後ろに空白入れな。」
という警告をくらったのを思い出した。
bがポインタかどうかで判断つくだろうに。
つか、誰が得するんだあの拡張。
0324デフォルトの名無しさん
2009/02/05(木) 11:58:49無能なプログラマほど、空白を詰めて書きたがる。
で、そういう馬鹿なミスをやって人件費を無駄遣い。
それからな、=* の類は「独自拡張」じゃないぞ。
0325デフォルトの名無しさん
2009/02/05(木) 12:33:45>無能なプログラマほど、空白を詰めて書きたがる。
for 内部の代入は空白あけないぞスタイルだったもんで。
>で、そういう馬鹿なミスをやって人件費を無駄遣い。
コンパイル時に警告出てんだから
数秒以内で修正可能なレベルだろに。
大袈裟だな君は。
> =* の類は「独自拡張」じゃないぞ。
mjsk
0326デフォルトの名無しさん
2009/02/05(木) 13:42:15> mjsk
こんなことも知らん割には、ずいぶん上から目線だな。
0327デフォルトの名無しさん
2009/02/05(木) 14:04:34>こんなことも知らん
と
>ずいぶん上から目線だな。
に、なんの相関が?
つか、>>325 程度で「上から目線」て
どんだけ繊細なんだ。
>>326 みたいな言われ方したら
ショックで死ぬんじゃないの?
ご自愛下さい。
0329デフォルトの名無しさん
2009/02/05(木) 18:19:530330デフォルトの名無しさん
2009/02/05(木) 18:26:01でも、listなど中の実装もそうであるとは限らない。
もちろん、使う側の見かけはもちろんポインタの模倣だけど。
0331デフォルトの名無しさん
2009/02/05(木) 20:35:390332デフォルトの名無しさん
2009/02/05(木) 22:35:51今はポインタで実装してる方が珍しいと思うが。
0333デフォルトの名無しさん
2009/02/07(土) 12:47:03一度、誰かに教えようとすれば説明のし辛さが解る
0334デフォルトの名無しさん
2009/02/07(土) 13:46:19まぁ配列の扱い方とポインタの扱いがちょっと似てるからだけど
入りとしてはやさしいとおもってやってる
0335デフォルトの名無しさん
2009/02/12(木) 13:08:000336デフォルトの名無しさん
2009/02/12(木) 23:05:200.javaマンセー
1.ポインタを使ったプログラムが読める
2.ポインタの使い方が解る。
3.ポインタを効果的に使える。
0337デフォルトの名無しさん
2009/02/12(木) 23:08:150338デフォルトの名無しさん
2009/02/12(木) 23:13:480339デフォルトの名無しさん
2009/02/13(金) 01:19:03#include <stdlib.h>
int main(int ac, char *av[]){
FILE *write = fopen("test.txt", "w");
FILE *read = fopen("08112801.L81", "rb");
while(!feof(read)){
int j;
for(j = 0; j < 4096; j++){
unsigned short ch1, ch2;
fread(&ch1, 2, 1, read);
fread(&ch2, 2, 1, read);
fprintf(write, "%u %u\n", ch1, ch2);
}
}
fclose(read);
fclose(write);
return 0;
}
0340デフォルトの名無しさん
2009/02/13(金) 11:12:02猿や犬、またはそれに類する人間には
どう頑張ったところで理解できません。
0341デフォルトの名無しさん
2009/02/18(水) 01:25:42〜はじまり〜
476 名前:デフォルトの名無しさん[] 投稿日:2009/02/16(月) 11:13:14
2次元配列のキャストとかがわかんないです。
ここでつまずく。
〜中略〜
643 名前:476[] 投稿日:2009/02/18(水) 00:33:00 (略あり)
int a[10]:
int *p;
int p=a &aでもなくていいです a(名前)は先頭のアドレスをあらわします
一次元までわかってるんです
>その例で&aと書いたら何になるか答えられるか?
649 名前:476[] 投稿日:2009/02/18(水) 00:37:14
&aだとa[0]だと思います
もう教えてください
どうすれば(*p)[5]と(float *)までたどり着けるか教えてください
脳みそ取り替えたいくらいです
脳みそ取り替えてください本当に
0342デフォルトの名無しさん
2009/02/18(水) 01:26:20654 名前:476[] 投稿日:2009/02/18(水) 00:42:47
641さん
よくある本の最初に書いてあるポインタくらいならわかります
int x;
printf("%p",&x);など 一次元配列のポインタなどわかります
ですがある日突然
float balance[10][5];
float *p;
p=(float *) balance;
*(p+(3+5)+1)という最悪のパターンにであいました
独習Cですんなりいってたんですが165ページという最悪のページでモヤモヤが一気にでしました
キャストは前のページにでてきて doubleをint型に変換する簡単なものでした
double i=100.2;
printf("%d",(int)i);みたいな簡単なキャスト
ですがポインタのキャストという説明も無くそんなのがでました
(float *)という意味深な物が とまどいました
調べました よくわかりません
float[n]とかいわれてもわかりません nっていうのはfloat[1]とかfloat[2]ですか?
さっぱりわかりません脳みそとりかえたいくらいです 助けてください
0343デフォルトの名無しさん
2009/02/18(水) 01:27:29660 名前:デフォルトの名無しさん[] 投稿日:2009/02/18(水) 00:57:33
>>656
この問題分かるか?ポインタがきちんと理解できていれば分かるだろう。
long x;
short y[5] = {1,2,3,4,5};
x = (long) y;
x++;
printf("%d\n",*((int*)x));
このコードを実行した際に表示される数値は何か予想せよ。
(理由とともに。なお、longは8バイト、intは4バイト、shortは2バイトとする)
661 名前:476[] 投稿日:2009/02/18(水) 00:57:39
何故皆さんそんなわかるんですか?
おかしすぎです
なにやってたんですか
私はもう寝ます
明日もまた質問するのでよろしくお願いします
この問題が解消されないとむかついてストレスたまります
662 名前:デフォルトの名無しさん[sage] 投稿日:2009/02/18(水) 00:59:37
>>660
javaに毒されすぎじゃないか?
663 名前:デフォルトの名無しさん[sage] 投稿日:2009/02/18(水) 00:59:47
>>654の文章がひどいと思ったが、
>>661は、もう寝たか?
0344デフォルトの名無しさん
2009/02/18(水) 02:00:58ポインタをきちんと分かってる人は、こんな不可解なポインタの使い方はしないな。
0345デフォルトの名無しさん
2009/02/20(金) 01:47:12そういう人がC使うと危ない
0346デフォルトの名無しさん
2009/02/20(金) 02:07:320347デフォルトの名無しさん
2009/02/20(金) 22:34:090348デフォルトの名無しさん
2009/02/22(日) 12:39:430349デフォルトの名無しさん
2009/04/11(土) 17:28:180350デフォルトの名無しさん
2009/07/02(木) 06:59:020351デフォルトの名無しさん
2009/07/02(木) 10:13:40まあ、規格上はそれが正解。
0352デフォルトの名無しさん
2009/07/02(木) 15:50:520353デフォルトの名無しさん
2009/07/03(金) 00:48:580354デフォルトの名無しさん
2009/07/11(土) 19:10:35だから「この設問の条件では予測不可能」という回答なんだろ
0355デフォルトの名無しさん
2009/07/12(日) 14:19:04キミは0点
0356デフォルトの名無しさん
2009/07/13(月) 09:49:400357デフォルトの名無しさん
2009/07/13(月) 15:40:130358デフォルトの名無しさん
2009/07/13(月) 17:40:340359デフォルトの名無しさん
2009/07/13(月) 18:33:36これ言われてピンとこなかったら出題者がアホ
0360デフォルトの名無しさん
2009/07/14(火) 11:28:380361デフォルトの名無しさん
2009/08/26(水) 03:09:130362デフォルトの名無しさん
2009/09/01(火) 02:43:45int v,*po;
po=&v;
*po=300;
のように、ポインタ変数poが指す内容は変数vのアドレスである、ということですが、
char *jk;
jk="jyosikousei";
のように、ポインタの中に文字列を直接入れられるのはどうしてですか?
この場合、ポインタ変数jkは'j'の文字が格納されているアドレスを指しているということでしょうが、なぜそこに文字列"jyosikousei"を直接代入できるんですか?
0363デフォルトの名無しさん
2009/09/01(火) 02:45:340364デフォルトの名無しさん
2009/09/01(火) 06:50:59文字列は代入されてない
"jyosikousei"がchar*型だからcharポインタが代入されてる
0365デフォルトの名無しさん
2009/09/01(火) 07:09:03つまり、
jk="jyosikousei";
という文によって、jkに'j'の先頭アドレスが代入されているということでしょうか?
とすると、'j'の先頭1バイトが格納されている変数が宣言されていないのに、jkにアドレスが代入されるというのはおかしくないですか?
int *i;
i=100;
だと、iがどの変数のアドレスを指しているか決定されていないからNGでしょう。
どうしてchar型のポインタ変数にかぎり、直接文字列を代入する文を書けるのでしょうか?
0366デフォルトの名無しさん
2009/09/01(火) 09:07:49その先頭のアドレスが帰ってくると思えばよい
100 とかの場合はそうならない(アドレスが存在しない)のでダメ
あと "jyo" というローマ字はヘボン式としても訓令式としても正しくない
0367デフォルトの名無しさん
2009/09/01(火) 11:18:32しかし、一般に流布している。
0368デフォルトの名無しさん
2009/09/01(火) 11:21:02「なんでそんなことも判らんのか判らん」
で終わりなのに、なんて親切な奴だ。惚れそう。
0369デフォルトの名無しさん
2009/09/01(火) 11:21:15言い訳すんな無能
0370デフォルトの名無しさん
2009/09/01(火) 12:21:45私は突っ込みを入れただけだ。>362なんかと一緒にするな。
0371デフォルトの名無しさん
2009/09/01(火) 15:25:18オブジェクトの配列へのポインタなのか、区別がつかないところなのだなあ。詠嘆調。
0372デフォルトの名無しさん
2009/09/01(火) 19:05:300373デフォルトの名無しさん
2009/09/02(水) 00:21:58>int *i;
>i=100;
>だと、iがどの変数のアドレスを指しているか決定されていないからNGでしょう
いいえ
どの変数のアドレスを指しているか決定されていないからNGなのは
*i = 〜; であって i = 〜; ではありません
同様に *jk = 〜; はダメですが jk = 〜; は問題ない
0374デフォルトの名無しさん
2009/09/02(水) 09:30:52i=100;
これはポインタ指定だからオK。
int *i;
*i=100;
これは実数指定だが、どこのポインタに? って事でアウト。
って事だぁね
0375デフォルトの名無しさん
2009/09/02(水) 10:41:18と書いて欲しい
0376デフォルトの名無しさん
2009/09/04(金) 01:04:04区別がつく必要ある?
0377デフォルトの名無しさん
2009/09/04(金) 11:10:010378デフォルトの名無しさん
2009/09/06(日) 13:33:14質問は
「区別がつく?」
ではなく
「区別がつく必要ある?」
だろ。
必要性と可能性の違いもわからんのか。
0379デフォルトの名無しさん
2009/09/06(日) 13:58:120380デフォルトの名無しさん
2009/09/06(日) 16:10:580381デフォルトの名無しさん
2009/09/06(日) 22:28:320382デフォルトの名無しさん
2009/09/07(月) 14:58:57ポインタのせいでは無い。
0383デフォルトの名無しさん
2009/09/07(月) 17:40:52それが難しいかどうかは知らん。何でそうなるのかぐらいわかれとも思うが。
0384デフォルトの名無しさん
2009/09/08(火) 10:57:11*, &, などの変てこな記号が入り乱れ、学習者にとっては「うかつに近づくな」気配がぷんぷんする。
○配列の問題
int* p; としたpが1個のオブジェクトを指しているのか、配列のアドレスを指しているのか区別が無い。
その「区別が無い」という概念を理解することが重要なのに、大抵の教科書には
表面的な「アドレスである」という表記しかないので混乱の元になっている。
○バグりやすい問題
ポインタはオブジェクトを指してこそ意味があるのだが、cでは文法上オブジェクトの範囲外でも
平気でアクセス出来てしまう。例えばchar buf[256];としたbufをサブルーチンに渡し、buf[800] = 'x';
とか出来ちゃう。そしてバグる。こういう「他の(高級)言語では有り得ないバグ」が難しいと思わせる原因。
0385デフォルトの名無しさん
2009/09/08(火) 11:06:01うかつに近づかないでほしい。
0386デフォルトの名無しさん
2009/09/08(火) 13:04:500387デフォルトの名無しさん
2009/09/08(火) 14:50:070388デフォルトの名無しさん
2009/09/08(火) 15:26:570389デフォルトの名無しさん
2009/09/08(火) 15:27:270390デフォルトの名無しさん
2009/09/08(火) 20:36:102項目目の意味がよくわからないな。
ポインタはアドレスを指すだけだろ。
なんだよ「区別」って。
0391デフォルトの名無しさん
2009/09/09(水) 10:59:590392デフォルトの名無しさん
2009/09/11(金) 16:47:330393デフォルトの名無しさん
2010/01/07(木) 19:05:12$でも良かったでしょ
0394デフォルトの名無しさん
2010/01/07(木) 19:31:33ポインタってアドレスなんだろ?
そんなもん1進むに決まってるんじゃないのか?
0395デフォルトの名無しさん
2010/01/07(木) 20:05:12後者を説明してない解説は結構多い。
0396デフォルトの名無しさん
2010/01/08(金) 06:38:25ポインタはアドレスではないかも知れない。
特に、アドレスがバイト単位にふられてない場合は確実に。
今時あるのかどうか知らんが。
0397デフォルトの名無しさん
2010/01/08(金) 14:10:51禿しく同意。
ここまでアナルが出てないってどういうことだよな
0398デフォルトの名無しさん
2010/01/16(土) 02:47:52*
0399デフォルトの名無しさん
2010/01/16(土) 22:17:44たとえば、32bit整数型は1byte(8byte)では収まらない。4byte(32bit)必要だよな?だから4byteずつ進むのは間違いではないよ。
あとはハードウェアの都合という面もある。「アドレス パディング」や「アドレス アライメント」で調べるとヒントが得られるかと思うよ。
それでも解らないならオープンソースのコンパイラを解析するしかないんじゃないかと。
0400デフォルトの名無しさん
2010/01/17(日) 12:39:400401デフォルトの名無しさん
2010/01/17(日) 13:55:110402デフォルトの名無しさん
2010/01/17(日) 15:51:540403デフォルトの名無しさん
2010/01/17(日) 21:03:52>たとえば、32bit整数型は1byte(8byte)では収まらない。4byte(32bit)必要だよな?だから4byteずつ進むのは間違いではないよ
うそはいかん。ポインタへのポインタだったら4バイトずつ進むが、型のサイズ分のバイト数がすすむ。
つまり、sizeof 型 だけ進む。 なぜかって?そのほうが都合がいいから。
0404デフォルトの名無しさん
2010/01/22(金) 14:23:05ポインタを1つ進めるということは、次のオブジェクトを指すというだけの話
アドレスが○○バイト進むというのは、ポインタが次のオブジェクトを指したという結果であって、ポインタの理解としては正しくないと思うよ
0405デフォルトの名無しさん
2010/01/23(土) 09:04:53なるほど。たしかにそう考えるとわかりやすいかも。
0406デフォルトの名無しさん
2010/01/24(日) 17:31:420407デフォルトの名無しさん
2010/01/24(日) 18:23:13その言い方だと、Cにとって関数の実装だってポインタじゃん
0408デフォルトの名無しさん
2010/01/24(日) 22:20:39お前が何を言っているのかわからねー
0409デフォルトの名無しさん
2010/01/24(日) 22:26:45http://www.kouno.jp/home/c_faq/c6.html
0410デフォルトの名無しさん
2010/01/24(日) 23:23:38HRESULT (WINAPI *func)(HTHEME);
func = (HRESULT (WINAPI *)(HTHEME))::GetProcAddress(m_hLibMod, "CloseThemeData");
if (func) return func(m_hTheme);
return NULL;
って例もあるってことだろ
0411デフォルトの名無しさん
2010/01/25(月) 01:00:03そりゃ関数ポインタであって
// 外部リンケージの実装上、間接呼び出しになるものを除いて
通常の関数のどの辺がポインタなのかと問うているんだが。
0412デフォルトの名無しさん
2010/01/25(月) 19:02:00配列をポインタだと言うなら、関数も単にアドレスをコールしてるだけの代物だろう
配列概念がポインタだとか言う乱暴な話をすんなってこった
0413デフォルトの名無しさん
2010/02/08(月) 09:05:06ひとつの変数でアドレスと示す値の2つが出てくるからいけない。
int *sex;
static cinco = 072;
sex = &cinco;
cinco = (int)sex;//アドレス
cinco = (int)&sex;//ポインタのポインタ
cinco = *sex;//ポイッタが示す値
0414デフォルトの名無しさん
2010/02/08(月) 09:26:550415デフォルトの名無しさん
2010/02/09(火) 10:09:340416デフォルトの名無しさん
2010/02/09(火) 14:28:02僕は初めてマックのプログラムを作った時、
ポインタのポインタ、というのがあまりにも便利すぎて衝撃を受けたけどな。
0417デフォルトの名無しさん
2010/02/09(火) 14:31:040418デフォルトの名無しさん
2010/02/09(火) 14:48:34WinNT.h(344)
typedef void *HANDLE;
無知哀れ
0419デフォルトの名無しさん
2010/02/09(火) 14:53:400420デフォルトの名無しさん
2010/02/09(火) 15:16:15マックだと書いてるだろ、アホ
0421デフォルトの名無しさん
2010/02/09(火) 15:21:50ポインタのポインタを使わざるを得なかったな。
x386でCPUがサポートしたからこの概念も意味が薄れたが
0422デフォルトの名無しさん
2010/02/09(火) 15:50:18char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。
これ、なんか違わなかったけ
0423デフォルトの名無しさん
2010/02/09(火) 16:24:580424デフォルトの名無しさん
2010/02/09(火) 18:58:46用途によるだろ
ただ表示させるだけならどっちでもいいし
0425デフォルトの名無しさん
2010/02/09(火) 19:59:11上は、文字列のポインター
下は、文字列定数のポインター
読めるから書けるわけではない...
0426デフォルトの名無しさん
2010/02/09(火) 23:12:170427デフォルトの名無しさん
2010/02/10(水) 04:28:26char * str2 = "abcde";
printf("%d,%d\n",sizeof(str1),sizeof(str2)); // 6,4
str1[0]='x';
printf(str1); // xbcde
str2[0]='x'; // 以下、エラー
printf(str2);
0428デフォルトの名無しさん
2010/02/10(水) 06:16:18以下エラー、の部分は、処理系によってはエラーにならない。
こっちの方がいい。
str2 = "bcdef";
printf(str2); // bcdef
str1 = "bcdef"; //エラー
printf(str1);
0429デフォルトの名無しさん
2010/02/10(水) 06:40:59>以下エラー、の部分は、処理系によってはエラーにならない。
警告ならまだしも、エラーになるような標準から外れた処理系は嫌だな。
0430デフォルトの名無しさん
2010/02/10(水) 08:14:02コンパイルエラーじゃなくて実行時エラーのことだろ。
わざわざ以下、エラーって変な言葉で書いてるんだし。
0431デフォルトの名無しさん
2010/02/11(木) 10:06:250432デフォルトの名無しさん
2010/02/11(木) 10:42:31だからと言って、プログラマは、str2の示すメモリ領域が自由に読み書きできると期待してはいけない
0433デフォルトの名無しさん
2010/02/11(木) 10:59:540434デフォルトの名無しさん
2010/02/11(木) 11:44:56あんまり「エラー」とは言わないと思うんだが。まあいいや。
>>431
阿呆ですか?
0435デフォルトの名無しさん
2010/02/11(木) 19:08:39そういう文字通りのポインタという意味では難しいところは何もないよ
たとえばわざわざ&でアドレス書いて*で参照するだけなら誰でもわかる
問題は、領域が何指してるのかわからなくなるとか
上に出てた文字定数へのポインタなんか序の口だが
表記的にわかりにくいとかそういう副次的な面
0436デフォルトの名無しさん
2010/02/13(土) 10:21:140437デフォルトの名無しさん
2010/02/13(土) 10:38:00ポインタを難しいと脅かしたり、有用な使い道を教えない(教えられない)
クソ本、クソサイトが跋扈していることが理解できない
0438デフォルトの名無しさん
2010/02/13(土) 13:07:44newしたポインタをうっかりコピーして、両方でdeleteしたり、
配列の先頭アドレスを渡すと渡した先ではポインタになって、
配列のサイズがわからないからサイズを超えてアクセスしたり、
1個のオブジェクトへのポインタなのか配列へのポインタなのか
区別がつかないからバグの元になったり。
ポインタでなく参照にすれば、いくつかの難しさは取り除けたはずだが、
70年代の言語にそれを求めるのは酷というものだ。
(当時のCPUでの)現実的なコンパイル時間という制約もあるし。
0439デフォルトの名無しさん
2010/02/13(土) 13:26:24でも、C++を始めるなら、Cでポインタ位は覚えてないと難しいよねwwwwww
0440デフォルトの名無しさん
2010/02/13(土) 23:35:19どうして?
0441デフォルトの名無しさん
2010/02/14(日) 09:53:55遠回りかもしれないけど良いと思うよ。
0442デフォルトの名無しさん
2010/02/14(日) 10:02:41なんでわざわざポインタのためだけに他の言語に手をだすのか・
>>441
Brainfuck
0443デフォルトの名無しさん
2010/02/14(日) 10:11:12ポインタが指しているものが、アドレスではなくオブジェクトだから
で、オブジェクトって何ぞやってのは、オブジェクト指向を覚えれば分かるよ
0444デフォルトの名無しさん
2010/02/14(日) 10:14:240445デフォルトの名無しさん
2010/02/14(日) 10:24:07どっか、違うの?
違うと言うなら詳細に説明してほしいねぇ
0446デフォルトの名無しさん
2010/02/14(日) 10:28:01Cとかでいうオブジェクトは実装レベルのオブジェクトだけを挿す
参考:
デザインパターンとともに学ぶオブジェクト指向のこころ (Software patterns series): アラン・シャロウェイ, ジェームズ・R・トロット, 村上 雅章:
0447デフォルトの名無しさん
2010/02/14(日) 10:36:48Cのオブジェクトとは、名前付きのメモリ領域のこと。
0448デフォルトの名無しさん
2010/02/14(日) 10:40:060449デフォルトの名無しさん
2010/02/14(日) 10:43:05K&R 2nd
0450デフォルトの名無しさん
2010/02/14(日) 10:47:490451デフォルトの名無しさん
2010/02/14(日) 10:47:540452デフォルトの名無しさん
2010/02/14(日) 10:52:240453デフォルトの名無しさん
2010/02/14(日) 10:54:26> Cのオブジェクトとは、名前付きのメモリ領域のこと。
って、C++のオブジェクトは?
オブジェクト指向だろうが、そうでなかろうが、オブジェクトってのは
「コンピューター内で有意なデータの集まり」だろ
そのオブジェクトをいかに合理的に使うかという方法論が、構造化プログラミングであり、オブジェクト指向じゃん
0454デフォルトの名無しさん
2010/02/14(日) 11:08:30仕様書は高いからDraftだけど、
The C++ object modelには
> An object is a region of storage
0455デフォルトの名無しさん
2010/02/14(日) 11:23:020456デフォルトの名無しさん
2010/02/14(日) 11:38:310457デフォルトの名無しさん
2010/02/14(日) 16:18:57.ノ′ } 〕 ,ノ .゙'┬′ .,ノ
ノ } ゙l、 」′ .,/′ .,ノ _,,y
.,v─ーv_ 〕 〕 .| .il゙ 《 ._ .,,l(ノ^ノ
,i(厂 _,,,从vy .,i「 .》;ト-v,|l′ _,ノ゙|.ミ,.゙'=,/┴y/
l ,zll^゙″ ゙ミ .ノ .il|′アll! .>‐〕 \ _><
《 il|′ フーv,_ .,i″ ||}ーvrリ、 ¨'‐.` {
\《 ヽ .゙li ._¨''ーv,,_ .》′ ゙゙ミ| ,r′ }
\ ,゙r_ lア' .゙⌒>-vzト .ミノ′ 〕
.゙'=ミ:┐ .「 ./ .^〃 :、_ リ .}
゙\ア' .-- ,,ノ| 、 ゙ミ} :ト
゙^ー、,,,¨ - ''¨.─ :!., リ ノ
〔^ー-v、,,,_,: i゙「 } .,l゙
l! .´゙フ'ーv .,y ] '゙ミ
| ,/゙ .ミ;.´.‐ .] ミ,
| ノ′ ヽ 〔 ミ
} } ′ } {
.| .ミ .< 〔 〕
.{ \,_ _》、 .{ .}
{ ¨^^¨′¨'ー-v-r《 〔
0458デフォルトの名無しさん
2010/02/14(日) 23:52:01以下、莫迦を弄るの禁止。
0459デフォルトの名無しさん
2010/02/15(月) 04:42:260460デフォルトの名無しさん
2010/02/15(月) 14:57:100461デフォルトの名無しさん
2010/02/15(月) 15:22:160462デフォルトの名無しさん
2010/02/17(水) 14:18:25*dst++=*src++;
こんなのやるから
それかsignal()のポロトタイプで挫折。
0463デフォルトの名無しさん
2010/02/17(水) 15:31:2568030のコンパクトで美しいコードを出力する良いプログラムじゃねえか。
move.l (src)+,(dst)+
0464デフォルトの名無しさん
2010/02/18(木) 01:47:430465デフォルトの名無しさん
2010/02/18(木) 08:07:45その理由を相手が納得しない限り
何どいってもわかるわけがないだろ?
馬鹿ですか?
0466デフォルトの名無しさん
2010/02/18(木) 19:56:01■関数:signal
引数1:int signum
引数2:intを引数とするvoidを返す関数ポインタ handler
戻り値:intを引数とするvoidを返す関数ポインタ
先頭の'void( *' と 末尾の')(int)' で戻り値 :(;゙゚'ω゚')…
0467デフォルトの名無しさん
2010/02/18(木) 20:14:35#define OPEN (
#define CLOSE )
typedef int Integar;
typedef void (*TYPE_)(Integar);
TYPE_ signal OPEN Integar, TYPE_ CLOSE;
0468デフォルトの名無しさん
2010/02/19(金) 05:27:010469デフォルトの名無しさん
2010/02/19(金) 19:40:3677BE4FD6: 68 80 28 BC 77 push 77BC2880h
77BE4FDB: E8 40 24 00 00 call 77BE7420
77BE4FE0: 8B 5D 0C mov ebx,dword ptr [ebp+0Ch]
77BE4FE3: 83 FB 04 cmp ebx,4
77BE4FE6: 0F 84 41 01 00 00 je 77BE512D
77BE4FEC: 83 FB 03 cmp ebx,3
77BE4FEF: 0F 84 38 01 00 00 je 77BE512D
77BE4FF5: 8B 75 08 mov esi,dword ptr [ebp+8]
77BE4FF8: 83 FE 02 cmp esi,2
77BE4FFB: 0F 84 B0 00 00 00 je 77BE50B1
77BE5001: 83 FE 15 cmp esi,15h
77BE5004: 0F 84 A7 00 00 00 je 77BE50B1
77BE500A: 83 FE 16 cmp esi,16h
77BE500D: 0F 84 9E 00 00 00 je 77BE50B1
77BE5013: 83 FE 0F cmp esi,0Fh
77BE5016: 0F 84 95 00 00 00 je 77BE50B1
77BE501C: 83 FE 08 cmp esi,8
77BE501F: 74 0E je 77BE502F
77BE5021: 83 FE 04 cmp esi,4
77BE5024: 74 09 je 77BE502F
77BE5026: 83 FE 0B cmp esi,0Bh
77BE5029: 0F 85 FE 00 00 00 jne 77BE512D
77BE502F: E8 F1 4E 00 00 call 77BE9F25
77BE5034: 8B D8 mov ebx,eax
77BE5036: BF 10 F7 C0 77 mov edi,77C0F710h
77BE503B: 39 7B 54 cmp dword ptr [ebx+54h],edi
77BE503E: 75 32 jne 77BE5072
77BE5040: FF 35 90 F7 C0 77 push dword ptr ds:[77C0F790h]
77BE5046: E8 BC 73 FF FF call 77BDC407
77BE504B: 59 pop ecx
77BE504C: 89 43 54 mov dword ptr [ebx+54h],eax
0470デフォルトの名無しさん
2010/02/19(金) 19:41:1677BE5051: 0F 84 D6 00 00 00 je 77BE512D
77BE5057: 8B 0D 90 F7 C0 77 mov ecx,dword ptr ds:[77C0F790h]
77BE505D: 8B F7 mov esi,edi
77BE505F: 8B F8 mov edi,eax
77BE5061: 8B C1 mov eax,ecx
77BE5063: C1 E9 02 shr ecx,2
77BE5066: F3 A5 rep movs dword ptr [edi],dword ptr [esi]
77BE5068: 8B C8 mov ecx,eax
77BE506A: 83 E1 03 and ecx,3
77BE506D: F3 A4 rep movs byte ptr [edi],byte ptr [esi]
77BE506F: 8B 75 08 mov esi,dword ptr [ebp+8]
77BE5072: 8B 53 54 mov edx,dword ptr [ebx+54h]
77BE5075: E8 0B FF FF FF call 77BE4F85
77BE507A: 85 C0 test eax,eax
77BE507C: 0F 84 AB 00 00 00 je 77BE512D
77BE5082: 8B 50 08 mov edx,dword ptr [eax+8]
77BE5085: EB 20 jmp 77BE50A7
77BE5087: 8B 4D 0C mov ecx,dword ptr [ebp+0Ch]
77BE508A: 89 48 08 mov dword ptr [eax+8],ecx
77BE508D: 83 C0 0C add eax,0Ch
77BE5090: 8B 0D 94 F7 C0 77 mov ecx,dword ptr ds:[77C0F794h]
77BE5096: 8D 0C 49 lea ecx,[ecx+ecx*2]
77BE5099: 8B 7B 54 mov edi,dword ptr [ebx+54h]
77BE509C: 8D 0C 8F lea ecx,[edi+ecx*4]
77BE509F: 3B C1 cmp eax,ecx
77BE50A1: 0F 83 D4 00 00 00 jae 77BE517B
77BE50A7: 39 70 04 cmp dword ptr [eax+4],esi
77BE50AA: 74 DB je 77BE5087
77BE50AC: E9 CA 00 00 00 jmp 77BE517B
77BE50B1: 33 FF xor edi,edi
77BE50B3: 57 push edi
0471デフォルトの名無しさん
2010/02/19(金) 19:53:25あ〜、「バグっぽいの見つけたけど、報告はここでいいんですかね?」みたいな
いいわけないだろと心の中で突っ込んだが
85 デフォルトの名無しさん [sage] 2010/02/17(水) 01:46:52 ID: Be:
普遍的にバグであるかどうかを確認するためにスレで話題を振る、というのはアリではあるが
ライセンス上、パッチを2chに投稿したら取り込めないのでそこだけは注意
86 デフォルトの名無しさん [sage] 2010/02/17(水) 02:29:47 ID: Be:
ああ、著作権が2chに移っちゃうって話か。確かにそうだわな。
87 デフォルトの名無しさん [sage] 2010/02/17(水) 02:45:42 ID: Be:
まあそのまま取り込まなきゃ回避策はいくらでもある。
オープンソースなんて、どこかのをパクりまくり出し。
著作権は権利が認められれば、その作者が持ってるので放棄出来ないけどな。
著作権法よく読もうぜ。
88 デフォルトの名無しさん [sage] 2010/02/17(水) 02:51:51 ID: Be:
>>87
2chの書き込み規約よく読め
0472デフォルトの名無しさん
2010/02/27(土) 19:25:21int *p;
int a[100];
p=(int *)bsearch(....
ポインタを返すっていうよりメモリアドレスを返してない?
nで見つかったとしたら &a[n]のアドレス
ポインタを返すと書いてあるけど メモリアドレスを返すって意味でいいの?
ポインタとメモリアドレスの違いを教えてください。
0473デフォルトの名無しさん
2010/02/27(土) 20:05:110474デフォルトの名無しさん
2010/02/27(土) 20:54:18『ポインタ』の意味は文脈によって変わる。
ポインタ型変数のことを指す場合もあれば、ポインタ値(=アドレス)を指すこともある。
0475デフォルトの名無しさん
2010/02/28(日) 00:07:22ポインタ=オブジェクトの存在するメモリ空間の先頭アドレス
ポインタ変数=値としてポインタを保持する変数
int *pはint型のオブジェクトに対するポインタを保持する変数
としてpを宣言するという意味になる。
>>474
変わるわけ無いだろ、お前が混同してるだけちゃうんかと小一時間(ry
0476デフォルトの名無しさん
2010/02/28(日) 11:27:19情報科学の分野では用語の整備が出来てないのか?
情報科学の分野における「ポインタ」という言葉の
標準的な定義は何なの?
日本語版&英語版のWikipediaでは、「ポインタ」という言葉は
"アドレス"ではなく"変数"の方で定義してあるようだが、
これが標準的な意味なのか?
0477デフォルトの名無しさん
2010/02/28(日) 12:05:230478デフォルトの名無しさん
2010/02/28(日) 15:38:35というものもあるのでポインタ=変数というのは明確な間違い。
あくまでオブジェクトのタイプとして整数、共用体、クラスなどと
同列の存在として存在する。
int i,j;を定義して整数i,jと表現するのと同様にvoid *p;を定義して
ポインタpと表現することはあるが、あくまでポインタは変数pの
保持するオブジェクトのタイプであり変数そのものではない。
混同するのは概念が理解できてないだけ。
0479デフォルトの名無しさん
2010/03/01(月) 00:34:170480デフォルトの名無しさん
2010/03/01(月) 08:18:33>情報科学の分野における「ポインタ」という言葉
一般用語としての「ポインタ」なんてもんはない。
各言語の規格をあたれ。
0481デフォルトの名無しさん
2010/03/20(土) 07:58:320482デフォルトの名無しさん
2010/03/21(日) 20:05:200483デフォルトの名無しさん
2010/03/21(日) 22:34:27( <●><●>)
(U )つ
u u
0484デフォルトの名無しさん
2010/03/22(月) 18:26:17あれだろ、猟犬で獲物の方向を見て動かない犬種。
あれが確か「ポインター」
0485デフォルトの名無しさん
2010/03/23(火) 12:49:09char$ argv;
int@ test;
微妙…
0486デフォルトの名無しさん
2010/03/25(木) 22:54:340487デフォルトの名無しさん
2010/03/26(金) 01:05:31普通にポインタに代入するだけで済むような気がするのですが……
0488デフォルトの名無しさん
2010/03/26(金) 02:16:200489デフォルトの名無しさん
2010/03/26(金) 17:13:17値渡しをちゃんと理解しよう。
引数が値渡しだから
「引数に与えられた変数の値を書き換えるにはその変数のポインタが必要」
なのが理解できていたら
書き換えようとする変数がポインタの場合は、
「引数に与えられたポインタの値を書き換えるにはそのポインタのポインタが必要」
になるのも理解できるはずだ。
0490デフォルトの名無しさん
2010/03/26(金) 21:04:42ありがとうございました
目からうろこがおちました
ポインタを取って逆参照に代入が基礎ですね
勉強になりました
0491デフォルトの名無しさん
2010/03/26(金) 23:56:57C++/CLIだと(ポインタの意味ではないけど)^や%が出てくるぞ。int^とかchar%とか。
0492デフォルトの名無しさん
2010/03/27(土) 06:36:580493デフォルトの名無しさん
2010/03/27(土) 21:57:32と
char * str = "abcde";
が同じなら、上の方がしっくりくるなぁ。
JavaScriptなら
var str = [];(もしくは、var str = new Array();)
str[0] = "abcde";
と同じ事?
Perlだったら、
@str
$str[0] = "abcde";
になるのかな?
多次元配列の一種だと思ってたけど、どう違うん?
0494デフォルトの名無しさん
2010/03/27(土) 23:49:33char * str = "abcde"; はどこかにある配列を参照するポインタ
全く違う
0495デフォルトの名無しさん
2010/03/27(土) 23:52:340496デフォルトの名無しさん
2010/03/28(日) 00:05:240497デフォルトの名無しさん
2010/03/28(日) 08:48:41C FAQ 6.2嫁
0498497
2010/03/28(日) 08:52:14○ 473
0499デフォルトの名無しさん
2010/04/07(水) 17:39:58PerlやPHPでも可。
0500デフォルトの名無しさん
2010/04/07(水) 18:34:110501デフォルトの名無しさん
2010/04/11(日) 17:38:06リファレンスはコンパイラが使うポインタ?
0502デフォルトの名無しさん
2010/04/12(月) 01:33:180503デフォルトの名無しさん
2010/04/12(月) 13:29:000504デフォルトの名無しさん
2010/05/28(金) 19:21:060505デフォルトの名無しさん
2010/06/09(水) 15:13:32参照の値渡し?は参照渡しだろ
0506デフォルトの名無しさん
2010/06/10(木) 10:56:54参照のポインタ渡しはない
0507デフォルトの名無しさん
2010/06/11(金) 14:00:170508デフォルトの名無しさん
2010/06/11(金) 18:54:24JavaScriptで言うと
function hoge(obj) { obj = {foo:2} }
var tako = {foo:1};
hoge(tako);
alert(tako.foo);
参照渡しなら2と表示されるはずだが実際には1になる
0509デフォルトの名無しさん
2011/05/05(木) 04:45:44.690510デフォルトの名無しさん
2011/06/08(水) 20:26:32.43int * const (*(*funcsMap[FUNCS])())(int * const (*)());
はがしたいのでしょうか?
0511デフォルトの名無しさん
2011/06/08(水) 20:44:55.64今さらで、かなりの遅レスなのは分かってるけどさ。
理論から入る?笑わせんな。この程度の動作を理解できない分際で、何が理論から入るだ。
「こういう動作をする」
そういうサンプルを見れば、本当に理論から入るやつは「こういうものに使えます」なんて
手を差し伸べられる必要もなく理解できるし、自分で使いどころを見つけられるわ。
自分で考える程度の、人間として最低限の能力も足りない分際が、よりによって「俺は理論から入るから、誰かに手とり足とり教授してもらわないと何もできないの。」って
ふざけてんのか?
うん、凄く汚い口調になってしまってすまない。
ただ、こういう「自分が出来ないのはこういう周りが悪い」っていう態度が凄く気に食わなかったんだ。
0512デフォルトの名無しさん
2011/06/08(水) 20:47:16.280513デフォルトの名無しさん
2011/06/08(水) 22:52:01.05引数無しでintへのポインタを返す関数へのポインタを引数にintへのポインタを返す関数へのポインタを返す引数無しの関数へのポインタへのポインタの配列
だと思うが携帯からなんであんま自信ない。
さすがにそこまでいくとコンパイルして確かめたい。
0514デフォルトの名無しさん
2011/06/09(木) 00:08:31.18スレチ
スパゲッティなの出してきてgotoがわからないとか言ってるようなもの
0515デフォルトの名無しさん
2011/06/09(木) 00:13:35.68理解できないなら、素直にそういえよw
0516デフォルトの名無しさん
2011/06/09(木) 06:44:43.17いや、でも上の文は「ポインタが難しい」と言われる要因の1つを表してると思うよ。
要は「非常に読みにくい」のよ。特に関数ポインタは。
もうちょっと何とかならんかったんかな、あれ。
0517デフォルトの名無しさん
2011/06/09(木) 10:47:22.680518デフォルトの名無しさん
2011/06/09(木) 20:04:35.85こんなマゾ的なオカルトコード知ってても何の得にもならんよ。
周囲に害悪を垂れ流すのみ。
0519デフォルトの名無しさん
2011/06/09(木) 22:38:33.370520デフォルトの名無しさん
2011/06/09(木) 23:14:13.410521デフォルトの名無しさん
2011/06/10(金) 01:53:53.530522デフォルトの名無しさん
2011/06/10(金) 02:24:03.39それが何故あそこまで読みにくいコードになるんだよと思う
0523デフォルトの名無しさん
2011/06/10(金) 02:48:18.41でもCでの記法はすぐにマスターできなかった
0524デフォルトの名無しさん
2011/06/10(金) 17:53:10.12これが意味ある宣言かどうかはそのうち見てやる
時間が掛かる割りには得られるものが少ないので暇な時にな
0525デフォルトの名無しさん
2011/06/10(金) 19:06:24.15「ただの長ったらしい宣言」で済んでると思うよ
0526デフォルトの名無しさん
2011/06/10(金) 22:11:06.55p= (int*)malloc(80);
として、
pp[1][2] = 2;
とできるには、ppをどの様に宣言すればいいですか?
0527デフォルトの名無しさん
2011/06/10(金) 22:44:00.28int pp[10][10];
0528デフォルトの名無しさん
2011/06/10(金) 22:47:49.27ごめんなさい
書き方がおかしかった。
ppがpの領域を指すようにした後に
pp[1][2] = 2;
を行いたいです。
0529デフォルトの名無しさん
2011/06/10(金) 22:50:05.470530デフォルトの名無しさん
2011/06/10(金) 23:01:34.28int (*pp)[2][3];
代入時にキャストする必要あり
0531デフォルトの名無しさん
2011/06/11(土) 07:52:16.08できました。
ありがとうございました。
0532デフォルトの名無しさん
2011/06/11(土) 16:32:09.72コンピュータアーキテクチャの基礎みたいなのが足りないからポインタが分からない
それを分かってない講師や著者がいるから混乱をまねく
0533デフォルトの名無しさん
2011/06/11(土) 16:53:56.450534デフォルトの名無しさん
2011/06/11(土) 19:42:26.37オブジェクト指向は難しくないが、C++は難しい
0535デフォルトの名無しさん
2011/06/11(土) 20:57:14.17int> p -> a:
p <= 20;
p <- b;
printf("%d %d", p, =>a);
0536デフォルトの名無しさん
2011/06/11(土) 22:09:30.060537デフォルトの名無しさん
2011/06/11(土) 22:12:49.450538デフォルトの名無しさん
2011/06/12(日) 00:56:26.18でもJavaでそれが原因で混乱することってあんまり無いと思う
「基本型は値、オブジェクトは参照」と固定したお陰で
参照型の表現やデリファレンス専用の構文が要らなくなって
すっきりした、比較的読みやすい記法に纏まってると思うよ
0539デフォルトの名無しさん
2011/06/12(日) 01:03:09.870540デフォルトの名無しさん
2011/06/12(日) 17:20:17.670541デフォルトの名無しさん
2011/06/16(木) 03:15:31.57>K&Rによれば、Cの宣言は、「変数が現われ得る式の構文を真似た(P.114)」そうである。
>しかし、本質的に全く異なるものを無理に似せようとしたため、
>結局わけのわからない構文になってしまっている。
># Cの作者Dennis Ritchieが最近開発した新しい言語 Limboは、一見
># C like だが、宣言の構文はしっかりPascal風のものに直してある...
># ずるい(^^;
0542uy ◆yyC0rYWEq2
2011/06/21(火) 22:29:09.42ポインタを使ってバグなく作るのが難しい、と、はい
0543デフォルトの名無しさん
2011/06/22(水) 15:33:14.830545uy ◆yyC0rYWEq2
2011/06/23(木) 22:28:58.34Windowsが仮想アドレス持ってるのは、直アクセスさせちゃうとデバッグが事実上不可能だから、そうしてるわけで
だから、プログラミング上でも、Windowsの仮想アドレスにダイレクトにアクセスするのではなく
さらにプログラム内で仮想アドレスを作ってそこからWindowsの仮想アドレスへアクセスするようにしないと、
プログラムのデバッグは、プログラム内からは、事実上不可能
Windows上で動くデバッガを使って、追う事は可能だけど
そんな事するよりもプログラムソース内で、printして、正しいかどうかを見れたほうが良い
プログラム内仮想アドレスのポインタを駆使して、複雑な構造作る事は、ゴミグラマじゃなければ頻繁にあるはずだし
そこで作る構造は、メモリ直のポインタ触っていたら絶対にバグが取りきれないような複雑さになっているはず
ポインタを使わないわけではなく、デバッグ不可能な直アクセスのポインタがいらない
0546デフォルトの名無しさん
2011/06/23(木) 22:41:41.630547uy
2011/06/24(金) 03:25:27.980548デフォルトの名無しさん
2011/06/24(金) 12:29:05.210549デフォルトの名無しさん
2011/06/24(金) 13:31:17.310550デフォルトの名無しさん
2011/06/24(金) 16:56:41.160551uy ◆KOAgYBL/Xg
2011/06/24(金) 23:36:53.580552uy ◆hi.ht/Isu2
2011/06/29(水) 03:38:48.290553天使 ◆uL5esZLBSE
2011/07/02(土) 01:52:08.580554デフォルトの名無しさん
2011/07/15(金) 09:17:30.08funcsMapはFUNCS個の配列、要素はポインタA
ポインタAは関数Cを指す
関数Cは引数なし、戻り値はポインタB
ポインタBは関数Dを指す
関数Dは引数がポインタE、戻り値はintポインタ
ポインタEは関数Gを指す
関数Gは引数なし、戻り値はintポインタ
答えられなかった未熟者どもは切腹しろ
0555デフォルトの名無しさん
2011/07/15(金) 20:31:56.63おそっ
0556デフォルトの名無しさん
2011/07/15(金) 22:45:33.620557デフォルトの名無しさん
2011/07/15(金) 22:48:22.130558デフォルトの名無しさん
2011/07/15(金) 22:57:59.190559デフォルトの名無しさん
2011/07/15(金) 23:00:12.71機械語読んでろ
0560デフォルトの名無しさん
2011/07/15(金) 23:15:49.83int hoge[NUM][XMAX][YMAX];
として書かれてるコードがあるが、メモリ不足のためhogeを動的に確保するように変更したい。
ただしhogeを使っているコードはあちこちにあるので、それらを無変更のまま動くようにしたい。
おまえらこれくらい出来るだろうな?
0562デフォルトの名無しさん
2011/07/17(日) 22:06:37.38hoge = malloc(sizeof(*hoge));
でもメモリ不足で静的に確保できないなら動的に確保しても駄目だよね。
わからん。
それだと hoge[i][j][k]と書かれたコードを(*hoge)[i][j][k] と書き直さないと動かないだろうが。
あとメモリ不足てのはhogeが居座り続けると不足するから要らない時は解放する必要があるって意味だ。
0565デフォルトの名無しさん
2011/07/18(月) 00:28:51.53int (*hoge)[3][5];
hoge = malloc(sizeof(*hoge) * NUM);
だな。
0566564
2011/07/18(月) 00:31:13.35尤も、仮想三次元としてアクセスできる様に
n * XMAX * YMAX + x * YMAX + y
を計算する関数を用意しておけばわりかし移行も楽でいいね。
# つーか、これの二次元版なら実務でやったw
0568564
2011/07/18(月) 08:04:40.310569デフォルトの名無しさん
2011/07/18(月) 10:36:52.300570デフォルトの名無しさん
2011/07/24(日) 12:32:41.170571デフォルトの名無しさん
2011/07/24(日) 12:34:38.21では、どうやれば理解を妨げなかった?
パスカルみたいにする? 代わらないと思うが。
0572デフォルトの名無しさん
2011/07/24(日) 14:45:56.240573デフォルトの名無しさん
2011/07/24(日) 20:46:04.23恐ろしい勘違いをしてるのでは?
0574デフォルトの名無しさん
2011/07/25(月) 09:38:55.580575デフォルトの名無しさん
2011/07/25(月) 10:27:44.240576デフォルトの名無しさん
2011/07/25(月) 11:23:33.940577デフォルトの名無しさん
2011/07/26(火) 12:04:05.84そうでもないっしょ。
char buf[100];
fgets(& buf[0], sizeof(buf), stdin);
とかになるだけだろうから。
0578デフォルトの名無しさん
2011/07/26(火) 18:34:23.810579デフォルトの名無しさん
2011/07/26(火) 19:14:47.020580デフォルトの名無しさん
2011/07/26(火) 20:17:14.00うん
>>579
うん
>>580
うそだよーん
0581デフォルトの名無しさん
2011/08/11(木) 10:26:30.99今はJavaでもアンセーフポインタ使えるんだな
0582デフォルトの名無しさん
2011/08/28(日) 13:06:04.38それを指定するのか、そこが分らん。
確かに世の中氏名と出席番号有るのは分かるんだが、それがプログラムの世界で
なんで必要なのかがわからんのよ
0583デフォルトの名無しさん
2011/08/28(日) 17:35:45.560584デフォルトの名無しさん
2011/08/30(火) 01:36:50.880585デフォルトの名無しさん
2011/08/30(火) 19:44:51.10こういうのは可読性考えてない質の悪いfoobar言語 → C言語なソーストランスレータを使うと、
ボコボコ出てくるんだよなあ。逆に言えば、そういうのが吐いたコードを理解できるようになると、
Cのポインタ怖くなくなるかもな(だが、こんなのは書きたくはない)。
0586デフォルトの名無しさん
2011/08/31(水) 00:06:11.930587デフォルトの名無しさん
2011/08/31(水) 10:31:12.12*p = 0;
この違いを理解できずに打ちのめされる初心者カワイソス
0588デフォルトの名無しさん
2011/08/31(水) 15:42:01.540589デフォルトの名無しさん
2011/08/31(水) 19:49:59.77どんな言語でもクソ文法になる。それだけの話。
後置の演算子は、右へ右へと書き足していくから、後置の演算子は右方向へ読むことになる。
前置の演算子は、左へ左へと書き足していくから、前置の演算子は左方向へ読むことになる。
従って、
・"前置だけ" あるいは "後置だけ" で書かれた文は、単方向に読み進めれば終わる。
・前置と後置が入り乱れている文は、右へ左へ行ったり来たりしなければ読めない。
さらに、演算の結合順位を決定するために、余計なカッコが必要になって奇怪な文になる。
0590デフォルトの名無しさん
2011/08/31(水) 19:59:10.95foo(t*p)
この違いを理解できずに打ちのめされる初心者カワイソス
0591デフォルトの名無しさん
2011/09/03(土) 09:14:28.39超でかい領域になんらかの変換をかける処理を考えたときに
ここまでやった!
みたいなのが必要じゃない?
前から何バイト目って覚えておくんでもいいけど
0592デフォルトの名無しさん
2011/09/06(火) 13:56:49.29たとえ話でテキストエディタ作るときウィンドウ間や別のアプリケーション(プラグイン)や
プロセスでデータを共有したいってとき、変数名では共有できやしない。それに、いちいちAPI作って
データをコピーしていたら遅いしメモリの無駄。ポインタなら指すだけ。
Cの暗黒面嫌いなら hoge言語 → Cトランスレーター使って、必要な部分だけCで書くといいよ。
0593デフォルトの名無しさん
2011/09/16(金) 20:35:47.73C#の真似か
まあいいか
お互いに切磋琢磨する事は悪くない
0594デフォルトの名無しさん
2011/09/18(日) 08:32:04.03ポインタが難しいのはそんな部分じゃねーよ初心者は黙っとけ
コピーコストを発生させないために先頭アドレスで指し示す手法自体は大して難しくない、どの言語にもある
問題は「Cではポインタの示す先のオブジェクトは1個なのか配列なのか区別されない」ということ
例えば func(int*); に対して
int i;
int array[100];
を
func(&i);
func(array);
func(&array[50]);
のようにどうとでも渡せるという仕様が問題なんだよ
0595デフォルトの名無しさん
2011/09/18(日) 22:34:10.20その代わり速いんだよ
0596デフォルトの名無しさん
2011/09/18(日) 22:46:05.11func(&array);と強制すべきだった
0597デフォルトの名無しさん
2011/10/15(土) 05:26:44.03わざわざアドレス指さなくても変数名で指定すりゃいいし、
関数隔てるなら引数と戻り値使えばいい。
高級言語じゃ隠蔽された仕様。
最悪OSに危害加えるしな。
0598デフォルトの名無しさん
2011/10/15(土) 07:36:58.85可読性や安全性やすべて無視して自由を取ってる
0599デフォルトの名無しさん
2011/11/11(金) 10:05:15.25同意。
でもアセンブラの置き換えとしてはそれで良い。
高級言語やりたいなら他行くしかない。
言語仕様がいい加減だった昔は
2バイト型でポインタの値貰ってキャストして使ったりしてたw
それまでアセンブラでやってた手法を元に
作り手の力量でどうにでも出来るのがCの魅力だった。
組込的な事をやらなければ、ポインタの利用は最小限で済むはず。
出来れば使わないに越した事は無い、今時の強力なコンパイラなら最適化されて
ポインタだから動作が速いとか無いと思うけど。
0600デフォルトの名無しさん
2011/11/11(金) 23:20:40.40ポインタ演算子の使用を強制されるとしたら
どんなデメリットがありますかね?
0601デフォルトの名無しさん
2011/11/11(金) 23:28:03.150602デフォルトの名無しさん
2012/01/26(木) 15:21:19.580603デフォルトの名無しさん
2012/01/27(金) 15:05:49.04その小細工が最適化を妨げないという保証はない
0604デフォルトの名無しさん
2012/01/31(火) 05:53:39.96FORTRANと同等の最適化を期待出来るようになった
気を付けて使わないと危ないけど
0605デフォルトの名無しさん
2012/02/02(木) 07:42:45.40マジでどうすればいいの?
0606デフォルトの名無しさん
2012/02/02(木) 09:02:24.090607デフォルトの名無しさん
2012/02/02(木) 19:41:33.85なんでそんな必要があるのか知らんが unsafe でggれ。
MSがなんで.NETにポインタ残したのかも知らんが。
0608デフォルトの名無しさん
2012/02/02(木) 22:21:07.52fixedブロックで一時的に固定した配列かローカル変数以外のアドレスは基本的に取れないし
固定されてる期間を超えて保持してるとアクセス違反で逝く
0609デフォルトの名無しさん
2012/02/02(木) 22:54:17.15あるクラスのインスタンスをdatagrideviewにいれて変更とか表示とかしたいんだ
メンバ変数がたくさんあるからお手軽な方法がないかと思って
0610デフォルトの名無しさん
2012/02/02(木) 22:58:43.910611デフォルトの名無しさん
2012/02/03(金) 00:30:06.25表示したいクラスはたくさんあって
そのメンバ変数のint bool stringについてやりたかったんだけど
C#だとできないんだよね
カラムはクラス名 変数名 値の3つにしたくて
C++ならポインタとクラス名、型、変数名だけ覚えておけば
ポインタ通して値の出し入れまでできたんだけど
C#はわからなくて辛い
どうやってインスタンスを特定するんだろう・・・
0612デフォルトの名無しさん
2012/02/03(金) 00:32:28.33インスタンスから全部取ってこれる
0613デフォルトの名無しさん
2012/02/03(金) 10:31:09.080614デフォルトの名無しさん
2012/02/03(金) 12:04:06.54あの頃はスタックもヒープも自分でアドレスにラベルつけて管理したなあ
配列もリストもキューも自分で管理したなあ
アドレスをレジスタで計算してPCに転送してジャンプとかやってたなあ
それを思えばポインタなんて簡単もいいとこだ C偉い
…とあらためておもいました。 おわり。
0615デフォルトの名無しさん
2012/02/03(金) 12:47:28.37get field ができませんでした
配列だと勝手が違うのでしょうか?
0616デフォルトの名無しさん
2012/02/03(金) 17:07:15.530617デフォルトの名無しさん
2012/02/03(金) 22:51:36.11いいかげんC#スレに行け
0618デフォルトの名無しさん
2012/02/03(金) 23:33:33.80もうしわけございませんでした
0619デフォルトの名無しさん
2012/02/04(土) 04:19:24.16そのとうり。理解を混乱させてる原因はその文法。
int*
と書けば
int* a = 0;
a = 0;
同じことしてるのが一目瞭然。
int *
などと書くから
int *a = 0;
a = 0;
同じ事してるのに、同じ事してるように見えない。
int* a, b, c
int *a, *b, *c
の問題はその後に知ればいい。
0620デフォルトの名無しさん
2012/02/04(土) 05:21:55.54単に初期化についてちゃんと理解させればいいだけだ
じゃなきゃC++で完全に詰む
0621デフォルトの名無しさん
2012/02/04(土) 05:22:00.47ポインタが理解できない人は抽象的に考える力がないのだろう
端的にいえば数学や国語の得意な人はすぐに理解できるが苦手な人には理解できない
int *p = 0; が紛らわしいとかそういうの次元の問題はではないだろうよ
0622デフォルトの名無しさん
2012/02/04(土) 08:13:15.790623デフォルトの名無しさん
2012/02/04(土) 12:34:07.89「説明が悪いから」だと主張してる人は教えたことがないのだろう…
0624デフォルトの名無しさん
2012/02/04(土) 14:19:53.00こんなヤツらに訊くな
0625デフォルトの名無しさん
2012/02/05(日) 00:01:04.00そうそうポインタ理解するふつうの脳ミソ持ってないやつってたまにいるんだよな
でバカだから自分がプログラミングにどれくらい適性があるかも自己判断できないのな
最初から無理なのがわかんないバカ
0626デフォルトの名無しさん
2012/02/05(日) 00:46:14.410627デフォルトの名無しさん
2012/02/05(日) 02:29:51.78ただ俺はいきなりわかるわからないの話じゃなくて経験だと思うんだよねー
最初は*つけて動いたやwアハハーwでいいと思うよ
そのうち色んな場面をみるたびにそういうの細かく知るようになって
2年もたつ頃にはほぼ完璧になってるって
なんていうのかなぁ
本のしおりみたいな概念と似てるんだけど
厳密に表現するにはちと違うしでまあ表現はしにくいけど
どっかで使ってあるよく機能のうちの一つに過ぎないと思う
0628デフォルトの名無しさん
2012/02/05(日) 03:46:43.950629デフォルトの名無しさん
2012/02/05(日) 10:08:48.40こういう表現を理解できない子には無理。
矢印が分からないんじゃしょうがない。
0630デフォルトの名無しさん
2012/02/05(日) 11:10:31.06次に配列・多次元配列の扱い方、
Cでの文字列の表現、
関数の引数での参照渡し、
auto 変数への参照が関数を抜けるときに無効になることの説明、
なんだ簡単じゃん
0631デフォルトの名無しさん
2012/02/05(日) 14:13:22.66ポインタ程度でプログラミングの適性語っちゃう奴がいる事のが呆れる
0632デフォルトの名無しさん
2012/02/05(日) 17:04:34.36悪書凡書が溢れかえってるわけないだろと
0633デフォルトの名無しさん
2012/02/06(月) 06:05:27.03>>628が正しい
0634デフォルトの名無しさん
2012/02/06(月) 11:31:18.82ポインタがいかに補っているかを
あわせて説明できないとダメ
0635デフォルトの名無しさん
2012/02/06(月) 11:38:38.94ttp://builder.japan.zdnet.com/script/sp_c-programming-language/20370255/
0636デフォルトの名無しさん
2012/02/06(月) 11:59:38.02ベン図を理解できない人間が多いから集合を算数から外したことでも判るように、
抽象概念が苦手な人間にそれを理解させるのは容易じゃない。
0637デフォルトの名無しさん
2012/02/06(月) 12:39:28.83Open Article Writing ってか
新しいな
0638デフォルトの名無しさん
2012/02/06(月) 13:11:56.73> 同じ事してるのに、同じ事してるように見えない。
おなじ事してないんだけどなw
初期化と代入について勉強してからまたおいで。
0639デフォルトの名無しさん
2012/02/06(月) 17:09:05.55*s = 0;
まあどうってことないよな
0640デフォルトの名無しさん
2012/02/07(火) 11:16:37.340641デフォルトの名無しさん
2012/02/07(火) 17:46:24.07中西正和さんは「LISP入門」の中で二進木を説明するのに10ページを
要している。listですぐピンとくる人なんているのかね。
0642デフォルトの名無しさん
2012/02/07(火) 18:30:01.88やっぱり一度アセンブラ経由するのが必須なのかもしれん。
0643デフォルトの名無しさん
2012/02/08(水) 01:36:59.17というよりメモリ内でのデータ構造だな
アセンブラを経由するとローダとかの回り道があってあばばばば
0644デフォルトの名無しさん
2012/02/08(水) 02:34:45.53この3つおさえてやっとCが理解できたわ
0645デフォルトの名無しさん
2012/02/12(日) 11:54:59.41そういう色んな事を知って初めてCの仕様や長い間続いてるプロジェクトのコードが理不尽なものでないと受け入れられるのだ・・・
0646デフォルトの名無しさん
2012/02/12(日) 21:47:20.50ポインタがわからないと言ってるのはそのレベルじゃないと思うよ
ファンクタが絡んだポインタ使った定義見たら死にそうになるぞw
0647デフォルトの名無しさん
2012/02/12(日) 21:49:56.860648デフォルトの名無しさん
2012/02/12(日) 21:56:25.98void (*signal(int signum, void (*handler)(int)))(int);
0649デフォルトの名無しさん
2012/02/12(日) 21:58:23.220650デフォルトの名無しさん
2012/02/13(月) 00:30:41.870651デフォルトの名無しさん
2012/02/16(木) 10:18:51.75こんな程度で泣いてる奴はC出来ますとか二度と口にするな。
未熟者はjavaかc#でもやってろ。
cはプロ用のプログラミング言語だ。unixのカーネルはjavaでもc#でもc++でもなくcで書かれているだろう。
0652デフォルトの名無しさん
2012/02/16(木) 14:37:49.58javaでもカーネルもどきは書けるだろ↓
http://upload.naritaka.jp/uploda/javacode.png
0653デフォルトの名無しさん
2012/02/16(木) 14:51:39.94簡単な事しかやってないから簡単なんだよ。
100万行のプログラムを書いてみろ。
ポインタほど煩わしいものは無いと感じるから。
0654デフォルトの名無しさん
2012/02/16(木) 18:07:53.10分かってて当然だから
0655デフォルトの名無しさん
2012/02/16(木) 18:16:31.69って言葉だけだとちゃんと分かってるのか判断出来ないよな
「参照はあるけどCのようなポインタは無い」とか
「ポインタ演算は無い」のような表現なら分かるけど
0656デフォルトの名無しさん
2012/02/16(木) 19:48:27.25>「参照はあるけどCのようなポインタは無い」
言語ごとに「ポインタ」の定義が違うことを
ちゃんと分かってるのか判断出来ないよな
0657デフォルトの名無しさん
2012/02/16(木) 20:46:30.17>「ポインタ」の定義が違う
Javaやunsafeを除いたC#にポインタの定義というものは無いんだ
ポインタの代替をあえてreferenceという別の言葉で定義していて
説明内のpointerは「Cのようなポインタ」を指している
「Javaの中でのポインタ」というように再定義しなかったのは
言語の設計思想の中で割りと重要な点だったりする
http://java.sun.com/docs/overviews/java/java-overview-1.html
> there are no pointers in Java
C#も同様でreferenceとしている
unsafeでのポインタはポインタ演算も可能な、まんまCのようなポインタ
0658デフォルトの名無しさん
2012/02/16(木) 20:50:13.720659デフォルトの名無しさん
2012/02/16(木) 21:02:04.23>>655は>>647見て書いたから遅レスと言えるかもしれないけど
>>657は1時間前のレス宛てなのに何が「今更」なんだ?
0660デフォルトの名無しさん
2012/02/17(金) 00:09:40.45実体はGCに管理されたハンドルだから単なる演算ができないポインタとも違う
0661デフォルトの名無しさん
2012/02/17(金) 00:17:52.77「コーラを飲んだらね、なんとゲップがでるんだよ!」と大人に教える幼稚園児。
0662デフォルトの名無しさん
2012/02/17(金) 06:54:08.770663デフォルトの名無しさん
2012/02/17(金) 08:34:25.87毎日新聞 2月16日(木)8時28分配信
東日本大震災からほぼ半年後の昨年夏、東京電力の原子力部門に勤める幹部技術者が、韓国の政府関係者から食事
に招かれた。「給与はどの程度カットされましたか?」「今の待遇に満足ですか?」。幹部技術者と親しい東電幹部
によると、会食の目的は転職の誘いだった。打診された移籍先は国営の韓国企業だったという。
同じころ、東電の別の男性社員も、韓国政府関係者から面会を求められた。待ち合わせ場所に行くと、「力を貸し
てもらえないか」と転職を持ち掛けられた。韓国側からどのような処遇を提示されたかは明らかではない。
関係者によると、2人とも転職の誘いを拒否し「今も原子力部門で働いている」(幹部)というが、東芝や日立製
作所など世界最先端の原発を扱う東電の運用技術を狙った「ヘッドハンティング」の一端が浮かび上がった。
韓国では90年代以降、当時は規模が大きくなかったサムスン電子がソニーやパナソニックなど日本の花形企業の
技術者を「リクルート」して技術力を高め、日本の電機メーカーを「駆逐」し、世界有数の電機メーカーにのし上
がった経緯がある。東電幹部は「今は東電が国内外からの『草刈り場』になっている」と危惧する。
東電は原発事故による経営環境の悪化や民主党政権の「脱原発依存」「東電解体」の動きを受け、人材流出が止ま
らない。東電の内部資料によると、昨年3月の事故後の退職者(定年退職は除く)は約300人と例年の3倍以上の
ペースで増え、年度末を控えて「退職予備軍」も200〜300人にのぼるとみられている。
http://headlines.yahoo.co.jp/hl?a=20120216-00000017-mai-bus_all
0664デフォルトの名無しさん
2012/02/17(金) 08:34:42.38ど。海外の原子力企業に転職した例は確認されていないというが、すべての転職先は把握しきれていない。
「引き抜き」攻勢をかける韓国は総発電量の約3割を原子力で賄う。昨年12月には東部・蔚珍(ウルジン)で計
画する原発2基の建設が許可され、李明博(イ・ミョンバク)大統領は「我が国はエネルギー輸入国。原発建設は続
けていく」と原発推進の姿勢を鮮明にしている。李大統領は今月5日、訪問したトルコでエルドアン首相と会談し、
中断していた原発建設交渉の再開で合意。原発事故で交渉が停滞した日本メーカーを横目に韓国企業の逆転受注を
狙っている。
福島原発事故後、ドイツ、イタリア、スイスが新規の原発を建設しない「脱原発」を宣言。一方、急増する電力需
要や地球温暖化対策で米国や中国、東南アジアの新興国などで原発新設が進む。「中国がドイツの原発技術者の獲得
に動いている」との独報道もあり、技術者の争奪戦は国境を超えて激化している。
また、原発技術の流出は、核兵器の拡散防止を目指す核安全保障を揺るがしかねない。東電は原発の使用済み燃料
から取り出したプルトニウムをウランと混合したMOX燃料を再利用するプルサーマルを実施している。核兵器に使
われるプルトニウムを扱う東電の技術は「核兵器を造る能力」(資源エネルギー庁幹部)でもある。
衆院安全保障委員会の理事の一人は「原発の推進国にとって東電の技術は垂涎(すいぜん)の的。安全保障のうえ
でも東電の人材や技術が流出すれば問題だ」と警戒感を強めている。【三沢耕平】
***
0665デフォルトの名無しさん
2012/02/17(金) 08:39:50.68構文が分かり辛いという奴は分からんでもない
int *p;
int a[];
int* p, v;
型 変数名 になってないのが罠すぎる
0666デフォルトの名無しさん
2012/02/17(金) 08:49:18.390667デフォルトの名無しさん
2012/02/17(金) 08:57:11.97セマンティクスを優先するとシンタックスが牙を剥く
int* p, v; = int* p; int v;
0668デフォルトの名無しさん
2012/02/17(金) 15:38:06.050669デフォルトの名無しさん
2012/02/17(金) 18:49:30.88typedefは神
typedef int* int_p;
int_p a=0, b=0; // int_p a; int_p b=0; と同じ
a = 0;
*a = 0;
0670デフォルトの名無しさん
2012/02/17(金) 19:17:45.010671デフォルトの名無しさん
2012/02/17(金) 19:21:31.400672デフォルトの名無しさん
2012/02/17(金) 19:29:52.42いまだに素で見てもわからんw
0673デフォルトの名無しさん
2012/02/17(金) 21:10:57.54http://ocw.ouj.ac.jp/tv/1542109/
0674デフォルトの名無しさん
2012/02/18(土) 11:44:25.300675デフォルトの名無しさん
2012/02/18(土) 17:57:58.620676デフォルトの名無しさん
2012/02/24(金) 17:01:36.94多段呼び出し?
0677デフォルトの名無しさん
2012/02/24(金) 20:57:31.940678デフォルトの名無しさん
2012/02/24(金) 21:00:39.88cの頃はそんなん無かったから関数ポインタは必須だったが
0679デフォルトの名無しさん
2012/02/24(金) 21:07:31.96引数に単にオブジェクトを渡せるんだから。
で、渡したオブジェクトのメソッドを呼ぶなんてこともまた当たり前すぎて、
コールバックだのなんだのイチイチ言う必要が無くなった。
0680デフォルトの名無しさん
2012/02/24(金) 21:07:52.020681デフォルトの名無しさん
2012/02/25(土) 02:14:02.46これは無条件に信じる(暗記)するかどうかの話にすぎない。
形式を全部暗記すれば理解する必要すらないからである。
暗記力の問題だから、簡単にポインタを受け入れた人は
アセンブラレベルの具体的な話になるとまったく理解できない、それは
アレンブラレベルの何かを暗記していないだけ。
0682デフォルトの名無しさん
2012/02/25(土) 02:17:39.40からではなかろうか。
0683デフォルトの名無しさん
2012/02/25(土) 09:43:32.39int a;
char *ptr; /*その*はなんだよ!*/
a = 10;
ptr = "Hello"; /*さっきの*はどこいったんだ!*/
printf("%d %s\n", a, ptr);
scanf("%d %s", &a, ptr); /*なんでptrだけprintfとscanfの表現が同じなんだよ!わけわかんね!*/
こんな感じで戸惑ったのを思い出した。
一ページ目がこれじゃ心折れるぞw
0684デフォルトの名無しさん
2012/02/25(土) 09:54:38.05暗記は役に立たないぞ
こういうこと書いてるやつに限って
他の言語に移ったらポインタの動作を記述できなくて迷う
ポインターがないのはクソ言語だとか言い出す奴がマジでいて困る
>ptr = "Hello";
>scanf("%d %s", &a, ptr);
これはひどい。
0686デフォルトの名無しさん
2012/02/25(土) 12:29:03.64何十年も前の入門書だからよく覚えてない。ゆるせ。
もしかしたら間に
char buffer[1024];
ptr = buffer;
とか入ってたかも。
0687デフォルトの名無しさん
2012/02/25(土) 12:49:27.76だとして、
&a とすれば、1234が記録されてるメモリー番地(たとえば4567等)が読み取れる。
&記号は 通常の変数に対して使えるのだから、*記号も同様に使えればシンプルで良かった。
*a とすれば、メモリー番地1234にアクセスできる。これで十分じゃないか?
しかし実際はエラーになる。
通常の変数に * は使えない。
ポインター変数である int* a も、結局、実体はただの4byte長の数字を格納してる変数にすぎない。
通常の変数との違いは
適用できる記号が &(記録に使われてるメモリー位置を得る) だけの通常変数と、
&以外に *(記録されてる数字の、メモリー位置から読み書きする)も使えるポインタ変数。この違いだけ。
通常変数も、ポインター変数も無関係で、何にでも & と * を使えるようにすればシンプルで良かった。アセンブラの場合はこれ。
「アセンブラから始めればポインタを理解しやすい」と言われる理由はここにある。
0688デフォルトの名無しさん
2012/02/25(土) 13:13:09.540689デフォルトの名無しさん
2012/02/25(土) 14:16:08.68その、ポインタ変数と言う代物は只単にポインタ型の変数でしかない。
つまりそれは、通常変数と言う代物と型が違うだけの同じものだ。
0690デフォルトの名無しさん
2012/02/25(土) 14:18:44.29ポインタを実際に使ってない人のコメントにしか見えない
0691デフォルトの名無しさん
2012/02/25(土) 14:20:56.38そう思いたければ思えば。
そう言えば、ポインタ変数なんて風に特別視する奴に限って
ダブルポインタだとかトリプルポインタだとか言い出すよね。
0692デフォルトの名無しさん
2012/02/25(土) 14:24:31.08いや、俺はなんとなくその言わんとすることは分かるよ。
ダブルポインタとか聞かされたときに、大いにモヤッとする。
0693デフォルトの名無しさん
2012/02/25(土) 14:26:03.40int型、int *型、int **型、という理解のほうがフラット。
0694デフォルトの名無しさん
2012/02/25(土) 14:40:40.330695デフォルトの名無しさん
2012/02/25(土) 14:47:11.330696デフォルトの名無しさん
2012/02/25(土) 15:03:05.13いや実際使ったことないだろ
>>687を見返せば?
>*a とすれば、メモリー番地1234にアクセスできる
a=a+1で1235
では
*(a+1)はどこを指すんだ?
*(++a)は?
妄想はチラシの裏へどうぞ
0697デフォルトの名無しさん
2012/02/25(土) 15:06:23.380698デフォルトの名無しさん
2012/02/25(土) 15:19:19.30固定観念に嵌まって抜けられなくなっているようだね。
変数の種類が違うんじゃなくて、その変数が扱う型の違いだってことに全く気付いていない。
0699デフォルトの名無しさん
2012/02/25(土) 15:20:56.16他人に難癖つけるならまず
論理的な回答出してから言えよ
0700デフォルトの名無しさん
2012/02/25(土) 15:21:55.91この言い回しは、ム板に来てから知ったのだが、それぞれ2段、3段の
間接参照であることを簡潔に表現していて良いと思うのだが。
>>695
私が、最初にC言語を勉強したのは、Visual C++2.0 スーパーテキストという
本なのだが、ポインタ変数 + 1をアドレス値+1と誤解しているという代物だった。
0701デフォルトの名無しさん
2012/02/25(土) 15:25:31.280702デフォルトの名無しさん
2012/02/25(土) 16:34:13.36「ダブルポインタは理解できていますがトリプルポインタはちょっと自身がありません。」
なんて言われちゃうとどうもね。
0703デフォルトの名無しさん
2012/02/25(土) 16:40:17.74海外だと笑われる
0704デフォルトの名無しさん
2012/02/25(土) 17:06:47.03なつかしいな。そういうのあったな。ちょっとってなんだちょっとって。
0705デフォルトの名無しさん
2012/02/25(土) 18:02:58.890706デフォルトの名無しさん
2012/02/25(土) 19:55:21.07static void function(int a)
{
printf("my_function: %d\n", a);
}
static void caller(void (*new_function)(int a), int p)
{
(*new_function)(p);
}
int main(void)
{
caller(function, 10);
return 0;
}
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
0708デフォルトの名無しさん
2012/02/25(土) 21:14:14.64>static void caller(void (*new_function)(int a), int p)
これをプロトタイプ宣言すると
static void caller(void(*)(int), int);
となるわけで、初学者には恐怖感あるだろうな。
0709デフォルトの名無しさん
2012/02/25(土) 23:00:59.900710デフォルトの名無しさん
2012/02/25(土) 23:51:34.01int main(void)
{
int i=0;
printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",i);
return 0;
}
0711デフォルトの名無しさん
2012/02/29(水) 02:05:46.25となっているべきだと思うだがなぁ。
gcc 710.c
710.c:7: warning: too few arguments for format
0712デフォルトの名無しさん
2012/02/29(水) 14:24:16.02しちめんどくさい定義を、typedefもせず書く阿呆が
現場にいると困ります。
0713デフォルトの名無しさん
2012/02/29(水) 15:18:57.61static void caller( (r_typ(a_typ))* , int);
色々考えた上で現在の仕様(前者)になってると思うけど
後者のような宣言だと構文解析上の問題とかがあったのかな?
0714デフォルトの名無しさん
2012/03/01(木) 01:44:08.61http://upload.naritaka.jp/uploda/signifiant.png
0716デフォルトの名無しさん
2012/03/01(木) 15:27:27.51そして、これからも、無い。
どんな高級言語になろうと、if文のところで、ポインタを気にしなくてはならなくなる。
0717デフォルトの名無しさん
2012/03/02(金) 05:16:06.57ハァ( ゚Д゚)?
0718デフォルトの名無しさん
2012/03/02(金) 05:28:49.650719デフォルトの名無しさん
2012/03/02(金) 06:11:18.34明らかにあったほうがいいものなのに下手になくしたもんだから余計複雑になってると思う
0720デフォルトの名無しさん
2012/03/02(金) 06:20:44.46Javaのように、暗黙のルールでソースを記述するか、
Cのように、演算子でソースを記述するかの違いだけで。
0721デフォルトの名無しさん
2012/03/02(金) 08:03:57.64おまえもわかってないな。
javaとかがやってるのは「参照」。これは危なさは無い。
cのポインタは「参照」とは違う。
参照は、「配列の途中から渡せない」かわりに「渡された先でも配列のサイズがわかる」。
ポインタはその真逆。だからバッファオーバーフローの危険がある。
まず表記につまづくので、「ポインタの問題=表記の難しさ」と勘違いする奴が後を絶たないが、
ポインタの本当の問題は「参照でない」ということ。
0722デフォルトの名無しさん
2012/03/02(金) 08:29:39.020723デフォルトの名無しさん
2012/03/02(金) 09:44:11.08C#ではC言語を直接C#中に埋め込むことができる
ttp://mag.autumn.org/Content.modf?id=20100826141717
0724デフォルトの名無しさん
2012/03/02(金) 10:18:15.12GCのせいでアドレスは勝手にコロコロ変わる
0725デフォルトの名無しさん
2012/03/02(金) 13:10:16.430726デフォルトの名無しさん
2012/03/02(金) 13:35:35.84それはGCの実装の問題じゃないの?
0727デフォルトの名無しさん
2012/03/02(金) 13:51:13.49安全でないキャスト、ポインタ演算、配列への直接(チェック無し)アクセスを
禁止したら参照みたいに扱えそうな気がする
delete済みのポインタの保持の問題があるけど
これはGCやスマートポインタじゃないと無理かな・・・
0728デフォルトの名無しさん
2012/03/02(金) 13:53:37.49「Javaのクラスは、全てポインタ型だ!」と書いてあった。
まぁ、参照という用語がC++からの単語だから、飽くまで分かりやすくだろうけど。
0729デフォルトの名無しさん
2012/03/02(金) 20:29:08.71そういう実装を前提にして設計した結果がJavaやC#の参照なんだから実装の問題というわけではないだろ
ポインタとは根本的に違っててGCにオブジェクトを問い合わせるときのハンドル
0730デフォルトの名無しさん
2012/03/03(土) 22:46:08.380731デフォルトの名無しさん
2012/03/05(月) 00:30:34.32外部関数呼び出しインターフェースをつくるときくらいしか思いつかない。
0732デフォルトの名無しさん
2012/03/05(月) 02:36:58.230733デフォルトの名無しさん
2012/03/05(月) 02:51:27.76#define BUFFER_SIZE 128
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct NameValue NameValue;
struct NameValue {
char name[BUFFER_SIZE];
int value;
NameValue *before;/* リストにおいて、前の項目をさすポインタ */
};
NameValue *new_item(char *n, int v) {
NameValue *p;
p = (NameValue *)malloc( sizeof(NameValue) );
if(p != NULL) {
strcpy(p->name, n);
p->value = v;
p->before = NULL;/* 前の項目をさすポインタは、まだどこもさしていない */
}
return p;
}
void free_all(NameValue *p) {
NameValue *before;
while(p != NULL) {
before = p->before;
fputs(p->name, stdout);
free(p);
p = before;
}
}
0734デフォルトの名無しさん
2012/03/05(月) 02:53:03.37int main(void) {
char c[BUFFER_SIZE];
int i = 0;
NameValue *last_item;
NameValue *p;
last_item = NULL;/* 最後の項目をさすポインタは、どこもさしていない */
while( fgets(c, BUFFER_SIZE, stdin) != NULL ) {
p = new_item(c, ++i);
if(p == NULL) {
exit(EXIT_FAILURE);
}
p->before = last_item;/* 前の項目をさすポインタ */
last_item = p;/* 最後の項目をさすポインタ */
}
free_all(last_item);
return EXIT_SUCCESS;
}
0735デフォルトの名無しさん
2012/03/05(月) 02:56:46.520736デフォルトの名無しさん
2012/03/05(月) 08:32:00.93GCハンドルでも当然できるしそれすらなしに配列とインデックスでも代用できるよ
0737デフォルトの名無しさん
2012/03/05(月) 08:51:30.34インデックス(もちろんポインタでもいいが)でつなぐほうがずっと良いはずだし
1ノードずつ動的に確保するにしても、GC言語の方がメモリ効率が良い分まだマシなんじゃないの
0738デフォルトの名無しさん
2012/03/05(月) 08:55:40.16多言語やらハードウェアやらに絡まない限り無いと思う
>>733
初心者は黙っとけ
0739デフォルトの名無しさん
2012/03/05(月) 09:33:58.610740デフォルトの名無しさん
2012/03/05(月) 09:35:25.700741デフォルトの名無しさん
2012/03/05(月) 17:04:57.74思いついたのは、配列(バッファ)内の特定位置を指すエントリが大量に必要で
配列自体も複数ある場合のメモリ効率の向上・・・とか
最高効率にするには必要、というくらいでしかないけど
ポインタが64bitの環境だとして
//java 1要素:(8+4+4)byte
class Et{byte[] trgAry; int trgIdx;}
List<Et> c;
//C# 1要素:(8+4)byte
struct Et{byte[] trgAry; int trgIdx;}
IList<Et> c;
//C++ 1要素:8byte
std::vector<unsigned char*> c;
0742デフォルトの名無しさん
2012/03/05(月) 17:06:22.14//java 1要素:(8+4+8)byte
0743デフォルトの名無しさん
2012/03/06(火) 00:34:09.97そうか、Javaの参照はプリミティブタイプを指せないんだっけ?
まさか指すためにBoxingするわけにもいかないので、Etのようなものを
定義する必要があるわけですね。
ちなみに、Fortranのポインタは8byteで定義できるが、配列へのポインタ
は定義できても、ポインタの配列は定義できないので、やはり構造体にくるむ
必要がある。
integer, target :: a(200)
type Et
integer, pointer :: trgElmnt
end type
type (Et) :: c(512)
c(1)%trgElmnt => a(11)
区間を指したいときは、
type Rt
integer, pointer, dimension(:) :: trgAry
end type
type (Rt) :: b(23)
b(1)%trgAry => a(1:100:4) ! a(1),a(5),a(9),...
Fortranは裏では配列記述子(開始,終了,要素間隔)で配列を管理しているので、
Rtはすくなくとも8*3=24byteよりも大きく、実際には処理系に依存するいろいろ
な定義があるので通常これよりも長い。
0744デフォルトの名無しさん
2012/03/06(火) 00:39:33.050745デフォルトの名無しさん
2012/03/06(火) 10:59:25.560746741
2012/03/06(火) 16:01:07.25longの上位32bitと下位をそれぞれインデックスにしていまえば
javaとかでも1要素8byteで事足りた
http://ideone.com/CsWax
バッファ長が2G超えるケースは
javaの配列のサイズ限界がint_maxだから扱えないし
0747デフォルトの名無しさん
2012/03/07(水) 00:50:02.10たとえばある変数のバイトオーダーを入れ替える処理を
自分で書けと言われたら?
CとJava両方書いてみれ(別にカキコしなくていい)
0748デフォルトの名無しさん
2012/03/07(水) 01:23:14.680749デフォルトの名無しさん
2012/03/07(水) 12:07:27.47どういうこと?
>たとえばある変数のバイトオーダーを入れ替える処理を
>自分で書けと言われたら?
書かない。
0751デフォルトの名無しさん
2012/03/08(木) 03:39:11.39>自分で書けと言われたら?
ライブラリ使わせろド阿呆、って言い返す。
てか、無理にポインタ使おうとすんな。
0752デフォルトの名無しさん
2012/03/08(木) 05:59:12.20変数とセル内容を対応させるみたいなの作るときにポインタないと辛い
クラスは参照でいけんだけどint bool floatとか値型?のもんってポインタないから死ねる
0753デフォルトの名無しさん
2012/03/08(木) 06:21:14.73在日韓国人、在日朝鮮人レイシストらによる組織的な書き込みで
ニュー速+が乗っ取られる。
野球とサッカーの対立を煽り、
スポーツ分断、イメージダウン、弱体化工作をやっているのは、
在日韓国朝鮮系密入国者の子孫である。
ttp://long.2chan.tv/jlab-long/s/long1331124927127.gif
http://uni.2ch.net/newsplus/kako/
http://uni.2ch.net/newsplus/kako/o1331/ 過去ログ倉庫
http://uni.2ch.net/test/read.cgi/newsplus/1331020468/1 関連ニュース
0754デフォルトの名無しさん
2012/03/08(木) 10:45:05.68グリッドとかでメンバ変数への直接の参照を保持することって無くない?
http://ideone.com/hhkJX
それとも行エントリ自体が値型ってこと?
0755デフォルトの名無しさん
2012/03/08(木) 12:12:36.09さすがにポインタ以前の理解力の問題なんじゃないか
上で言われてるようにリフレクション使えば何の苦もないし
値型もObjectに入るはずだけど何が問題なのかわからない
0756デフォルトの名無しさん
2012/03/08(木) 12:18:38.54そんなことしなくても変数名分かってんだからリフレクションで書き換えればいいだろ
0757デフォルトの名無しさん
2012/03/08(木) 23:37:08.86>上で言われてるようにリフレクション使えば何の苦もないし
なんの苦もなくは嘘だろ
すげー大変だった
これだったら絶対ポインタあったほうがいいよ
配列かどうかまで判断しないといけないとこも死ねる
実行時型情報はあくまで型だけでインスタンスを特定できるもんじゃないんだよね
つまり、特定するにはどこどこのだれだれの〜って上からたどってこないと死ねる
>>756
ちげーよ
DataGridViewで特定の変数にアクセスしたいって言ってるのになんで別の例を出すんだ
変数名わかってもどこのインスタンスの(配列のN番目という可能性もあり)どのメンバのなかのこのメンバの12番目の要素
とかいうとこまでとってこないといけなくて面倒だろうが
ポインタだったら格納時にアドレスだけ保持って「ハイ、終了」だろが
0758デフォルトの名無しさん
2012/03/09(金) 00:16:46.63ポインタだったら簡単とか言ってるけど
そのポインタの型情報はどのように取得するの?
泥臭く手書きで網羅するの?
デバッグ情報として埋め込むの?
int*とか決め打ち?
リフレクションがどういうものなのか
理解出来ていないのでは?
0759デフォルトの名無しさん
2012/03/09(金) 00:22:48.79リストにこっそり入れときゃいいじゃん
Visible falseで
リフレクションだと俺がやった感じだとあくまで型しか取得できなくて
ポインタっぽいことはできない感じだったな
できる方法があったら教えてくれ
配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ
0760デフォルトの名無しさん
2012/03/09(金) 00:38:07.85>リストにこっそり入れときゃいいじゃん
めんどくせぇよw
てか、用途が分からん例えでイメージしづらい
> 配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ
ポインタでも同じでしょ
てか、配列をポインタで管理すると
型情報の他にもしくはNULL終端縛りかlengthまで必要になるよね
0761デフォルトの名無しさん
2012/03/09(金) 01:20:35.81同じじゃないって
リフレクションが持ってるのは型だけなんだって
馬鹿でもわかるように説明すると
void* p = &unko[12];
こういう情報をとれない
>てか、配列をポインタで管理すると
そんな話してない
DataGridViewのセル1つが変数1つに対応してる形だ
こっちが挙げてる例からなんで脱線するようなことをいうんだ
お前、ツカエネー奴だろ
会議でいっつも関係ないことを発言しだす不思議ちゃんだろ
正直、邪魔だからw
0762デフォルトの名無しさん
2012/03/09(金) 01:30:42.43例えば
abstract class FieldRef {
public abstract object Value { get; set; }
}
とでもしておいてリフレクション使うなり配列の要素使うなり好きに実装したら多態で綺麗に扱えるぞ
ポインタよりずっと柔軟だろ
0763デフォルトの名無しさん
2012/03/09(金) 02:30:10.890764デフォルトの名無しさん
2012/03/09(金) 02:31:06.14> リフレクションが持ってるのは型だけなんだって
void*で受けたら型すら分からんですよ
型が分かれば十分じゃない?他に何が必要なの?
> void* p = &unko[12];
> こういう情報をとれない
即値な理由もunkoの型も使い所もpの寿命も…
何が言いたいのか分かんない
> >てか、配列をポインタで管理すると
> そんな話してない
>> 配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ
してるじゃん
> DataGridViewのセル1つが変数1つに対応してる形だ
言ってる意味は分かるよ
型が決め打ちってことはないだろうから
デバッガのGUIフロントエンドにありがちのtreelistではなく
tree + listのツーペインのlist部分みたいな位置づけでしょ?
で、リフレクションありとなしでは手間が違うって言ってるの
バインドや取得
どう考えてもめんどくさいよ
0765デフォルトの名無しさん
2012/03/09(金) 05:50:57.22カラム毎に別の変数てのはちょっと賢くないなあ。
0766デフォルトの名無しさん
2012/03/09(金) 06:25:18.09超馬鹿だなお前
わかりやすい例出してやったのに
型がわかってもunkoの12番目っていう12番目ってところを保存できねーだろが
本当にカスだなお前
ってか、お前がリフレクション使ってなんにもやったことがないのはわかった
0767デフォルトの名無しさん
2012/03/09(金) 08:56:18.85>>754のソースじゃ駄目なの?
あとこういうのは?
http://ideone.com/nrlQw
0768767
2012/03/09(金) 10:20:14.74http://ideone.com/ThC5i
class Entry{
public int n;
public int[] na = new int[15];
}
public static void Main(){
{
Entry et = new Entry();
ICell c = Bind(et.na, 12);
c.Set("200");
et.na[12] += 50;
Console.WriteLine(et.na[12] + " " + c.Get() + " " + c.Type()); // "250 250 System.Int32"
}
{
Entry et = new Entry();
ICell c = Bind(et, "n");
c.Set("500");
et.n += 50;
Console.WriteLine(et.n + " " + c.Get() + " " + c.Type()); // "550 550 System.Int32"
}
}
0769デフォルトの名無しさん
2012/03/09(金) 12:31:42.57int main(void)
{
char a[][13]={"前田敦子","大島優子","渡辺麻友"};
int i;
for (i=0; i<3; i++)
printf("%s\n",*(a+i));
return 0;
}
0770デフォルトの名無しさん
2012/03/09(金) 15:47:46.93例外なくカリカリしており、例外なく喧嘩っ早く、
流暢に煽り文句を並べるのが得意である。
その書き込みから滲み出る雰囲気たるや、
工事現場のヤンキーなDQNと全く変わらない。
さすが、デジタル土方と言われるだけのことはある。
0771デフォルトの名無しさん
2012/03/09(金) 23:14:04.230772デフォルトの名無しさん
2012/03/10(土) 01:14:26.00お前、人の話聞く気ないならわざわざクビ突っ込まないほうがいいぞ
0773デフォルトの名無しさん
2012/03/10(土) 14:26:08.58馬鹿丸出し
0774デフォルトの名無しさん
2012/03/10(土) 15:17:37.74え?話の内容理解してたの君?
0775デフォルトの名無しさん
2012/03/10(土) 15:27:53.15ゆとり世代はキーワードだけ拾って
思い込みで返答しちゃう奴多い
0776767
2012/03/10(土) 18:32:08.71>リフレクションが持ってるのは型だけなんだって
型だけでなくどのクラスのどのメンバって情報持ってるよ
>void* p = &unko[12];
>こういう情報をとれない
ICell c = Bind(et.na, 12); で情報を保存出来てるよ
配列でないメンバも同様
ICell c = Bind(et, "n");
構文は関係無いよね?
>>764
>unkoの12番目っていう12番目ってところを保存できねーだろが
同上
>>772
認識は上に書いた通りなんだけど
出来れば具体的に指摘して欲しい
0777デフォルトの名無しさん
2012/03/10(土) 19:16:42.40え?そんな特定の型限定のソース出されて言われても困るんだけど
0778デフォルトの名無しさん
2012/03/10(土) 19:53:13.02出来ないって事でよくね?
もちろん、(unkoさんには)出来ないという意味だが。
0779デフォルトの名無しさん
2012/03/10(土) 21:42:02.79そんなレベルの話?
C/C++でもvoid*のままじゃ読み書き出来ないでしょ
UIとしてString、例としてintの実装だけ書いたけど何も限定されてないよ
それにDataGridView使うなら基本的な型用のUIは揃ってるから
Type渡すだけユーザーが入力した文字列を勝手に変換(int.Parseとか)してくれるよ
0780デフォルトの名無しさん
2012/03/11(日) 04:26:54.84ほれ行ってこい
0781デフォルトの名無しさん
2012/03/11(日) 04:30:31.64ああ違ったこっちか
0782デフォルトの名無しさん
2012/03/11(日) 05:45:09.31だから上から読めって
思い込みで話しすぎだろお前
0783デフォルトの名無しさん
2012/03/11(日) 05:57:26.14unkoの人はcodepadなりideoneで
さっくりコードで示したらいいんじゃないかな?
察してもらう→諭される
この繰り返しは不毛だし
本人もそんな扱いされるのは苦痛じゃない?
0784デフォルトの名無しさん
2012/03/11(日) 08:13:49.30ああ分かったよ、あんたには無理だわw
まぁ頑張ってね
0785デフォルトの名無しさん
2012/03/11(日) 14:13:22.31いや、別に回答してくれなんて頼んでないけどw
こっちが知りたい内容はもうわかってるんだし
話題を続けようがないしw
0786デフォルトの名無しさん
2012/03/11(日) 18:22:07.66あなたは既に、被爆されているんですか? え〜 ホントに怖いねえ。
もう直ぐ東京にも 大地震が発生して、もう死んでしまうのですか?(小笑) あ〜 それだと良かったです。
私は人を殺すことを想像し?、頻繁にすれば? その存在が日本人でした。
私は実際に 日本人を殺すことは ないと思った。自分で 自滅してくれるんだな、この?民族は。 あ〜気持ちいい。
それでは これから日本の復興をずっと見守りながら、楽しんでまいります。一瞬で?死んでください、日本人の皆さん。
ttp://www.youtube.com/watch?v=0X8Uo4rKoVk
前スレ
韓国の青年がYouTubeで「日本人の皆さん、地震で死んで下さい」とメッセージ 2
http://engawa.2ch.net/test/read.cgi/poverty/1331454768/
0787営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 17:15:36.87forやifは条件を分岐させたり繰り返したりする、これは誰でも理解できるし必要性も分かる
配列や構造体も、それを利用する際に特別な宣言を用いて利用する、これも他と差別化しやすい
ただポインタに関しては「概念」や「内部構造」の話になっている
俺もポインタが全くわからんが、わざわざポインタを利用する「必要性」が無いという事は理解できる
もちろん優良なプログラムを組む上では欠かせない要素ではあるだろうが
昨日今日に、文字の出力や条件分岐を学んだ段階の人間には、まだまだ早すぎる知識
これが理系の悪いところ
物事の必要性や順序をうまく説明できない
説明するとなると、妙に入り組んだ話になったり
別の聞きなれない単語を持ち出したりしてと
話を聞けば聞くほど、こんがらがってくる
かと思えば、抽象的で漠然としたイメージの話をしだしたり
そのイメージも、人それぞれで違っているから更に分かりづらい
ひょっとしたら、どいつもこいつも「分かってるつもり」で「なんとなく使えてる」だけで
その真意には届いていないのではないか?とも思えてしまう
だから重要なのは
「必要性」「重要性」「利便性」
この3つを押さえて、ポインタを利用しなかった場合にどういう手間やデメリットが発生するのか
という具体例も持ち出してくれないと理解に苦しむ
制御文や配列のように、使い方が明確化されていればこんな苦労も無いのだが・・・
0788営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 17:46:26.00そんだけ
配列とかと同じ
0789営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 17:50:24.84関数に配列の先頭アドレス渡すのって合理的じゃね?
変数のサイズ、構造体のサイズってのを理解している段階であれば分かるはず。
0790営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 23:46:46.69ここで聞いても答えはでんだろ
他の人の意見を聞くならまだしも
お前が信じるかどうかなんて知ったことじゃねえ
0791営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 23:49:54.480792営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 00:53:28.26動画だったらこれをさらに数十枚分キャッシュとかが普通なわけで
まあ、せいぜい数KB程度の配列や構造体しか扱ったことのない者には、なかなかありがたみはわからんかもね
0793営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 01:11:00.92コインロッカー=実際の変数
封筒=ポインタ変数
週刊少年ジャンプ=実際の変数の中身
ジャンプの号数と、ロッカーのナンバーは相互関係にある
(例 ジャンプ40号は40番のロッカーに入っている)
とした場合
封筒の中に、コインロッカーの番号を書いた紙が入っており
その紙に書いた番号を参照することで、目的の号数のジャンプを手に入れることが出来る
という解釈でいいんだろうか?
0794営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 01:32:08.74方眼紙のマス一つが1バイトみたいな感じで抽象的に考えたほうがいいと思う
0795営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 05:40:48.13必要性もクソも、ポインタを備えた言語は多くの場合
他の言語にあるような「参照」がないんだからさ…
0796営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 10:17:10.90配列操作はポインタ無い方が最適化しやすいでしょ
0797営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 12:16:00.08>>789
>>792
おまえらが言ってるのはただの「参照」。
そんなのはjavaやその他の言語にもある。
ていうか配列を丸ごとコピーする実装の言語なんてたぶん無いw
ポインタが難しいのはそこじゃないことを判りもしないで恥ずかしいレスすんな。
0798営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 20:11:03.67難しいのがどこか言わずにそんなレスしても恥ずかしいだけだぞw
0799営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 08:24:48.190800営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 09:10:11.090801営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 11:27:12.98似非ぷろぐらまを排除する性質については認める
0802営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 15:22:23.810803営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 15:22:56.98アドレスのn番地を指し、そこからmバイトを型xと看做す。そう教えてくれてるだけー^^
0804営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 15:53:58.420805営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 16:04:22.040806営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 16:08:50.79>>797が「ポインタが難しい」って言ってるのは>>797の頭が悪いからで、
頭悪くない人にはポインタはどこも難しくない。つるっと入ってくる。
0807営利利用に関するLR審議中@詳細は自治スレへ
2012/04/01(日) 18:28:51.75アドレスの格納先は変数だけど、サイズや型情報が送られるのは構文解析器の方じゃね?
>>804
こんなもんだろ
0808営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 12:28:21.19ポインタのどこが難しいのかどうか教えて下さい。お願いします
スレタイ同様、私には「ポインタを難しいと言う奴が理解できない」ので
0809営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 13:19:38.20下手に例えるとよくないぞw
ポインタでそんなんだったら、
OOPにおいてはまたワンワンニャーニャーして遠回りしてしまうぞ。
0810営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 15:02:35.48で、なんでそれを >>799 に訊こうと思った?
0811営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 08:48:18.31断片的に何度か書いているが、もっかいまとめてみる。
まず参照だ。コードの例で示してみる。
void func_a() {
OBJ a = new OBJ[10000]; //でっかい配列
func_b(a); //関数内では参照している
//なんかの処理
//ここでaは不要になるので、コンパイラは自動的に解放処理を呼び出す
}
void func_b(OBJ b) {
//なんかの処理
//ここでbは不要になるので、コンパイラは自動的に解放処理を呼び出す
}
こんなコードがあったとする。func_bにはaの参照を渡している。
ここで大事なのはaとbの解放タイミングがわからない点だ。どちらかの処理が済んでないのに、もう片方を解放したら落ちてしまう。
さて、参照とポインタの違いは「参照ならポインタ以外のワークも共有できる」という点だ。この場合ならbに渡す時に、「この変数は2箇所で使われている」という情報を書き込むことが出来る。
それにより、aおよびbの解放時に、じかに解放するのでなく、「使われている回数を1引き、0になったら解放する」という処理に変えることで、安全に解放処理を呼び出すことができる。
ポインタではそうはいかない。func_bに渡されるのはaかもしれないし、&a[1]かもしれない。するとワークは渡せないので、もちろんfunc_bで解放することはできない。すると解放処理をプログラマにやらせるしかない。
だからfree関数が用意されている。しかし上記のケースでは、func_aがfunc_bより先に終わるかもしれないから、安易にfunc_aの末尾でfree(a)などとやったら落ちてしまう。これがポインタの難しいところだ。
0812営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 08:49:28.680813営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 11:35:18.84それで何が言いたいのか知らんが、スマートポインタって聞いたことないの?
0814営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 11:52:58.210815営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 12:18:44.16アスペ乙
0816営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 12:40:13.80そういうのはポインタどうこうより
ファイルハンドル等でも同様のリソース管理の話じゃないのか?
C++ではRAIIで扱えばいいだろう
0817営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 16:41:57.57なるほど、「難しい」というだけあってまるで理解していない。
帰れ。
0818営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 17:16:40.82参照参照つっといて、いわゆるC++の参照/ポインタという関係じゃないのなw
しかも非同期で排他処理の部分を持ち出して何がいいたいのやらw
0819営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 18:48:00.32否定するために読んでる奴らの頭には何を言っても通じないようだな。
そうやって勝手に罵り合ってろよ。
0820営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 19:49:39.30何を言っても通じないのは>>813-818を否定の一言で片付けるお前さんの方かもしれんよ
0821営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 12:38:38.24#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
void* f(void* a) {
sleep(1);
printf("%d\n", *((int*)a));
}
g() {
int* a = malloc(sizeof(*a));
*a = 123;
pthread_attr_t pta;
pthread_attr_init(&pta);
pthread_attr_setdetachstate(&pta, PTHREAD_CREATE_DETACHED);
pthread_t pt;
pthread_create(&pt, &pta, f, (void*)a);
free(a);
}
main() {
g();
sleep(2);
}
0822821
2012/04/04(水) 12:43:36.76(この手のバグは発見が難しいので重要)
0823営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 13:40:31.61>>811にもかいてあるように、「非同期で」っていう説明で十分だよ。
それで分からないやつはここにはいないだろう。
0824営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 13:41:01.360826営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 18:45:10.46排他制御やリソース管理、例外安全、等々も難しく感じるかもしれない
スカラ的な頭の良さなのか、それとも向き不向きのようなものか分からないけど
メモリに関してはGCによって凌いだとしても
その先で壁に当たりそう
0827営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 18:46:12.27>「必要性」「重要性」「利便性」
これを「自分で考えようとするかどうか」がひとつの境界なんじゃないかと
0828営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 18:48:56.20難しい、というよりは素直に表現すると、単に複雑さの問題だな。
0829デフォルトの名無しさん
2012/04/14(土) 09:16:16.86同様にポインタに関しても分離論理とか使うやり方があるから感覚が無理ならそういう方向から攻めるのも手
0830デフォルトの名無しさん
2012/04/14(土) 15:46:39.14一番単純なポインタは確保された実データが入ってるメモリの位置を示すアドレスが入ってる変数でいいんだよね?
配列なら先頭のアドレスが入ってる。
ポインタaへのポインタbとなると、ポインタbにはポインタaを指すアドレスが入っていて、
結局はポインタaが指すアドレスにあるデータが変わるってだけなのかな??
0831デフォルトの名無しさん
2012/04/14(土) 16:47:36.910832デフォルトの名無しさん
2012/04/14(土) 17:03:53.00int main(void)
{
int x;
int *y = &x;
*y = 10;
printf("%d", x);
return 0;
}
0833デフォルトの名無しさん
2012/04/14(土) 18:39:14.17>一番単純なポインタは確保された実データが入ってるメモリの位置を示すアドレス
一番単純も何も、ただそれだけ。
>が入ってる変数でいいんだよね?
ポインタ変数は変数だけど、ポインタは変数じゃない。定数もありうる。
0834デフォルトの名無しさん
2012/04/14(土) 22:02:06.09初心者向けに良くある例文コードでだいたいを理解出来たら馬鹿だと思い知らずにすむのですが・・・。
>>833
>>32が解らない方で、>>57が、もしそのまま実践してくれるのなら凄く親切な講師。
そんな事を思いつつ、試しに聞いてみました。
参照型の一つの種類のようなものだと思うのですが、ポインタaへのポインタbみたいな、
>>832の int *y = &x; もxのアドレスをポインタyに入れて10を代入してそのままxに10が入る。
ショートカット、エイリアス、シンボリックリンクみたいなものとしてそればいいのかなんなのやら。
定数もポインタが示すアドレスにあるものを指す、と言う理解でいいのか・・・。
0835デフォルトの名無しさん
2012/04/15(日) 12:16:04.52http://ideone.com/KoEwp
http://ideone.com/KkH5E
配列の基本が理解出来たら大体分かったと思っていい
車で言うとJavaとかはオートマ、C/C++とかはマニュアル
その後にポインタ演算、スタック、ヒープ
Javaの参照との違いとか色々知っていけばいい
(java)
class Main{
static void f(int[] a){ a[0] += 5; }
public static void main (String[] args) {
int[] a = new int[1];
a[0] = 10;
f(a);
System.out.println(a[0]); // 15
}
}
(C++)
#include <iostream>
void f(int* a){ a[0] += 5; }
int main() {
int a[1];
a[0] = 10;
f(a);
std::cout<< a[0] << std::endl; // 15
return 0;
}
0836デフォルトの名無しさん
2012/04/15(日) 20:59:29.490837デフォルトの名無しさん
2012/04/16(月) 16:34:45.690838デフォルトの名無しさん
2012/04/16(月) 17:14:17.340839デフォルトの名無しさん
2012/04/21(土) 23:41:40.87ミ ∠_)
/
/ \\
ウイーン Γ/了 | |
ウイーン |.@| | | ガッガッガッ
| / | . 人
|/ | < >_Λ∩
_/ | //. V`Д´)/
(_フ彡 /
0840デフォルトの名無しさん
2012/05/14(月) 06:34:56.540841デフォルトの名無しさん
2012/05/27(日) 19:09:08.710842デフォルトの名無しさん
2012/05/27(日) 19:48:36.750843デフォルトの名無しさん
2012/05/27(日) 19:49:55.95どっちかっつーとC言語の悪影響だと思う
単に表記が解りにくいだけだったのを、ポインタそのものの問題にすり替えちゃった
0844デフォルトの名無しさん
2012/05/28(月) 14:38:06.66俺は全てをポインタにしてる。
引数に限らずそもそも参照は、戻り値の時ぐらいしか使わない。
0845デフォルトの名無しさん
2012/05/28(月) 15:01:14.58hoge *fuga = new Fuga();
fuga->hage();
return *fuga;
}
こうですか?
0846デフォルトの名無しさん
2012/05/28(月) 15:06:19.530847デフォルトの名無しさん
2012/05/28(月) 18:29:28.77NULLを許容しないとき
0848デフォルトの名無しさん
2012/05/28(月) 19:57:01.40・コピーコンストラクタ(C++11ならmoveコンストラクタも)、operator=は参照。
・swapも参照。
・API等既存のライブラリに合わせる必要があるならそれに合わす。
それ以外は
・void*は参照で代わりが効かないのでポインタ。
・read-onlyで参照が取れるならconst付き参照。
・書き込みがあるならポインタ。
ポインタはスマートポインタを含む。
0849デフォルトの名無しさん
2012/05/28(月) 22:25:42.21どう形容すべきか分からないんだが、なんかこう、気持ち悪い。
演算子オーバーロードとかにほぼ必須だってのは何となく解るんだけど。
0850デフォルトの名無しさん
2012/05/29(火) 09:38:11.86■ このスレッドは過去ログ倉庫に格納されています