トップページ⇒tech
272コメント76KB

ポインタ地獄

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 NGNG
ポインタでつまずいている私はダメダメでしょうか?
0002名無しさんダーバード NGNG
ポインターとは、つまり、ポイントするものです。
00031 NGNG
2>
つまり「示す」という意味でしょうか?
0004名無しさん@お腹いっぱい。 NGNG
つまり、こんなことでそもそもスレッドたてずに
ギコ猫のプログラミング相談室に聞けと言うことです
0005名無しさん@お腹いっぱい。 NGNG
4age
0006名無しさん@お腹いっぱい。 NGNG
大抵の人は一度はつまづく所。
0007名無しさん@お腹いっぱい。 NGNG
メモリは1バイトごとにアドレスがついています。
そのアドレス情報をもつ変数がポインタです。
0008名無しさん@お腹いっぱい。 NGNG
変数ってのはいろんな目的の箱で、ポインタってのは住所が置かれた箱なんだよな。
住所は他の箱の場所を指していたり、1つの箱の場所を覚えておいて、
そこから何番目までを記録に使ったりする。
言うのは簡単だけど概念的に理解できないと面倒なだよなあー。
0009名無しさん@お腹いっぱい。 NGNG
コマンドライン引数で遊んでみたらすぐ解かると思うけど。
初心者の内は理解しようと必死になるより馴れることに重点置いた方が良いんじゃない?
0010名無しさん@お腹いっぱい。 NGNG
つまずかなかった僕が質問に答えたげるよさあ書け
0011初心者さん@ポインタいっぱい。 NGNG
は? 一体、ポインタのどこが難しいんだ?(汗
0012名無しさん@お腹いっぱい。 NGNG
多次元配列へのポインタは最初脳がパンクしそうになったが
0013名無しさん@お腹いっぱい。 NGNG
俺も理屈はべつに難しくないと思う。
ただあのCの宣言の文法は腐ってると思う。
ちょっと半年くらい別の言語やってたりするとすぐわかんなくなる。
0014名無しさん@お腹いっぱい。 NGNG
Javaだけやってると、もうなにがなんだか・・・
0015名無しさん@お腹いっぱい。 NGNG
VC++のクイックウォッチで遊べばすぐに理解できるんじゃないの。
0016名無しさん@お腹いっぱい。 NGNG
ポインタ変数が、別のポインタ変数を示していて、
そのポインタ変数がまた別のポインタ変数を…
とかなってると、頭パンクしそうになるかもですねぇ。

自分、高校の授業で、8085のワンボードマイコンで
ハンドアセンブルとかやってて良かったですわ。
アレがあったから、コンピュータってどうやって動いてるのか
わかったような気がする。
そういう低レベルなところを理解できてれば、
ポインタうんぬんがわかんない、なんて事にはならないですな。
0017名無しさん@お腹いっぱい。 NGNG
パンクしそうになったら図をかけ
終了
0018名無しさん@お腹いっぱい。 NGNG
そもそもポインタがわからないと言うやつって
ポインタの何がわかってないんだかもわかってないようだ‥

人にきくなら、できるだけ具体的に
せめて簡単な事例を用意してきくように。
0019名無しさん@お腹いっぱい。 NGNG
おれもポインタの概念自体よりも表記法がわかりにくいんだと思う。
しかしどんな書き方だったらわかりやすいのかな?
0020名無しさん@お腹いっぱい。 NGNG
[ポインタ]
これだ!
0021名無しさん@お腹いっぱい。 NGNG
Cを高級言語だと思う人は手をageて〜
うちは思わない。
0022優しい名無しさん NGNG
int *a;
じゃなくて
int* a;
ならわかりやすくないかい?
0023厨房@C/C++暦○年 NGNG
excel で例えるなら、「123」 等の数字が直接入ってるセルは変数で、
「A2」の様に、他のセルを参照しているセルはポインタ変数。

…では駄目ですか?
あくまで「例え」なんで間違ってる部分もあるとおもいますが。
0024名無しさん@お腹いっぱい。 NGNG
そうやって覚えると、

int* a,b;

と書いちゃう人が増えるんだな。期待しているのは

int *a, *b;

なのに。
0025名無しさん@お腹いっぱい。 NGNG
それ Stroustrup 先生に言ってみ
0026優しい名無しさん NGNG
今はポインターわかるが、以前わかってなかったこと。

頭の中で変数の実体とポインターがごっちゃになってる。
で気分次第で意味解釈が変わってきてた。
あと、ポインター宣言したら実体も同時にできていると思ってたり…。

だけど、がんぱってWinのアプリ一本作ってみたら、
なぜこれがわからなかったのかがわからなくなってた。

結局、文法書で終わってるとこがダメなんだよ。
文法はコンパイラと対話しながら学びなさい。
0027名無しさん@お腹いっぱい。 NGNG
アセンブラの入門書とか見るのもいいかも。
0028優しい名無しさん NGNG
>27さん
そうですね。
いっぺん、Z80でもCASLでもいいから
文字列テーブルでも作ってプログラムの中で参照してみるといいかも。
0029名無しさん@お腹いっぱい。 NGNG
何故ポインタなんかがあるか・・・(悩
0030名無しさん@お腹いっぱい。 NGNG
値による呼び出しが破綻したからだよね>>29
0031名無しさん@お腹いっぱい。 NGNG
"call by name" が破綻したからだろ?
0032名無しさん@お腹いっぱい。 NGNG
高水準アセンブラだからだろ。
値呼び出しが破綻しただけなら参照呼出しをちゃんとサポートすればよかったんだよ。
0033名無しさん@お腹いっぱい。 NGNG
>24
char* const p;
はやはり
char *const p;
とかくのか?
0034名無しさん@お腹いっぱい。 NGNG
char * const p;
がふつーだと思う。
0035名無しさん@お腹いっぱい。 NGNG
101匹わんちゃんもポインター地獄
0036名無しさん@お腹いっぱい。 NGNG
30点>>35
0037名無しさん@お腹いっぱい。 NGNG
>33
意味的には
char (* (const p));
なんだから、char と * をくっつける強い必然性はない。
まぁ、const と p をくっつけるわけにはいかないから
char *const p;
または 34 さんのように
char * const p;
だろうな。

この場合も、
char a;
char*const p = &a, q;
とした場合など q の型が直感的には認識しづらい。
0038名無しさん@お腹いっぱい。 NGNG
char const*p;
0039名無しさん@お腹いっぱい。 NGNG
char const * const p;
は?
0040名無しさん@お腹いっぱい。 NGNG
Stroustrup先生なら
const char* const p;
とおっしゃりたいところでしょう(笑)。

つーか、やっぱこの*の位置キライなんだが。
C++がデフォになると(もうほとんどなってるが)
こっちが標準になっちゃうからなあ。
うー、どうしよう。うにゃにゃにゃにゃ。
0041名無しさん@お腹いっぱい。 NGNG
>29,30,31
メモリを動的に確保・廃棄したいから、であってますか?
0042名無しさん@お腹いっぱい。 NGNG
メモリマップドIOを直接操作したいから、であってますか?
0043>38 NGNG
とちゅうchar const* p;とchar* const p;の違いが分かってないものが約一名。
0044名無しさん@お腹いっぱい。 NGNG
>40
char *p, *q;みたいに一行に何個も書くこと自体廃れてきた
ような気がする。それでいいと思う。
0045名無しさん@お腹いっぱい。 NGNG
debugコマンドでもVCでもいいけど機械語デバッガで1ステップづつ追いかけてみれば?。
まーCの演算子解決順ってなんでもう少しわかり安くしてくれなかったんだろ。
いまだに*p++とか書くとき一瞬迷いが走るのは修行が足りない?
0046>Stroustrup先生 NGNG
こーゆーのはどうするんですか?
char const * const * const * const p;
0047>46 NGNG
ポインタポインタ以上を使うなら、typedefせよ
004846 NGNG
const 込みの typedef も作っとくの?
やなこった。
0049名無しさん@お腹いっぱい。 NGNG
>46
char const* const* const* const p;
だろな。
>48
これは同感。ポインタをtypedefすると何か使いにくい。
0050名無しさん@お腹いっぱい。 NGNG
const char *const *const *const p;
がいいな。
0051どーでもいーことだが NGNG
const char* const* const* const p;
でないの?
0052名無しさん@お腹いっぱい。 NGNG
char ********************************************************p;

0053名無しさん@お腹いっぱい。 NGNG
void* p;
あとはキャストして使ってくれ。
0054名無しさん@お腹いっぱい。 NGNG
わかった。
char ********************************************************pp = (char ********************************************************) p;
0055名無しさん@お腹いっぱい。 NGNG
printf("%c\n", ********************************************************pp);
0056名無しさん@お腹いっぱい。 NGNG
int ***(*func(int a, char (*func2)(void *)))(int x);

世界人類がこんな関数を作りませんように。
0057名無しさん@LV2 NGNG
ans = *p/*q;

を始めて書いたときはめっさうけた^^
0058名無しさん@お腹いっぱい。 NGNG
ちょっとは地獄らしくなってきたけどまだ足りないな。
ホンモノの地獄をみせてくれっ!!
0059名無しさん@お腹いっぱい。 NGNG
   *
*  *  *
 * * *
  ***
 * * *
*  *  *
   *

よく見ると雪印っぽくて地獄。
0060名無しさん@お腹いっぱい。 NGNG
ども、教えて君です。
多次元配列のポインタ教えて。
0061名無しさん@お腹いっぱい。 NGNG
>60
54にすでに40次元ぐらいのがあるだろ。
0062>60 NGNG
ややこしければ とりあえず配列をtypedef してからポインタにすれば?
006362 NGNG
ごめん。変な事言った。修正
配列を構造体に入れてからtypedefしてポインタにすれば判りやすいよ
0064名無しさん@お腹いっぱい。 NGNG
char (*p)[2][2][2][2][2][2][2][2][2][2][2][2][2][2] ;
0065名無しさん@お腹いっぱい。 NGNG
56ほどじゃないけど、signal()のプロトタイプも初心者殺しだよね。
void (*signal(int, void (*)(int)))(int);
そんでもって、Cプログラマのまあ多分6割以上はこれを読めないというのが、
日本の悲しい現状。
0066名無しさん@お腹いっぱい。 NGNG
うはあ…なつかしい。図書室で見た時はなんかの暗号化と思ったわい。
0067>65 NGNG
やっぱそれはCの文法が悪いと思うんだけど、、、
PASCALとかではどうかくの?
0068>67 NGNG
pascalではポインタは ^ です
char *p;は var p:^Byte; です。
じゃ同じじゃないかと思われるでしょうが、参照渡しが使えるのと
absoluteで別名参照が出来るのと、そもそもクラスが参照なので
C程ポインタにお世話になるチャンスは少ないですね

0069>67 NGNG
あと、配列とポインタが明確に区別されてるのと
0070ぴか虫 NGNG
    ☆ぴかっ
 /)_/)  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (,’ー’) < 適当に探してみたぞ。http://home1.infonia.ne.jp/~delphian/delphi/compo/graphmul.html#GM0047☆
_( U U)  \____________________
0071名無しさん@お腹いっぱい。 NGNG
昔,読みづらいCのソースコンテストって野があったのを思い出した.
0072名無しさん@お腹いっぱい。 NGNG
Pascalではtype使わないと複雑なのは書けないと思ったが‥
0073名無しさん@お腹いっぱい。 NGNG
>71
確か、
main() {
goto togo; gototo: goto gogo; togo: goto gototo; gogo:
}
こんな感じのがあったような。
0074名無しさん@お腹いっぱい。 NGNG
>73
用件を聞こうか。
0075名無しさん@お腹いっぱい。 NGNG
こういうのって四則計算覚えたてのガキにただ長いだけの暗算やらしてるのと同じだね。
傍観してるのは面白いけど。
0076名無しさんi486 NGNG
>74
2chがコンタクトポイントだったのか
0077名無しさん@お腹いっぱい。 NGNG
int(*(*(*(*(*func(int(*)(int(*)(int(*)(int(*)(int(*)(int)))))))(int))(int))(int))(int))(int);
0078名無しさん@お腹いっぱい。 NGNG
>>68
それは Pascal というか Delphi の話だね。
0079名無しさん@お腹いっぱい。 NGNG
#include <stdio.h>
main()
{
int = 1;

loop:
printf("%d\n", i);
i = i + 1;
if (i <= 10) goto loop;

return 0;
}

うあああ。昔のBASICみたいだ。
0080名無しさん@お腹いっぱい。 NGNG
void func(int ******************************************x)
{
printf("%d\n", ******************************************x);
}
0081名無しさん@お腹いっぱい。 NGNG
>80
const が付いてないので減点。
0082名無しさん@お腹いっぱい。 NGNG
(***********************************&printf)("hello\n");
0083名無しさん@お腹いっぱい。 NGNG
varargと可変引数な関数でスタックを壊してるに100000ペリカ
0084名無しさん@お腹いっぱい。 NGNG
ポインタ地獄は構造体で解決。
0085名無しさん@お腹いっぱい NGNG
>>84
話しがずれてるような?
0086名無しさん@お腹いっぱい。 NGNG
*じゃなくて@とかにしたほうがなんかわかりやすいとおもう。
0087名無しさん@お腹いっぱい。NGNG
やっぱり、>>65 の

void (*signal(int, void (*)(int)))(int);

とかは、

typedef void TVIFunc(int);
typedef TVIFunc *TVIFuncPtr;
TVIFuncPrt signal(int, TVIFuncPtr);

とかみたいにtypedefしてくれるとわかりやすいと思う。
0088学生NGNG
>>65
わからんです・・・。
一番最後の(int)
これが付くとどうなるんです?

ごめんちゃい、ごめんちゃい。
0089名無しさん@お腹いっぱい。NGNG
>75
んで、おまえもできないんだろ(藁
0090名無しさん@お腹いっぱい。NGNG
>>88
一番最後の(int)っていうのは、
void (* 〜 )(int)
こうみるのね。
つまり、signalという関数の戻り値が
「「引数int 戻り値void の関数」へのポインタ」というわけです。
0091学生NGNG
サンクスコ>90
でもせっかく気付いてもらったのに・・・ 分からんです。

今はもう一度みっちり勉強してまふ。

0092名無しさん@お腹いっぱい。NGNG
これは解るんです
void ( *signal )( int )
でこれが
void ( *signal(int, void(*)(int)) )( int )
こうなると解りません
signalのあとから始まるかっこはどういう意味なんですか?
すみませんだれか教えて下さい
_(._.)_ _(._.)_ _(._.)_ _(._.)_ _(._.)_ _(._.)_
0093ネスティングNGNG
signalは、関数へのポインタ変数。
  その関数は(int, void(*)(int))型の引数をとる。
    引数内のvoid(*)(int)は、関数へのポインタ型。
      この引数内の関数はintの引数をひとつとり、voidを返す。
  その関数の返り値は関数へのポインタ型。
    この関数はintの引数をひとつとり、voidを返す。
0094名無しさん@お腹いっぱい。NGNG
>>92
signalは、引数にintとvoid(*)(int)を持ち、void ( * )( int ) の関数ポインタを返す関数だよ。

わかんなかったら素直にtypedefしろよ。
typedef void ( *tproc)( int );
tproc signal(int, tproc);
これで済むだろが。だぁほ!
0095名無しさん@お腹いっぱい。NGNG
>>92
そのsignalのあとから始まるかっこは関数を意味します。
名前の前につく*はポインタ、名前の後につく()は関数を意味するんだ。
このかっこの中にあるのは関数の引数なんで、さいしょは分けて考える。
*より()の方が結合が強いことに気をつけて。
  *hoge()
は、*と()の両方がくっついてるけども
()の方が結合が強いので、hogeは関数。
  {{hogeは関数}ポインタを返す}
てな感じで考える。一方
  (*fuga)()
は、*と名前をかっこでくくってるから*の方を先に評価して
  {{fugaはポインタ}関数への}
てな感じで考える。
で、問題の
  void(*signal(int,void(*)(int)))(int)
なのだけども、
  (*signal())()
として考えて、名前に近いほう(内側)から考えよう。
 {signalは関数}ポインタを返す}そのポインタは関数への}

こんなんでわかってもらえたかな?
もちろん、自分で書くときはtypedefを使ったほうがいいね。
ちなみに、93は間違い。おしいけど‥
009693NGNG
仰せの通りでございまする・・
009792NGNG
理解できました
皆様解りやすい説明ありがとうございました
0098ホントにわかってるのか?NGNG
その関数signalへのポインタpsignalを書いてみろ
0099名無しさん@お腹いっぱい。NGNG
そのポインタの配列もな(藁
0100名無しさん@お腹いっぱい。NGNG
演算子の結合順序と方向の表をちゃんと見ましょう。
010192NGNG
typedef void ( *tproc)( int );
typedef tproc signal(int, tproc);

signal *psignal;
signal *psignal[5];
■ このスレッドは過去ログ倉庫に格納されています