1read 100read
2012年5月プログラム250: ポインタを難しいと言う奴が理解できない (850)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
1000 1001 1110 1111 1001 1000 0110 0010 (319)
MATLABプログラミング 質問箱 その3 (791)
Java低速GUI Swing & JavaFX 10 (103)
制御系なら俺に聞いてもいいぜ(10) (489)
Eclipse統合M32【Java/C++/Ruby/Python/Perl】 (878)
関数型プログラミング言語Haskell Part18 (493)
ポインタを難しいと言う奴が理解できない
- 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元 削除依頼 ▲
IS<インフィニット・ストラトス>総合 (663)
【アンチ】関数型言語は使えない【玩具】 2 (341)
C#終了のお知らせ (848)
【PureVideo】DirectX Video Acceleration【AVIVO】 (218)
【バグ管理】 BTS使ってる?【追跡】 3 (900)
懐かしのMS-DOSプログラミング (349)
--log9.info------------------
津山のご当地アイドルSakuLove(さくらぶ) (295)
【北海道】PEACEFUL【アイドルプロジェクト】 (351)
【U.M.U AWARD】Negicco☆2【グランプリ】 (138)
【SKE48】古川愛李応援スレ★13【あいりん】 (189)
SKE48北海道ヲタスレPART1.5 (768)
【SKE48】大矢真那応援スレ (103)
ぱすぽ☆応援スレ part2 (111)
【SKE48】高柳明音ちゃん応援スレ【ちゅり】 (100)
関東のSKE48ファン 2 (159)
【NMB48】山岸奈津美応援スレpart4【なつみん】 (291)
【NMB48】瀧山あかね応援スレ☆1【ねっち】 (195)
【NMB48】公演レポート倉庫スレ★2 (413)
玉森裕太が出没するclubやbar情報を! (169)
Kis-My-ft2で誰ががっこいい???Part2 (617)
藤ヶ谷太輔かっこよくない? (724)
■山下智久アンチ総合13 〜最低のNEWSの終り方〜■ (474)
--log55.com------------------
初めての自作での思い出書いてけ!
AHCI / NVMe/ SATA ドライバー&規格 総合 Part1
GTX950
Kaby LakeかRyzenどっちに乗り換えるかの相談スレ2
【MoDT】 Yonah Merom Penryn Part29【Core/Core2】
SilverStoneのPCケース29
【Iパス】IT資格の難易度ランキング【基本情報】
【Kabini】AMD 省電力APU総合 Part29【Beema】