1read 100read
2012年5月プログラム250: ポインタを難しいと言う奴が理解できない (850) TOP カテ一覧 スレ一覧 2ch元 削除依頼
Visual Studio 2010 Part19 (122)
★★ Java の宿題ここで答えます Part 71 ★★ (977)
くだすれC++/CLI(初心者用)part2 (489)
Silverlight登場で.NET使い大勝利!!! Part2 (475)
3Dアルゴリズム全般 (399)
IS<インフィニット・ストラトス>総合 (663)

ポインタを難しいと言う奴が理解できない


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元 削除依頼
雑談スレ 4 (370)
Visual Studio 2010 Part19 (122)
【モダン推奨】Perlについての質問箱 50箱目 (193)
Git 4 (559)
いもうとデスクトップを実際に作ってみないか?3 (844)
「コンパイラ・スクリプトエンジン」相談室15 (446)
--log9.info------------------
【SEIKO】WIRED(ワイアード)【SPOON復活】 (322)
【高級】シャルルホーゲル【スイス時計】 (581)
角松敏生★ブランパンに関して認識甘くね?13★濱田 (592)
イテェ!時計を傷つけた瞬間【泣】 (118)
IWCパイロットウォッチ1 (963)
祝2000日間★ブライトリングスレの粘着キチおめ!\(^o^)/ (348)
■  シチズン プロマスター Part12   ■ (165)
【GALANTE】ガランテを語る 1【SEIKO】 (178)
【電波】みんな集まれ!時計板雑談スレ【固定】85 (952)
【魔界】 ビーバレル BB0002【B-Barrel】 (933)
■■ モーリス ラクロア MAURICE LACROIX 2 ■■ (938)
【秒針機械式】FOSSIL【時分針クオーツ】 (295)
【IWC】マーク16スレ 9【クラシック・スピット】 (138)
【角松】カルティエVSブルガリ・3【敏生】 (161)
幸いにも韓国製の時計が流通していない件2 (191)
【GPS】セイコー アストロン【ソーラー】 (263)
--log55.com------------------
【警視庁】首都を守るプライド その34【警察官】
■□■東京消防庁 第130消防方面本部■□■
国税専門官part467
【勝ち組】公務員試験合格者専用スレ【確定】
国税専門官part465[採用面接へ]
【果報は】東京都特別区スレpart492【寝て待て】
【都心か】特別区役所VS政令市役所【地方都市か】
東京都内の市町村part36