1read 100read
2012年6月プログラム316: ポインタを難しいと言う奴が理解できない (850)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
【SL4】Windows Phone 7 アプリ開発スレ Part3【XNA】 (607)
最も美しいプログラミング言語は? Part6 (328)
HTAをもっと流行らせる計画 Part2 (621)
【会津】パソコン甲子園2004【若松】 (777)
MATLABプログラミング 質問箱 その3 (873)
C#,C#の宿題片付けます。 (772)
ポインタを難しいと言う奴が理解できない
- 1 :08/07/27 〜 最終レス :12/05/29
- int i = 10;
int * p = &i;//int型ポインタpにiのアドレスを代入する
簡単。
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。
- 2 :
- >>1
5ポイント
- 3 :
- str1 = "別の文字列"; //エラー
str2 = "別の文字列"; //OK
上と下どっちを使うか状況によって異なる。
同じとかいってしまっているお前は、結局何も理解出来ていない。
- 4 :
- if(sizeof(str1) == sizeof(str2))
puts(">>1は天才");
else
puts(">>1は愚か者");
- 5 :
- >>1
つ、釣られないぞ!
- 6 :
- * を両方から離して書くのは
かけ算と紛らわしいので嫌い
- 7 :
- その昔、ポインタの冒険と言うゲームがあってだな
- 8 :
- code、data、bssの何処に配置されるのかが重要
- 9 :
- >>1
*(s+5)
s[5] (⇒ Compile時に*(s+5)に変換される)
5[s] (⇒ Compile時に*(s+5)に変換される)
は全部同じ意味だから当たり前だろ。
- 10 :
- ↑はずれ
- 11 :
- 実務で使うようなGUIプログラミング・Windowsプログラミング(CとC++どちらも必須。他言語のGUIは遅すぎる)を学びたいなら、
構造体とポインタの絡みくらいは理解しておく必要がある。
これを理解しておかないと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
他
- 12 :
- >>10
はずれはお前の頭だ
- 13 :
- * と []は同じ
- 14 :
- とは限らない
- 15 :
- char str1[] = "abcde";
char *const str2 = "abcde";
これならよかったのに
- 16 :
- ここはバカのすくつか・・・。
char (*p)[6] = &str1; // OK
char (*p)[6] = &str2; // Error
if (sizeof str1 == sizeof str2) {
puts("same");
} else {
puts("different"); // こっちが出力される
}
- 17 :
- str1[0] = 'A'; // OK
str2[0] = 'A'; // 未定義動作
これもだな。
- 18 :
- str2はただのアドレスを格納するだけの変数(普通は4byte)
str1は実体を持つ(char*6 = 6byte)
"abcde"は定数でメモリのナンチャラ領域に密かに存在したまま。
- 19 :
- "abcde"はfree()が必須ですか?
- 20 :
- お前は一体何を言っているんだ?
- 21 :
- 1.str1は定数で、str2は定数じゃない。(str1++とか出来ない。)
2.str1の指す領域は変更可能で、str2に関しては未定義。
って感じ?
- 22 :
- あ、いや、その・・・・
ポインタは理解できる。
がしかし、
ポインタのポインタが出てくるともう俺の頭はオーバーヒートしてしまう。
すんませんVBしか触ったことがないもので。
- 23 :
- こんなテキストベースのコミュニティで聞くより
>>11の本を買って視覚的に学んだほうが早い
- 24 :
- くだらない本を読んでいる暇があったら、アセンブラをかじればいいだけ。
- 25 :
- 前スレかもしれない
ポインタはどうやって学ぶべきか
http://pc11.2ch.net/test/read.cgi/tech/1193166476/l50
- 26 :
- >>25
そうでもない
ポインタはどうやって学ぶべきか part2
http://pc11.2ch.net/test/read.cgi/tech/1217147291/
- 27 :
- ポインタのポインタを理解できないようでは
ポインタが理解できているという言葉も怪しいな。
- 28 :
- ポインタは理解できたけど、ポインタのポインタが理解できないってのは
大抵ポインタは配列の表現を変えた物と認識している
で、ポインタのポインタ=二次元の配列と考えてしまい混乱する
- 29 :
- ポインターが理解できないのは
mov eax,esi
と
mov eax,[esi]
の違いがわからないのと一緒。
この違いがわかればポインターが難しいはずがない。
- 30 :
- 文法が曖昧で難しいのであって、ポインタが難しいのではない
- 31 :
- このスレタイみたいなことを職場でいう奴がいると本当に萎える
ポインタが分かる・分からないという話自体、ど素人が好む話題だから
- 32 :
- ・なぜポインタを使う必要があるのか
・どういう場合にどういう風にポインタを使うべきなのか
この二点を誰も説明してくれないんだよなあ。
山ほど解説書を買ったけど、前者について解説している本は皆無。
後者については、関数の引数を参照渡しして直接更新して返す
サンプルくらいしかない。
これで理解して使えという方が無理だ。
- 33 :
- > 理解して使えという方が無理
そう、だから理解しないでなんとなくコード書いて、
そのうちなんとなくみんな分かってきた気になるというのが現状。
悩んでいる暇があったらとりあえず何か書いてみ。
- 34 :
- >>33
いや、俺は理論から入る人間だから
使う必要性を理解してからでないと使いたくないんだ。
ただ一つ、最近の本で「配列とポインタではポインタの方が
実行速度が速い」という記述を読んだ。
これだよこれ。こういうのをなぜ一番に言わないかね。
初心者は、同じことを配列でできるのに、なぜわざわざポインタを
使うのか、そのことで悩んでるんだから。
「配列とポインタはやってることは同じだけどポインタの方が速い」
この一言だけでポインタを使う理由になるじゃないの。
- 35 :
- >>34
俺も理論から入る人間だからこそ言える。
たぶんそういう考えの俺らはPG/SE/PMには向いてないよ。
- 36 :
- この業界の出来る人というのは、常に最新の技術を追い続けている。
必要有か無か、流行るか流行らないか、の判断も付かないうちから、最新技術に興味を示す。
- 37 :
- 実は大嘘
配列とポインタでは配列のほうが実行速度が速い
- 38 :
- >>34
プログラムなんてどんな言語で作られたモノであろうと結局はCPUがメモリのアドレスを行ったり来たりしている。
隠蔽されてないアセンブラ・Cが速いのは当たり前。
勿論、零細企業で小規模システムの開発しかしていない人にとってはJavaどころかVBでも十分
- 39 :
- 速度と省メモリ
- 40 :
- 結論:ポインタを考えた奴は馬鹿
- 41 :
- C言語の文法が糞
もっと紛れのない文法の高級アセンブラが普及すべきだった
- 42 :
- ポインタの必要性くらい書いてある本はある。
書いてないようなら捨ててしまえ。
- 43 :
- >>40
>>41もいってるが文法がクソなだけ。
先にポインタの概念を取得してからCに入れば
表現の違いでしかないんだけどな。
- 44 :
- >>32
やっぱプログラミングの入門書には
データ構造の話とかも書くべきだよな。
>>34
ちょwwwwwwwwwwそんな理由www
- 45 :
- >>34
それが事実じゃないからさ
ポインタと配列は別物であり、使える場所も変わってくる
例えば関数の引数として使えるのはポインタだけで
配列使ってるように見えるのは見せ掛けで実はポインタ使ってるとか
そういう細かい事実があるわけ
今の処理系じゃポインタの方が速いなんてことも別にないし
- 46 :
- >>37
ハァ?
メモリ上の配列とポインタの事言ってんだったら変わらねーよ。
例え配列がスタックで、ポインタの方をヒープのつもりで発言してても、
確保に時間が掛かるだけで、アクセス速度は変わらん。
- 47 :
- 特定のコンパイラの実装・最適化の話とか?
まー配列の方が当たりをつけやすい場面が多いとはおもうけど
それをもって速いってのもなぁ。
- 48 :
- ポインタ判らないとかいってるやつはクローじゃ、ラムダ指揮、公開関数(なぜか変換できない)理解できるのか?
- 49 :
- 訂正
→できないのかな?
- 50 :
- Cのポインタは参照・束縛の概念だけじゃなく
メモリアドレスを意識できなくちゃいけないしな。
ポインタ自体の演算や型キャストもできるわけだし
高級言語にくらべたら無法に近い。
>>48
一見関係ないように思えるけど……。
- 51 :
- Cでポインタを使わなくてはならないケースは
malloc関数で動的にメモリを確保して使う場合と
scanf関数の引数だろ。
これ以外でポインタを使う香具師はDQN。
- 52 :
- >>46-47
機械語レベルの話だから別にいいよ
説明する気もないし
- 53 :
- リンカのことを考えれば
>>29にたどり着く。
- 54 :
- >>51
| | | | | | | | | | || | |
| | | レ | | | | | J || | |
| | | J | | | し || | |
| レ | | レ| || J |
J し | | || J
| し J|
J レ
/V\
/◎;;;,;,,,,ヽ
_ ム::::(l|l゚Д゚)| …うわぁ
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
- 55 :
- 後半は釣りだが、それまでmallocの話が出てこなかったのは異常。
- 56 :
- >>52
× 説明する気もないし
○ 説明する能力もないし
- 57 :
- 1. 配列を関数に渡す際にどうしても必要
2. 構造体を関数にコピーレスで渡したい際にどうしても必要
3. 別関数内の変数の値を変更したい際にどうしても必要
4. メモリを動的に確保する際にどうしても必要
5. 特殊なデータ構造を実現する際にどうしても必要
ポインタがどうしても必要になるケースは、普通はこのくらいかね。
他にも使う状況はなくはないと思うが。
- 58 :
- >>56
煽っても何もでないよ
- 59 :
- 【ポインタがないと?】
void 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と書かれた紙が表示されるのであっためでたしめでたし」
- 60 :
- void func(char *c){
c = 'z';
}
int main(){
char subarac = 'a';
func(subarac);
printf("%c",subarac);
}
この場合を教えてくれ
- 61 :
- >>60
ひと目で間違いに気づかないとか、もうね…
- 62 :
- >>61
わざとやってるんだが
- 63 :
- ポインターはどこでもドア。
好きなところに移動してデータを置ける。
開けた先がお風呂だと大変なことになる。
- 64 :
- >>63
お風呂が溢れちゃいますね。
- 65 :
- >>60
コンパイルエラー
- 66 :
- 警告は出るがコンパイルはできる
PPP.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
- 67 :
- >>57
おお、いいね。
これを五つの章構成にして
実例とともに詳細解説を加えれば
画期的なポインタの解説書になるよ。
たぶん、今までこういう本はなかったよ。
本を出したら俺は印税の一割でいいよ。
- 68 :
- 1. 配列を関数に渡す際にどうしても必要
可変個引数で渡せる
- 69 :
- そもそも、配列を使うためにはポインタ演算が必ず行なわれているわけだが。
p[i]というのは*(p+i)でしかないのだから。
# だからこそi[p]という書き方もできるわけで、3["abcd"]なんてこともできると。
- 70 :
- 仮引数を [] で受けてたら、ポインタを使っていることに
気づかない奴もいるかも知れない。
- 71 :
- そこをきちんと説明しないから理解できないのではないかと思う。
- 72 :
- scanfを教えるときに&を{おまじない}として教えるのも良くないと思う
- 73 :
- ポインタの使いどころを書いてる本がないってことはないと思うんだが。
- 74 :
- #include<stdio.h>
char 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
- 75 :
- char str1[] = "abcde";
だと長さが5の配列の実体が出来ると思ってたんだけど違うのか?
char *str2 = "abcde";
だとリテラル"abcde"のアドレスをstr2に代入すると思ってたんだけど違うのか?
- 76 :
- >char str1[] = "abcde";
>だと長さが5の配列の実体が出来ると思ってたんだけど違うのか?
違う。長さは6。
>char *str2 = "abcde";
>だとリテラル"abcde"のアドレスをstr2に代入すると思ってたんだけど違うのか?
あってる。
- 77 :
- >>69
いいや
配列p[]を *(p+i)でアクセスするのは無理だろ
- 78 :
- >>77
自信満々に書く前に、ちょっと確認してみたら?
#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;
}
- 79 :
- >char str1[] = "abcde";
なんで長さが5なの?
- 80 :
- \0を忘れていました。
- 81 :
- char str1 = {'a','3','-','o','ω'};
- 82 :
- アドレス空間の概念が理解できてないとポインタが理解できないんじゃない?
あと、できればスタックとヒープの違いぐらいは理解して欲しいけど。
そもそもC言語の場合、スタックにたくさん積みたくない→ポインタの概念導入、っていう流れの気がする。
- 83 :
- >>78
すまぬ
だがこういうのよく使わないかな?
sizeof (a) /sizeof (a[0])
ポインタと配列混同すると痛い目にあう例だが
- 84 :
- だが
のつながりがよくわからないです
- 85 :
- >>83
配列とポインタの区別がよくできていないことが判りますね。
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;
}
- 86 :
- きっと配列へのポインタも理解できてないんだろうなあ。
short (*pa)[3] = a;
- 87 :
- C言語でint[100000000000000]とかにしちゃうとエラーになるんですけど
(コンパイラだかリンカだかの制約でスタックには○○MBしか積めないルール)
他の言語でも同じなんですか??
Java,VB,Ruby
- 88 :
- >>86
そんな危険な宣言すんなよ。
- 89 :
- >>87
仮想メモリとして扱う処理系もあるし、そのエラーと言うのは全部の処理系で確認した?
- 90 :
- >>87
>C言語でint[100000000000000]とかにしちゃうとエラーになるんですけど
sizeof(int) が4だとして、300テラバイトを超えるメモリを割り当てられる処理系が思いつかない。
- 91 :
- >>85
$ ./a
2, 4
6, 2, 2, 4
4, 2, 2, 4
ところで
short *ponta = a;
とやってもsizeof(ponta)は4byteでしかない。
aを使わずにqが指すshort配列の大きさを調べることはできないの?
- 92 :
- 配列へのポインタ
と
ポインタの配列
の違いと宣言文法が分からない。
- 93 :
- 訂正
>aを使わずにqが指すshort配列の大きさを調べることはできないの?
aを使わずにpontaが指すshort配列の大きさを調べることはできないの?
- 94 :
- BCCでもGCCでも
int[200万]あたりでエラーになる。メモリは6GB積んでるのに
- 95 :
- >>86
アホか
それはポインタの配列だろ
- 96 :
- >>92
short (*p2a)[X]; // p2aは short[X] を指すポインタ
short *(p2a[X]); // p2a[X] は short を指すポインタ
short *p2a[X]; // 同上
>>93
不可能。
>>94
その配列が静的か動的かによって違う。
つか、6GB積んでたって全部1プロセスで使えるとも限らん。
>>95
1から勉強し直せ。
- 97 :
- >>96
結局ポインタの配列ってのは?
- 98 :
- ・ポインタの配列
[アドレス][アドレス][アドレス][アドレス]・・・
と言う風にアドレス空間にポインタの配列が確保されていて、アドレスが入っている。
・配列のアドレス
アドレス
↓
[データ][データ][データ][データ][データ]・・・
配列の先頭アドレス。インクリメント時にサイズだけインクリメントされる。
・配列のアドレスを保持するポインタ
ポインタ
↓
[アドレス]
↓
[データ][データ][データ][データ][データ]・・・
これが
(*p)[i];
だと思う。「配列のアドレス」を略して「配列」って呼ぶのはちょっとどうかなと思う。
わかりにくい。
- 99 :
- ちなみに俺は
int i, *p, *a;
・・・
p = a + i;
って書き方はしないようにしてる。
int i, *p, *a;
・・・
p = &a[i];
って書くようにしてる。
理由は俺がアホで理解しにくいから、
- 100read 1read
- 1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
「Cでプログラミングするには人生は短すぎる」か? (311)
MATLABプログラミング 質問箱 その3 (873)
形態素解析と日本語処理 (468)
【Java】Wicket【HTML】 (580)
プログラミングのシンプルイズベスト (792)
ACM/ICPC 国際大学対抗プログラミングコンテスト2 (306)
--log9.info------------------
M134 MINIGUNがCAWから発売される模様 Part2 (396)
戦術レベルにおけるゾンビ問題対処方 (420)
#エアタンク総合スレッド【3気圧目】# (467)
【一人上手?】家は戦場【妄想上等!】Part11 (360)
【特定】無線関係スレ【省電力】 (877)
デルタフォースの装備スレ2 (721)
短機関銃総合スレ マガジン13本目 (340)
●●戦術知識●●第一基地 (906)
タナカ.380ガバメントってどうよ (396)
【CMクビ】テラロッサ【爺の助け】 (490)
【ハドソン】HUDSON総合スレ5【インダストリ】 (218)
マルイ早くM60やMINIMIのような機関銃作れ (416)
MC51/HK51について熱く語りましょう! Part3 (658)
【エコ】 バイオBB弾 【地球にやさしい】 (783)
【すっとや?】鹿児島サバゲー事情【すっが!】 (587)
【Glock】マルシン排莢式(笑)ガスガン3【M1911】 (812)
--log55.com------------------
朗報!NMB小嶋花梨キャプテンが朝の情報番組 朝日放送『おはよう朝日です』のアシスタントに!
FNS歌謡祭放送後の反響www 矢作萌夏・岡田奈々・吉田朱里・田中美久・村山彩希、以外は選抜から外せよ
結局、中井りかって黒なん?それとも白?
元チーム8 寺田美咲ちゃん 「今日、お知らせがあります。喜んでくれるといいなあ。」
【悲報】PRODUCE 48のプロデューサーさん、ファン投票上位のメンバーの中から一部のメンバーを外していた模様★2
STU48瀧野由美子「皆でなら中井りかさんに並べる、皆でなら中井りかさんを越えられる」【showroom】
【悲報】 『結婚できない男』大コケ! フジ関係者「大根AKBをヒロインに起用したせい」wwwwwwwwwwwww
NGTの最新序列発表wwwwwwwwww
-