ポインタを上手に例えてみよう

このエントリーをはてなブックマークに追加
JavaやC#の参照はNULLを保持できるのでCのポインタの長所が含まれているわけですな。
ちんぽいんた
721仕様書無しさん:03/04/02 16:48
ぼいんタン
C++ でも、別に null オブジェクト作りゃええやん。
まぁ、いちいち作らなあかんわけやけども。
723デフォルトの名無しさん:03/04/09 21:51
矢印でしょ
724デフォルトの名無しさん:03/04/11 23:37
   '(''--'                     ヽ
   ヽ,                       ヽ   い  メ free
 .<'',,,           ,-,  /', , ,         |
  ゝ    /  /   (( /-''/ ./ , , ;: ,,   |   う  モ  す
  ヽ; :   (  (''--'''''\,''-'  ''''''''~'''~ ヽ ;;   .|
   .\ ,...,--'二二二二> .丶ヽ二二二二-;:/''ヽ|   ん  リ  れ
    ..|| |, 'ァ'イo;;-ヽ丶   ,~~-''''{;o';> |' |:..''| |/
    || (';ヽ -,,.....- ァノ::|  .|ヽ ---...-'. .|:::::| .|  だ  を  ば
    .l:.| l::| ,.-'''''''' ,/::|     ~ ~''-z |::l/ /
    ヽヽ::|;      |;:::|         .l::/ /    な  解 
     .ヽ;:::|      ,l;:'''' ,        l /./|
      \:|      (:::, ρ)      l// ノ    ?  放 
      |;:::;l               /;:::::/
      ;:::::ト、   ==ニニニニ==    /.| .|        す  
     .lシ',;::::|\            / .| .l,,.)
     ゞ) .| ヽ    ''=''''''   /  | ,,,/        る
      )  .|  ;;\        アl   .| ,<
   ,,...-( (  |  'l;;;l.\     / / ./  l  )=-,,_     と
,,..-'''’   '\l  .;;  ’''---'''~  ; ;  l;ノ,;;/   ’''- ,_
        |   ;;        ;  ;           ’'-
ポインタ=ホームレス
726山崎渉:03/04/17 15:30
(^^)
727:03/04/17 16:31
保守・  
728山崎渉:03/04/20 03:16
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
729山崎渉:03/04/20 03:48
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
730デフォルトの名無しさん:03/04/21 21:20
>>728-729
ヌルポインタ?
今だ!5番ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ
ome
733山崎渉:03/05/22 05:00
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
734デフォルトの名無しさん:03/05/25 11:55
C++でさぁ、

class Obj{};
ってクラスがあって、

Obj* array[3][10];
って宣言したら、

array[0][0] = new Obj();
array[0][1] = new Obj();
・・・
array[2][9] = new Obj();
って感じでいいのけ?

ポインタの配列がよーわからん。
>>734
それでオッケー。
ただし、

> array[0][0] = new Obj();
> array[0][1] = new Obj();
> ・・・
> array[2][9] = new Obj();

なんて全部並べるなら、配列なんか使う必要なし。
736山崎渉:03/05/28 12:45
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
738373:03/06/21 18:26
>>160
禿同

話変わるけど、携帯ゲーム機"プレイステーションポータブル(PSP)

 このPSPは、新規格UMD(ユニバーサルメディアディスク)というディスクを利用しており、そのサイズは直径6cmととても小さい(CDの半分程度)。 容量は1.8GBとなっている。
画面は4.5インチのTFT液晶で、480px x 272px(16:9)。MPEG4の再生やポリゴンも表示可能。外部端子として、USB2.0とメモリースティックコネクタが用意されているという。

この際、スク・エニもGBAからPSPに乗り換えたらどうでしょう。スク・エニの場合、PSPの方が実力を出しやすいような気がするんですが。
任天堂が携帯ゲーム機で圧倒的なシェアをもってるなら、スク・エニがそれを崩してみるのもおもしろいですし。かつて、PS人気の引き金となったFF7のように。
整数の配列へのポインタを返す関数へのポインタをメンバに持つ構造体へのポインタを持つクラスへのポインタを返す関数へのポインタを持つ共用体とか
740山崎 渉:03/07/15 10:11

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
741山崎 渉:03/08/02 02:55
(^^)
742デフォルトの名無しさん:03/08/15 17:04
a
743山崎 渉:03/08/15 18:02
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
ポインタはアドレスを操作する。
745デフォルトの名無しさん:03/09/16 23:14
みんなメチャクチャ書いてるねぇ・・・

ポインタは、「ポイントする者」、つまり「位置を指し示す者」の事。

プログラミングにおいて、ポインタは「オブジェクトの位置を保持するオブジェクト」。
オブジェクトっつうのは、変数だったり関数だったり、要はメモリ上に展開される「何か」。
その位置を示すオブジェクトがポインタ。
ポインタは大抵変数として実現するので、ポインタ自身もまたオブジェクトなのよ。
だから「ポインタのポインタ」なんて事が出来るわけね。

さて、上では便宜上「メモリ上に展開」と書いたが、高級言語を使っている場合、それは必ずしもメモリであるとは限らない。
ページングすれば HD上に展開されてしまうし、CPUのキャッシュに入る事もある。
高級言語でプログラミングするという事は、「オブジェクトが実際にはどこにあるか?」を隠蔽する、という事だ。

だから、ポインタはメモリアドレスを指す、というのは、限定的には合っているが厳密には合ってない。
オブジェクトのアドレスを指す、と言えば、ちょっとはマシになる(メモリという言葉を使わない)、かな。
マジンガーZにでてきたな
ポン太
ポインタは、オブジェクトのアドレスを格納するオブジェクトです
>>745
上手に例えてよw
750デフォルトの名無しさん:03/09/17 00:39
平屋建ての巨大なホテルがあって、部屋数が数億ある。
部屋には、それぞれ00000001号室から99999999号室まで部屋番号が
付いている。
さらに、各部屋には電球が8つ取り付けてある。
変数を宣言すると、ランダムにその変数のバイト数だけ連続した部屋が確保される。
変数に値を代入すると、確保した部屋の電球を使って、その変数のデータを保持する。
変数に&をつけると、確保した部屋のうち一番最初の部屋の部屋番号を返す。
部屋番号がxなら、*xは部屋に入っているデータを返す。
また、部屋番号xにデータを入れたければ、*x=aのように。
*xを左辺において代入する。
部屋番号は「ポインタ変数型」の変数に入れる。
ただし、部屋番号だけでは何部屋使っているのかわからないので、
ポインタ変数型にはその部屋に入ってるデータの型名も
指定するようになっている。使っている部屋数がわかるように。
>>750
読むだけで疲れる。
例えるなら、エロく例えろ。
使い捨て携帯の電話番号みたいなものじゃない?



おっぱいがミサイルのやつか・・・
問題。
int32は4バイトである。
(1)ポインタint32型(*i32)のアドレスをインクリメント(i32++)すると元から何バイト進むか?
(2)ポインタint32型のアドレスをインクリメントする。(i32++)
  このとき、中身(*i32)はインクリメントする前の値より1だけ多いあたいであるといえるか。(int32 i32_2=*i32)
(3)また、char型(*ch)のポインタでアドレスをインクリメントするとき、(ch++)
  int32型のポインタをインクリメントしたものと同じ結果を出すには
  何回インクリメントしなければよいか。
(4)[問.2]と同様に、[問.3]でインクリメントしたあと、その中身(*ch)は
  インクリメントした回数と同じだけ増えたものといえるか。
(5)そしてそれはなぜ?
(Extra)Pentiumシリーズは今日も32ビットである。
    これint型が4バイト(=32ビット)なのはなぜか。

#僕はたとえるなら、「スライドするもの」とたとえるかな。
#映写機のフィルムはchar型の大きさで記録されている。とか。
#4画面だとint32で2画面だとshort。
#ややこしいかな・・・。映写機なんて最近聞かないし。
755754:03/09/17 04:48
//テストプログラム
#include <stdio.h>
int main(){
int *i32,i32_2;//ポインタと変数を用意
char *ch=(char*)i32;//何を代入して初期化しているでしょう??
//------
i32_2=(*i32);
i32++;
if((i32_2+1) == (*i32) ){
puts("(i32_2+1) == (*i32)");
}else{
puts("(i32_2+1) != (*i32)");
}
puts("---<*i32>---");
printf("元のアドレス[%d] 今のアドレス[%d]\n",(i32-1),(i32));
printf("さっきの値[%d] 今の値[%d]\n",i32_2,(*i32));
puts("---<*ch >---");
printf("元のアドレス[%d] 先のアドレス[%d]\n",ch,(ch+1));
printf("元の値[%d] 先の値[%d]\n",(*ch),(*(ch+1)) );
return 0;
}
上のプログラムはポインタの中身は書き換えていないので実行してもマシンが飛んだりすることはありません。(でもテスト以外では、やらないで!)
実行するときは、VCはリリースビルドしてください。ほかでは試してないです。warningは今回だけ無視して良いです。
なお、上のソースで(*i32)=(なんかの値) とかやるとPCの寿命が減ります。これがやってはいけないバグです。なので、やめましょう。(理由は考えてみよう)
756754:03/09/18 03:41
>>754
回答例
(1)4バイト。
(2)いえない。インクリメントで値(中身)をいじっているわけではないから。
(3)4回。char型のポインタはインクリメントすると1バイト進みます。4バイト進めるためには4回インクリメントする。
(4)いえない。問.2と同じで中身に対しては何も関与してない。
(5)ポインタはアドレスをいじることで移動する物であって、対象が固定的ではないから。
(extra)CPUの1本のレジスタが一回に扱える数の最大値が基本的に4バイト(32ビット)だから。
     Pentiumは一回に8バイト(64ビット)扱えるレジスタを持っているが、使用の実態は32bitレジスタを2本専有だったりするので汎用とは言いがたい。
     ちなみに計算するときは、intを使うのがCPU的に扱いやすくて早いといわれている。他の型があるのは省メモリーのため。等。

>>755
char型を初期化しているのは、アドレスで初期化しています。
つまり、ポインタを移動させているのです。

あと、書き込み可能な領域とは、自分専用に与えられた領域を指します。
ポインタは領域の間を自由に飛ぶことができます。が!
むやみに中立地帯を自分のエゴで書き換えると、ろくでもないことになります。やめましょう。

荒らしっぽくなってしまって申し訳ない。
757745:03/09/18 23:59
>>749
スレ主旨とはズレた書き込みで申し訳なかったが、「例え」はどうしても真実と
ズレた事を書かなきゃならないんで、まずは正論から書いてみた。

携帯電話番号の話をしてくれた人がいたんで、それを使って例えてみよう。

携帯電話を持っている人=各種オブジェクト
携帯電話=ポインタ
携帯電話番号=ポインタ値

地上(メモリとか)のいろんな場所に散らばって存在している「携帯を持つ人」は、
それ自身なんらかの状態を持っていて、それはさまざまだ。
で、その「携帯を持つ人」を指定・特定するには、その人の所在地を言ってみたり、
その人の容姿を言ってみたり、いろいろな方法があると思う。

(a)もしその人が携帯を持っているなら(=ポインタがあるなら)、携帯の電話番号(ポインタ値)を指定するだけで、その人が特定できる。
(b)携帯を持っていない人(=ポインタがない)は、そういう方法では特定できない。

C言語だと、以下のようになる。

(a)
int a; // 誰か : オブジェクトa
int* a_ptr; // 「誰か」用の携帯 : オブジェクトa用のポインタ
a_ptr = &a; // 「誰か」に携帯を持たせる : ポインタにアドレスを代入
// 以降、a_ptrを使うだけで、aの位置が得られるし、aそのものを使ってもよい

(b)
int a; // 誰か : オブジェクトa
// ポインタは無いので、aそのものを扱う「しか」ないし、aの位置は分からない
758ピル来る:03/09/20 15:05
ポインタッテドコデウッテルノ
>>1
ウルトラ警備隊の車
760デフォルトの名無しさん:03/09/20 15:11
>758
文具屋かな?替えの電池もついでに買っておけよ
レーザーポインターを上手に例えてみよう
知人などの目に一瞬当てて驚かせる小道具。
ゴレンジャーの女隊員
クラスの宣言や継承なんか、ポインタ指定してるみたいなイメージがする。
>>761 レーザーポインター「で」例えてみた。

大会があり、参加者(人)を変数とする。
レーザーポインターをもった人をポインタとする。(人なので変数でもある)
ゼッケンをメモリアドレスとする。

人が参加する際に(変数を確保する際)、ゼッケン(メモリアドレス)が割り当てられる。

ポインタを代入する行為は、特定の人物のゼッケンの番号を覚えるということである。
ポインタから参照する行為は、覚えた人に向けてレーザーポインターで光を当て、
指し示すということである。
766なんかてきとうに:04/05/22 18:54
class ポインタ : public アドレス{
 public:
  ポインタ operator ++();
  ポインタ operator --();
}
767なんかてきとうに:04/05/23 09:43
class アドレス : public 整数 {
 public:
  operator &();
  operator *();
}
 皆!!大事な事を忘れてないか1?
 お前らが書きこんでる先はなんだ?

 スレだろ!!

 スレの中に並んでるのは何だ?次元は?
1次元状にレスが並んでるだろうが、
よく考えてみろコレは、メモリー上と同じではないか!!
と言う事は、レスを変数 or Bitに例えれば2ちゃんねらーに分かりやすい(・∀・)<イイ

と言う事でスレを使った説明1つ考えてみた

2chでは基本的にスレッドに書き込めるレスは1000である。
その為">>"の先に書く数字は1000未満の値を入れる事になる。
と言う事はあおるAAのテンプレ↓を作ろうと思うと4文字分のスペースを">>"の後に入れて作ればずれないAAができる。

      ∧_∧      ∧_∧
     _( ´∀`)    (´∀` )
  三(⌒),    ノ⊃    ( >>1 )  
     ̄/ /)  )      | |  |
    . 〈_)\_)      (__(___)


それと同じように、メモリ上ではアドレスは0xFFFFFFFFまである。
これを見ると、1バイトはFFなので4バイトあればメモリ上すべての位置をカバーできる訳だ、その為いかなる型で宣言しようとポインタは4バイトなのである。
ではなぜポインタに型を宣言するか?それを説明するとだいぶ長レスになるので後者に任せヒントだけ書いておくとする。

long Matrix[40];
char *Pointer = (char*)(void*)Matrix;
こうすると1バイトずつ扱える。
長文レススマソ。