ポインタの説明をしてみて初めて解かる難しさ
■ このスレッドは過去ログ倉庫に格納されています
0001プロだよ
NGNG解かるように説明しやがりください。
これが意外と苦労するんだなw
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG│
│ ∧_∧
↓ ( ・ω・ )
■p⊂ と )
(_(_ろ
0004デフォルトの名無しさん
NGNG/ ´_ゝ`) すいません、道に迷いましたよ・・・
| /
| /| |
// | |
U .U
0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNGqed
0007プロだよ
NGNG説明でも (・ω・)ホエー ってして居やがります
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNGでも、C,C++使いとかでないとポインタっていらないんじゃない?
当方++つかいだが。++でも普段はポインタだとか気にせんぞ。
インスタンスはほとんど参照カウンタつきポインタ任せ
0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNG□◆□□□□□□
↑P=1
*P=◆
ポインタのイメージ。矢印がポインタ。
ポインタはメモリ上のアドレスを格納する変数。
よって、ポインタそのものに格納できる値は4byte(宣言時の型は、
ポインタを当てた変数を何型として扱うかと言うだけの話で、
long型の変数にchar型のポインタを当てて1Byte単位で扱う事も可能)。
そして、アスタリスク(*)はポインタに格納された
値を操作するための修飾子。
早い話が、デスクトップとかにおいてあるショートカットアイコンが、
ポインタで、ショートカットの先にあるファイルが本来の変数or配列ってことだろ?
(説明はやっぱむりポ)
0013デフォルトの名無しさん
NGNGヘネパタとパタヘネ(どっちがどっちだ?)を読ませる。
今使ってるコンピュータのCPUのマニュアルを読ませる。
とりあえずアセンブラで何か書かせる。
ANSI Cで何か書かせて、コンパイラでアセンブラの出力を吐かせて、読ませる。
ANSI Cの仕様書を読ませ、それぞれどんなコードを生成するのか確認させる。
以上。
必要なことを示さずに煙を巻くような説明の解説書を読むより確実。
0014デフォルトの名無しさん
NGNGポインタが分からない人の
気持ちなんかわからない。
0015デフォルトの名無しさん
NGNGint n = 10;
int *p = &n;
printf("%d", *p);
こんなことちまちまやってても分かるわけない。分かる必要もない。
それより、どんどんコード書いていって、ライブラリなんかで、
どっかにごっついオブジェクトがあって関数fはそのポインタを返すとあったら、
O *p = f();
とし、
p->m;
これさえ分かれば、あとは勝手に理解できる。
0016デフォルトの名無しさん
NGNGやだ、2chでポインタとか配列とかについてぶつと、
なんかキチ○イが、どーでもいいことで粘着してくるから。
0017デフォルトの名無しさん
NGNG難しいのは、関数のパラメータとアーギュメントに、プリミティブタイプの変数
を使ったり、ポインタの変数を使ったり、配列を使ったり、リファレンスを
使ったり、複数の場合はそれらを混合したりして、そこら辺を初心者本が丁寧に
説明してないからだと思う。おまけにCの場合は、式の中で配列名を使用すると
先頭のポインタにコンパイラが自動的に読み替えたりするから尚更ややこしくなるのだが。
0018名無し@沢村
NGNGだが、ポインタを初心者というか幼稚園にでもわかるように簡単な言葉で説明できるやつはいない。
初心者でも優秀なやつはすぐ理解してしまうから、この場合初心者というより幼稚園だな。
聞くところによると、どんなに難しいことも、簡単な要素に分解できるそうだ。
また人間が難しいことを理解する場合、簡単な要素に分解してから理解するそうだ。
だが、これにはおかしなことろがあるな…。
もしどんなに難しいことでも、簡単な要素に分解できて、難しいことを理解する場合簡単な要素に分解してから理解するとすれば、
どんなに難しいことでも簡単な言葉で説明できるはずだが、世の中は難しいことは理解できないやつがほとんどだ。
つまり実は難しいことは完全には簡単な要素には分解できず、難しいことを理解するには、難しいことを難しいまま理解するという処理が必要だという証明ではないかな?
どうよ?
もっともポインタなんて難しいことのうちには入らないけどね…
どうよ?
0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNG0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNGというか、その難しいものを分解すること自体が難しいんじゃないかな。
なにせ難しいものなんだから、どう分解すればいいのか分からないわけで。
0023名無し@沢村
NGNGいや、理解した人はその難しいことを分解して理解したんだから、
自分が理解したとき分解したように分解すればいいのでは?
もっともこれは難しいものを分解できるという前提に立った上での話だけどね…
だからおれはその前提があやしいと言ってるんだ。
0024名無し@沢村
NGNG難しいことは簡単な要素に完全に分解できるか?
それとも完全には分解できず難しいことを難しいまま理解しなければならない部分がどうしても残るか?
という問題についてスレを立てる必要がありそうだな…
0025デフォルトの名無しさん
NGNG0026名無し@沢村
NGNGというのは、難しいことを理解したやつに、どうしてそうなるのか聞くと、
「これはAだからBになるんだ」「わかるぞ、ふむふむ…」
「そしてここがBだからCになる」「うん、そこもわかる…」
「そいてここはCだからDになるというわけだ」「おい、そこはわかんないぞ。そこはちょっと飛躍があるんじゃないか?」
「どうしてよ?CだからDになる。簡単だろ?」
というわけで、聞いてるおれは、そのCからDになることろをもうちょっと簡単な要素に分解して説明してほしいんだが、
やつはCからDになる部分を難しいまま理解しているので、それ以上簡単に説明したくてもできないわけだ。
おまいらよ、こういうことってよくないか?
だからおれは難しいことを理解するには、難しいまま理解するということがどうしても必要だと思うな。
どうよ?
002722
NGNGいまは、理解できていない人がどうやれば理解できるようになるか、ってことを
言ってるんじゃないのか?理解した人に教えてもらえばいいって言いたいなら、
それはちょっとどうかと思う。その人が本当に全てを伝えられるとは限らないし、
なにより人から一方的に押し付けられた知識は身に付かない。
難しいまま理解しなければならないかどうかは、その問題の大きさによると思う。
まず、どんな問題も分解しようと思えば分解できるはず。定理は定義より導き出せる。
ただ、細かく分解していくことが絶対的な利点であるとは思えない。
問題の規模が小さい内はまだいいが、それが大きくなってくると分解することは
問題を逆に複雑化してしまうことになりかねない。
//漏れってこんな真面目なこと書けたんだな。ちょっと意外
0028デフォルトの名無しさん
NGNGint a = 10;
という変数があるときaのアドレスは"&a"。
パソコンのメモリは"線形"にアドレスが...なんとかノイマンで
たとえばアドレスが1000あって、
その0003番地に変数aが存在するとすると
&aは0003
0001
0002
0003 ここが&a
0004
0005
....
....
1000
0029デフォルトの名無しさん
NGNG0020番地に int型を指す int *pがあって、これに
p = &aとして、変数aのアドレスを格納すると
0003にあるaに10という値が入っていて
0020にあるpに0003というアドレスが入っているとき
"p"とだけ指定すると、出てくる値は"0003"
"&p"と指定すると、出てくる値は"0020"
*pと指定すると
0001
0002
&a+--->0003 ---> 3が出てくる
| 0004
| 0005
| ....
&p+--- 0020 ここに &pがあって
....
1000
あと、ポインタはデータ型に応じたアドレス演算の機能が...
<以下略>
0030デフォルトの名無しさん
NGNG- &a+--->0003 ---> 3が出てくる
+ &a+--->0003 ---> 10が出てくる
...ボロが出まくっているので寝ます。
0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNGだんだん配列数増やしていったら、
メモリ上で連続したアドレスにちゃんとなるの?
0033名無し@沢村
NGNG事実はint型が4バイトとすると、
0003番地から0006番地までの4バイトで0x20という整数を表すということだけだ。
&と書いたらどうなるか**と書いたらどうなるか*&と書いたらどうなるかなんてのは、構文解析の仕様の問題で、実際のメモリ上にあるデータとは無関係だ。
言語仕様にまどわされず、実際のデータだけを見れば問題は簡単だ。
0034デフォルトの名無しさん
NGNG文化人類学的命題ですね。阪大の中川先生が「高い/低いレベルの記述」という概念で
言語システム論として構築してらっしゃいます。
0035デフォルトの名無しさん
NGNGcのreallocのケースだが、
現在ポインタから連続確保できないときは、
確保できる場所を探し、そこにポインタを移動してから新しく領域を確保する。
今まで使っていた領域は自動的に新しい場所にコピーする。
どうしても確保出来ない場合は関数が失敗する。
0036デフォルトの名無しさん
NGNGある変数pが構文(略)によって宣言されているとき、
その変数pは型tへのポインタ変数であるとい、pの中身をポインタ値という。
以後、説明の簡単のためポインタ値がメモリのアドレスをあらわしているものとし、
メモリの構造とアドレスについて知識があるものとする。小文字は変数。
(定義)
* : ポインタ値 -> 型tの値
函数*は(*pと使用したとき)アドレスpに型tの値が格納されているものとして
アドレスpの(pに続く)メモリの内容を解釈し、型tの値を返す。
(定義) & : 変数 -> ポインタ値
変数xに対し&xはxの格納されているアドレスをポインタ値として返す。
(注意) C言語では通常、演算子は変数に適用されたとき
変数の中身に対して作用するが、&は変数自体に作用する。
(系) 上の二つの定義より、 合成* . & : 型tの値 -> 型tの値
は恒等函数である。
...ポインタの演算やsizeofの定義、性質。
ポインタ=知っている何か、と翻訳できるものではない。
物事は何でも自分の既に知っているものに対応すると思い込んでいる
人にとっては難しいし、説明も難しいかもしれないが、
新しい概念(定義)のものが一言でわかるものでないのはあたりまえ。
0037デフォルトの名無しさん
NGNG理由を理解する事だね。で、俺の理解してる範囲の解釈だが。
関数の定義の際にカッコ内にパラメータを指定する。で、呼び出し側では、アーギュメント
を関数に与えて(仮引数と引数とは使わない。こっちの日本語の方がややこしい。英語の
パラメータ・アーギュメントの方が分かりやすい)演算を行わせる。その際に、変数そのもの
を渡すと、コンパイラさんが、気を利かしてコピーを自動的に(勝手に)作ってそれを渡して
しまう訳だ。そして、そのコピーアーギュメントを受け取った関数の方は律儀に受け取ったコピー
で必要な演算を行い、終了すると、呼び出し側に戻る。この場合、例えば関数の中に計算結果などを
表示する処理が含まれていれば、その結果を見ることが出来る。しかしそうでない場合や、渡そうと
考えた変数を、関数で処理させて内容を変更し、その変数などに結果を格納しようとする場合には不都合となる。
値をそのまま渡したのではコピーを処理するだけで、且つコピーされたコピー変数は関数のスコープ
が終わると消滅してしまうので、元の変数に結果を格納したり、関数スコープ終了後にもその結果を
利用する事が出来ないのだ。
そこでポインタの出番となる。ポインタ変数を関数のパラメータとして指定しておき、変数のアドレス
を格納するポインタ変数をアーギュメントとして関数に渡せば、関数にはそのポインタ変数のコピーが
渡される。で、関数内部で、アスタリスク演算子を適用して、元の加工したい変数をポインタ変数コピー
から参照して演算を行えば、元の変数そのものを加工し、その結果を格納し関数スコープが
終了した後も保存可能となる。
ちなみに、**とアスタリスクを2つ繋げたポインタのポインタ変数というものも
出てくるが、これは、要するに、ポインタのポインタのコピーを関数に渡して、ポインタ
そのものを関数処理し、元のポインタの指す位置を演算処理して変更して結果を保存する
為のモノ。要は、関数に渡すアーギュメントはコピーが作られてしまう為、関数処理加工して
結果を保存したい対象が変数であれば、ポインタ、ポインタをそうしたいのであれば
ポインタのポインタを使用すると考えれば良いと思う。
0038T.K
NGNG0039デフォルトの名無しさん
NGNG0040デフォルトの名無しさん
NGNGvoid fanc(char *p);
int main()
{
Str[] = "Hellow World.";
fanc(Str); //Strの先頭アドレスを*pへキャスト
return 0;
}
void fanc(char *p)
{
printf("%c\n",p[0]); //*pはchar型なのでchar型の配列・変数と同様に扱える。
//ちなみに実行するとHが表示される。
p++; //ポインタに値を加算する。ココではpはchar型なので
//1Byte分ずつアドレスがずれる。ちなみに、long型を
//引数で受け取っても1Byteずつしかずれない。
//もしcharでなくlongだったなら4Byteずつずれる。
//ポインタの型とはそういうもの。
printf("%c",p[0]); //その為この関数の実行結果はeが表示される。
}
ちなみに*PはP[0]と同じである。
こんな感じだったら分かる?
実際にコンパイルしてないので動くかどうかは分からんのでよろしく。
0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNGポインタを上手に例えてみよう
http://pc5.2ch.net/test/read.cgi/tech/1030901827/
C言語のポインタってなんですか?
http://pc5.2ch.net/test/read.cgi/tech/1056082808/
0043デフォルトの名無しさん
NGNGアセンブラなんぞ生ぬるい。インストラクションテーブル眺めながら
ハンドアセンブルが最強。
#マジでTK大ISにはこういう授業があった。
0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
NGNGi = 10; は アドレス1番地 = 10; ってなる。
ポインタ変数はアドレス型の変数なんだよ。
って覚えた。
0047デフォルトの名無しさん
NGNG俺の行った学校だと、
週一回の電子工学実験の1つに、マイコンというのが混じっててな・・・。
目の前にはTK-80のようなマイコンキットとマニュアルのみ。
そして、今日中にメモリエディタを作れ、という指令。
プログラムの入力はトグルスイッチで0番地から順に1バイトずつ書き込み。
デバッガなんてありません。CPUのクロックをワンショットにして、1サイクル
ずつ実行しながら、アドレスバスとデータバスの出力をLEDで確認。
#ちなみに、この実験シリーズは学生に色々と体験させるのがコンセプトで、
ハンドアセンブルした次の週には、本物の人工衛星を使わしてくれた。
やることといったら、パラボナアンテナの前に水の入ったバケツを置いて、
エラーレートのグラフを書くだけだったので、なんとかなったけど・・・。
0048マジレス
NGNGだから記号は使わない。
ポインタの理解はマシン語レベルで説明した方がすっきり来るはず。
(変数の概念は別に説明する必要があるだろうが)
じゃこんな流れかな?
続く
0049マジレス
NGNG書き留めているメモリとで構成されている事を説明せねばならない。
メモリが2次元的に番号を振られているなんて初心者は知らないから
それを教えてあげる。
ここで実はメモリにはプログラムも入っている事を教える。
プログラムとはCPUに対する命令の集まりで、命令には番号が振られている
ということを説明する。その番号がメモリに順番に入ったものがプログラム。
ここで、適当な例を引いて説明する。(工場内で製品が出来上がる様子など)
どんな命令があるかはさておき。
次は動作について、
メモリは、計算機は動いている時、メモリを1つ読み、それを命令だと解釈して
その番号通りの処理を行う。そして次のメモリを読み…と続けていく。
ここで計算機は処理(足し算とか引き算とか)の結果をメモリのどこかに
格納しなくちゃいけない。
その結果を格納するメモリの場所を指定するのはどうするか?
それはメモリに割り振られた番号で指定する。
ここでメモリを扱う時に2種類の値が登場していることを説明しなくてはいけない。
「計算結果の数値」と「計算結果を格納しておく場所の番号」だ。
この後者、場所を指し示している数値の事を指してポインタという。
計算機にはこの命令を出す言葉の種類がたくさんあって
(日本語、英語、中国語のように)それぞれいろんな決まりがあるけれど
この「値を格納している場所を示すもの」をポインタと名付けている。
と教えてあげればヨシ。
その働き、使い方についてはここまでの定義を理解すれば自ずと分かって来るだろう。
表記については、単なる言語毎の決まりでしかないから、
このポインタの定義をたたき込んでいれば理解はできるでしょう。
0050デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
NGNGchar型:一部屋(定員8名)
int型:二部屋
メモリのアドレス:部屋番号
変数名:予約者の名前
データ:個々の客
ポインタ:客がとってる部屋の、最初の部屋番号と客の名前を書いた札
ポインタのアドレス:札を入れた箱の番号
ポインタの変数名:札の分類名
ポインタのデータ:札
ポインタに変数を代入すること:札に部屋番号と予約者の名前を書き込む
妥当かどうかは識者にまかせる。
てか自分の中ではポインタ=札と訳し変えて理解しただけだけど。
宣言部の*と処理してるときの*は意味が違うというのがわかったときピンときた。
005453
NGNG×ポインタ:客がとってる部屋の、最初の部屋番号と客の名前を書いた札
○ポインタ:客がとってる部屋の、最初の部屋番号と予約者の名前を書いた札
0055デフォルトの名無しさん
NGNG0056デフォルトの名無しさん
NGNGあれを見たら学習意欲が無くなると思うw
0057デフォルトの名無しさん
NGNG0058デフォルトの名無しさん
NGNG混乱の元だ。 そんなのはパンピー相手の講演用。
プログラマ相手なら参考資料は16進ダンプの出力で十分だろ。
縦横にアドレスの見出し付きの奴な。
0059デフォルトの名無しさん
NGNG当たり前だからだろ。ポインタの説明なんて3行で終わるんだよ。
char *p = "hello, world";
printf("%c\n", *p);
printf("%c\n", *++p);
あと
printf("%c\n", p[0]);
printf("%c\n", p[1]);
でも同じだ。
つーか氏ねよお前ら。
0060デフォルトの名無しさん
NGNG難しいのは、“ここ”と書くために何が使われるかで、現実のマシンではアドレスと言う番地を使っている
このアドレスが色々と曲者で、ポインタを理解するためにメモリ内部の仕組みまで理解しなければならないのが
ポインタが難しいと感じる理由
間違ってる?
ポインタの概念なんか、「ここを見て」って感じで日常会話でもよく使われてるよ
0061デフォルトの名無しさん
NGNG0062デフォルトの名無しさん
NGNGぬるぽ。
0063>>62ガッ
NGNG0064名無し@沢村
NGNGまだ理解できないやつっているの?
0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNG理解できない奴 =:= 理解する気が無い奴
もしくはポインタ以上のすんばらしい概念を持っている神様
0067デフォルトの名無しさん
NGNG?ポインタは型ですよ?
0068デフォルトの名無しさん
NGNG中のデータはアドレスを持たない
0069デフォルトの名無しさん
NGNGポインタの概念自体は誰でも理解できる
0070デフォルトの名無しさん
NGNG*++pなんてしたらpに格納された値が更新されてp[1]とまったく同じじゃないだろ、
p[1]と同じようにしたいなら*++pじゃ無くて*(p+1)だろ。
0071デフォルトの名無しさん
NGNGファイルポインタっていうのも同じような考えのモノなんでしょうか。
ファイルポインタという言葉は出てきても、それを説明している本が
目下のところ一冊もなかったので。
0072デフォルトの名無しさん
NGNGこの書き方が理解を邪魔した
int *p;
p = &a;
と分けて書け
0073デフォルトの名無しさん
NGNGでもやっぱり今日もポインタで苦しんでいる若造はいっぱいいる、
ではポインタで悩むときってどういうときなんだろうね。
書式なのかな。
0074デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1030901827/l50
一応重複……。
0075デフォルトの名無しさん
NGNG一個一個調べるしかない?
007675
NGNG0077デフォルトの名無しさん
NGNG(・∀・)GO BACK!!
0078デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNG変数の値なのかがよく分からなくなるからだろ。
その為にも、変数そのものと、ポインタ変数の宣言時の名前の付け方は大事。
初心者本(まぁ普通のプログラムとかでもみんなそうだが)でポインタ変数に先頭に
小文字のpが付くのは、これはポインタ変数ですよって知らせる為だよ。
0080デフォルトの名無しさん
NGNGっつーのも,『はっきりと』教えて遣った方が良いと思われる。
0081デフォルトの名無しさん
NGNG>ではポインタで悩むときってどういうときなんだろうね。
俺も昔、C言語を勉強し始めた時 >>72 で悩んだ。
元々はアセンブラを弄っていて、ポインタの概念自体は
理解していたのだが、それでもCのポインタには悩まされた。
その後、結局はCの初期化構文が "式" に似ているのが
諸悪の根元だという事が分かるようになった。
これが悪いことなのかどうかは判断が分かれる所だと思うが、
Cのポインタを理解しにくくしている原因であることは
間違いない。
0082デフォルトの名無しさん
NGNGポインタをググって軽く調べたのでたとえてみますか。
ポインタと言うのにはアドレスというものがある。
このアドレスというのは、この掲示板の>>1->>80のレスに例えられる。
例えば>>1というのは順番に割り振られた只の番号であるが、
名前欄には「プロだよ」というように記述されている。
ということは、>>1は「プロだよ」ということになる。
当然、>>2->>80についても同じことが言える。
これと同じように考えればアドレスは簡単に理解できる。
変数A(プロだよ)に割り振られたアドレスというのが、1(>>1)なのである。
・・・ここまで書いたけどポインタの概念を理解できてるってことなんで、
蛇足だからやめときます。。。(ついでに間違ってる
0083デフォルトの名無しさん
NGNGだが一つ思うことは、人間には向き不向きがあるのだから、
ポインタが理解できないのなら、別の道を探すよう勧めるのが親切というものだ。
0084デフォルトの名無しさん
NGNGで p は
p = &hoge;
って 変数に&演算子をつけたものを代入するんだから、(配列・関数名/mallocとか他は一旦忘れて)
int hoge, &p;
って具合にint型の変数に&をつけたものを代入しますよ
ってこういう風に似せていたらどうなっていた、見かけだけ変えても無駄?
今更どうやっても無理だが。
(当然C++の参照は int *ref; で。)
0085デフォルトの名無しさん
NGNGじゃあ、ポインタ初学者は
LPSTR p = &a;
から学ぶことにしようぜ。
0086デフォルトの名無しさん
NGNGFORTRAN90からもポインタってあるんやね。
昔の言語と馬鹿にしてたけど90なかなか使えるかもぽ
0087デフォルトの名無しさん
NGNGたとえば a+1 とか書いたらそのポインタの型に合わせて加算するくせに
a = 0x0001 とか書いたらそのままアドレス代入するじゃん
じゃあ a = (0x001)+1 とか書いたらどうなのよ?とか思ったら
コンパイラが単項にまとめて処理しちゃうでしょ
じゃあ、
a = 2,b = 3,c = 5
とあって a = b+c とやったらどこがサイズ意識して変換されるのよ?
とかそーゆうの悩んだ
あと *ptr[3] みたいなコード書いた場合とかさー
これ ptr が int *ptr[n] って宣言してあった場合と
int **ptr って宣言してた場合って結果違わない?
0088デフォルトの名無しさん
NGNGlong* a;
aをロングのポインタとして宣言するという意味で.いや,これが正しいと思ってたんだよ.
でも却ってこの方が混乱しにくいと思ってる.
0089デフォルトの名無しさん
NGNGlong* a, b;
0090デフォルトの名無しさん
NGNGもちろんそういう風にはしないですよ.
間違ってるのは分かるんですが,感覚的に自分にとっては正しい.
0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNGお前さんの場合,混乱の原因は教える側の人間が言及しなかった点ではないのか?
アドレス同士の加算は禁止だしよ。
定数代入ならキャスト必須。
実際に口で教える必要なねぇけど,レジュメには書けと…
>あと *ptr[3] みたいなコード書いた場合とかさー
>これ ptr が int *ptr[n] って宣言してあった場合と
>int **ptr って宣言してた場合って結果違わない?
どっちも一緒。どうやら,まだ混乱してるようだな(藁
0093デフォルトの名無しさん
NGNG>あと *ptr[3] みたいなコード書いた場合とかさー
>これ ptr が int *ptr[n] って宣言してあった場合と
>int **ptr って宣言してた場合って結果違わない?
「結果」の意味がわからんが、(CPUの)処理は違う。
0094デフォルトの名無しさん
NGNGそこだって(int *)でもいける
0095デフォルトの名無しさん
NGNGそれ調べとこうと思ってまだ調べてないんだけど、つまり
配列からポインタを取り出してアクセスするのと
取り出したポインタにオフセットアドレッシングするのと
見かけが紛らわしいってことが言いたかった
つまり
mov esi,[edi+n] と
mov esi,[edi]
mov eax,[esi+n] みたいな感じ
*(ptr[n]) (*ptr)[n] ってきっちり書かないと紛らわしくないですか
いやこういうコードをこの間見かけたので
0096デフォルトの名無しさん
NGNG{
{ 0,1,2, },
{ 3,4,5, },
{ 6,7,8, },
};
char *tbl01[]=
{
(char *)0x01000,
(char *)0x02000,
(char *)0x03000,
};
char **tbl02;
void test()
{
char v00,v01,v02;
v00 = tbl00[1][1];
v01 = tbl01[1][1];
v02 = tbl02[1][1];
}
似たようなのでこれ
どれも表記は tbl[m][n] なのに出るコードは別モノ
0097デフォルトの名無しさん
NGNG> *(ptr[n]) (*ptr)[n] ってきっちり書かないと紛らわしくないですか
> いやこういうコードをこの間見かけたので
意味が全く違うんだが。
0098デフォルトの名無しさん
NGNG0099デフォルトの名無しさん
NGNGそもそも*ptr[3]という式の結合順位が紛らわしいという話と、
int *ptr1[n];
int **ptr2;
の違いの文脈と何の関係が?
「意味」的には、
*(ptr1[n]) = *(ptr2[n]) だし、 (*ptr1)[n] = (*ptr2)[n]。
0100デフォルトの名無しさん
NGNGint *ptr1[n]; これはどうやって結合するんですか?
int
*
ptr1
[n]
;
0101デフォルトの名無しさん
NGNGそれ式じゃないし…
int *(ptr1[n]);
宣言の意味は:
ptr1は配列。なんの配列かというと、ポインタの配列。
なにへのポインタかというと、int。
0102デフォルトの名無しさん
NGNG「ポインタの絡む宣言がうまく書けない・読めない」って事なのか?
0103デフォルトの名無しさん
NGNG0104デフォルトの名無しさん
NGNG0105デフォルトの名無しさん
NGNG>どんな変数にもアドレスがあって
これは誤り
0106デフォルトの名無しさん
NGNGつまり仮引数を参照するから&をつけてそのポイント=
場所を教えるわけだ、ポインタはそうした場所=
アドレスの位置を記録する(ry
0107デフォルトの名無しさん
NGNG0108デフォルトの名無しさん
NGNG0109デフォルトの名無しさん
NGNG△←これ
0110デフォルトの名無しさん
NGNG>>107 ←これ
0111デフォルトの名無しさん
NGNGなんていうかな、こう…ポイントするものっていうか、
ラベルっていうか、ただの数字っていうか…
メモリにはアドレスっていうのがあるだろ。まぁポインタそのもの
じゃあないんだけどな…まぁあれだよ。わかっただろ。
0112デフォルトの名無しさん
NGNGストリングコピーのコードが書けたり、関数を呼んだ先で引数の値を変えたり、
呼び出し先のアドレスを格納した配列からインデックスされた値をとりだしてその関数を呼び出す
なんてことができればそれでいい。
0113デフォルトの名無しさん
NGNG「Cはポインタがあって難しいからワカンネー」
とか言ってるサーブレットオンリーJava厨いるんですが
おまえはスカラ以外はポインタしか宣言したことねーだろう?と
小一時間問い詰めたかった。
0114デフォルトの名無しさん
NGNGじゃあ知らぬ間に普通に使いこなしていたわけじゃん。
俺すげー。
0115デフォルトの名無しさん
NGNG知らぬ間にwwwサーフできちゃったり、
知らぬ間にボタン一つでご飯を炊いちゃったり、
俺ってすげー。
0116デフォルトの名無しさん
NGNGおまいらってスゲー!!
0117デフォルトの名無しさん
NGNG0118デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNG∧_∧
_( ´_ゝ`) < パワーポイントだ馬鹿
/ ) _ _
/ ,イ 、 ノ/ ∧ ∧―= ̄ `ヽ, _
/ / | ( 〈 ∵. ・( 〈__ > *゛、_―
| ! ヽ ー=- ̄ ̄=_、 (/ , ´ノ
| | `iー__=―_ ;, / / / ←>>117
!、リ -=_二__ ̄_=;, / / ,'
/ / / /| |
/ / !、_/ / )
/ _/ |_/
ヽ、_ヽ
0120デフォルトの名無しさん
NGNG∧_∧
_( ´_ゝ`) < ポインターだ
/ ) _ _
/ ,イ 、 ノ/ ∧ ∧―= ̄ `ヽ, _
/ / | ( 〈 ∵. ・( 〈__ > *゛、_―
| ! ヽ ー=- ̄ ̄=_、 (/ , ´ノ
| | `iー__=―_ ;, / / / ←>>118
!、リ -=_二__ ̄_=;, / / ,'
/ / / /| |
/ / !、_/ / )
/ _/ |_/
ヽ、_ヽ
0121デフォルトの名無しさん
NGNG例を挙げればオティンティンはポインタ。
正しくおまーんを挿していれば良い感じ。オティンティンポインタを通じて
ぴゅっぴゅすれば挿した先を妊娠させるという遠隔操作が行える。
オティンティンポインタは別のおまーんを挿すことも出来るから、いろいろなおまーんに操作を行える。
ただしこの場合正しくポインティング先をdeleteしないとメモリリークが起きて
忘れたころに沢山の人から慰謝料やら教育費やら請求されて大変なことになる。
ポインタは何でも挿せる。
間違えて男性のアナルを刺してしまうと挿した男性を破壊してしまう諸刃の剣。
その場合、その男性はクラッシュし、OSごと落としてしまいかねない。
または挿した男性に付きまとわれて自分のOSが落ちかねない。
0122デフォルトの名無しさん
NGNG0123デフォルトの名無しさん
NGNG0124デフォルトの名無しさん
NGNG\____ __________
∨
∧_∧ _ _ .' , .. . ∧_∧
( ´_ゝ`) _ .- ― .= ̄  ̄`:, .∴ ' ( )
/ '' ̄ __――=', ・,‘ r⌒> _ / /
/ /\ / ̄\-―  ̄ ̄  ̄"'" . ’ | y'⌒ ⌒i
_| ̄ ̄ \ / ヽ \_ | / ノ |
\ ̄ ̄ ̄ ̄ ̄ ̄ \__) , ー' /´ヾ_ノ ←>>122
||\ \ / , ノ
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄ / / /
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄|| / / ,'
|| || || / /| |
!、_/ / 〉
0125デフォルトの名無しさん
NGNG\_____ ________
∨ _ _ .' , .. ∧_∧
∧ _ - ― = ̄  ̄`:, .∴ ' ( ) ←>>123
, -'' ̄ __――=', ・,‘ r⌒> _/ /
/ -―  ̄ ̄  ̄"'" . ’ | y'⌒ ⌒i
/ ノ | / ノ |
/ , イ ) , ー' /´ヾ_ノ
/ _, \ / , * ノ
| / \ `、 / / /
j / ヽ | / / ,'
/ ノ { | / /| |
/ / | (_ !、_/ / 〉
`、_〉 ー‐‐` |_/
0126デフォルトの名無しさん
NGNG参照と非参照を両方“明示的に”行わなければいけないから、難しいように思えるんじゃないか?
読み易さ重視でいけば、この問題は Delphi とか Java とか、言語レベルでサポート出来てる
C は融通が利く分、初心者には向かないんでは?
0127デフォルトの名無しさん
NGNG0128デフォルトの名無しさん
NGNG○○型へのポインタ型、その型の変数、その変数に入る値、その値が意味するもの、
の4つを全部「ポインタ」という同音異義語で呼ぶ「わかった」人がたくさんいるから。
そりゃ初心者混乱して当然だと思う。
0129デフォルトの名無しさん
NGNG世界観を拡張させる必要があるからではないか。
0130デフォルトの名無しさん
NGNGpublic
T getValue();
void setValue( T value );
Pointer& operator[]( int index );
Pointer& operator+( int index );
・・・
};
0131デフォルトの名無しさん
NGNG今更ですまんが、>>117 はレーザーポインタかも試練。
0132デフォルトの名無しさん
NGNG0133デフォルトの名無しさん
NGNGいまさらおせーんだよ!!
\_____ ________
∨
∧_∧ _ _ .' ,.. ∧_∧
( ´Д` )_ - ― = ̄  ̄`:, .∴ ' ( )
ヽ-'' ̄ __――=', ・,‘r⌒> _/ /
/ ,,-―  ̄ ̄  ̄"'" . ’ | y'⌒ ⌒i
/ ノ\\ . | / ノ |
/ / \\ , ー' /´ヾ_ノ
レ ノ ヽ_つ / , ノ
/ / ./ / /
/ /| / / ,'
( ( 、 / /| | ←>>131
| |、 \ !、_/ / 〉
.| / \ ⌒l |_/
| | ) /
ノ ) し'
(_/ -==≡≡≡=
0134デフォルトの名無しさん
NGNG>int *ptr1[n]; これはどうやって結合するんですか?
ptr1から演算子の結合順位に従って英語表記にしてけばいいんでないの?
ptr1 is an array of pointer to int.
を日本語にして
ptr1は、intへのポインタ型の配列。
英語圏の人間は理解しやすいと思われ。
0135デフォルトの名無しさん
NGNGポインタの使い方が良く分からない
と言う人のほうが多いんでない?
0136デフォルトの名無しさん
NGNGCは何でもかんでも * を使うから、初心者が混乱する。
0137デフォルトの名無しさん
NGNG本当にそうだろうか?
本当に初心者はポインタで混乱し、躓き、挫折してるのだろうか?
俺には、Cで挫折するヤツはそれ以外の部分で躓いてるようにしか見えない。
似非上級者どもが初心者に対して一生懸命「ポインタはヤバい、
、難しい、理解しづらい」と吹聴しているのはいかがなものか。
そんなこと言う奴はたいてい、Cで挫折したヤツであり、しかも
そいつらはポインタ以前の問題で挫折しているように見受けられる。
たとえばプログラムが使うメモリの領域で、スタックとヒープの概念さえ
理解できていないといったことだ。
そいつらが全てをポインタのせいにして「Cはポインタが複雑だから習得は難しい」
などと叫び、必死に初心者の邪魔をする。そうでないと自分達の無能ぶりが
救われないからだ。
0138137
NGNGウチの会社は6割がVB、3割がJava、1割がその他(Cなど)なのだが、
珍しくCを習得することになった。
そのことが決まってから3日間の間に、先輩達10人くらいに
「Cはポインタが難しい。初心者にはとても理解できない」
(↑おまえが低脳だからだ)
「Cはメモリを直接いじるから下手なことするとOSまで壊すから怖い」
(↑今のWindowsでできるもんならやってみろよ)
などという虚言妄言を繰り返し繰り返し言われたようだ。
なんかな、こういう馬鹿どもがいけないんじゃないのかね。
0139デフォルトの名無しさん
NGNGオレが講師をする時には、*の使われ方一覧を用意するようにしている。
0140デフォルトの名無しさん
NGNGぽいんた
ポインタの中身
あと何ありましたっけ
0142デフォルトの名無しさん
NGNG同じ物をPascalで書けば
ptr1: array[0..n-1] of ^Integer;
Cの表記がポインタを不必要に分かりにくくしている。
0143デフォルトの名無しさん
NGNGインスタンスは内容物。
メモリだと、自分のために確保された安全な領域や長さnの要素。
自分のために確保されていない場所はデンジャー。ハッハッハ〜。
読み出すだけなら、どこでも安全なんだけどねぇ。
とりあえず、これは保留。
0144デフォルトの名無しさん
NGNGそうでもない。
0145デフォルトの名無しさん
NGNG0146デフォルトの名無しさん
NGNGアドレスという実体で実装したものだと思うのだが、
参照だけでも難しいのかな?
まぁ、抽象概念というのは当たり前すぎて難しかったりする物ではあるけれど…
例:プログラム・関数・変数など
抽象概念を身につけるには、比喩や具体例を積み重ねつつ、
そこにある関係を丁寧に対応付けて、パターン認識力を育てていくのが王道で、
定義とか説明とかにこだわりすぎるとかえってハマるような気がする。
0147デフォルトの名無しさん
NGNG>参照だけでも難しいのかな?
如何にも難しそうに語るような連中が初学者を混乱させているだけでしょう。
0148デフォルトの名無しさん
NGNG>参照と非参照
dereferenceの日本語訳って,非参照だったっけ?
こんな訳だと,単語から意味わかんねぇよなぁ。
>>145じゃないが,「体で覚える」になる原因じゃないか,これ。
0149デフォルトの名無しさん
NGNGそんな訳は聞いたことが無い。「逆参照」じゃないか。
しかし「参照解決」のほうがいいと思う。
0150デフォルトの名無しさん
NGNG0151デフォルトの名無しさん
NGNG0152デフォルトの名無しさん
NGNG0153デフォルトの名無しさん
NGNG0154デフォルトの名無しさん
NGNGだから「入れ物」なのはポインタ変数だと何度言ったら気が済むのだ!
0155デフォルトの名無しさん
NGNG漏れは、func(char *) としか使わないぞ。
0156デフォルトの名無しさん
NGNGテーブルジャンプする時ぐらいしか使わないな。
0157デフォルトの名無しさん
NGNGくらいしか使わないな。
0158デフォルトの名無しさん
NGNG0159デフォルトの名無しさん
NGNGおれも一緒だなぁ。
Cの本のポインタの説明にあるような
↓こんな直接変数のアドレスを見ることなんてしないしね。
配列と似た感じでしか使ってないよ。
int main(void){
int a;
int *p;
a = 3;
p = &a;
printf("%p %p\n", &a, p);
return 0;
}
0160デフォルトの名無しさん
NGNGなにいってんの?
0161デフォルトの名無しさん
NGNG0162デフォルトの名無しさん
NGNGCの世界ってそれがノーマルなのですか… orz
Javaで5年PG→いまCやってて、ほとんどヒープに確保してるのですが…
0163デフォルトの名無しさん
NGNGヒープ領域のみになるんだか・・・
プログラム領域かもしれないし
スタック領域かもしれないし・・・
0164デフォルトの名無しさん
NGNGヒープ使うのがふつーですね。
組み込み等、環境の制限が厳しい場合は
避ける事もありますが。
>163
えーっと…誰かそんな事書いてました?
0165デフォルトの名無しさん
NGNG頑張れば、ポインタ一切使わずに書くことも出来るでしょう。
あんまり見たいコードではないでしょうけど。
・関数ポインタなんか使わない → すべてswitch〜case
・ヒープなんか割り当てない → すべて固定長の配列
・引数にもポインタなんかない → グローバル変数
・構造体にもポインタなんかない → リストなどという
複雑なデータは扱わない
0166デフォルトの名無しさん
NGNG「ポインタを使わない→ヒープを使わない」は認識としておかしくないぞ
「ヒープを使わない→ポインタを使わない」ならおかしいが
>>162
ようやく「Javaは使えない」の意味がわかってきた
スタックですむことならなるべくスタックを使うのが「C」の「ノーマル」
ヒープに確保するのはその理由があるときのみ
確保時の変数のスコープとオブジェクトの寿命が異なるとかな
デフォルトがヒープなのは危険だよ
free()ちゃんと呼べてる?
0167デフォルトの名無しさん
NGNG0168デフォルトの名無しさん
NGNG構造体にポインタはほとんどない。
リストも滅多に使わないし。
Javaは文字列を扱うとき(自分のツール)にたまに使ってたよ。
0169デフォルトの名無しさん
NGNGmov DX,AX
この差
0170デフォルトの名無しさん
NGNG0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNGポインタ使わずにゲーム作った事あったなぁ・・・X68でw
その後、アセンブリ言語を勉強して
初めてアドレス空間のことを把握できて
Cに戻ってもポインタの仕組みや動きをやっと理解できた記憶も。
しかし今思うと、よくゲームつくれたなぁと逆に思ったり。
コード無くしたから今更確認できないけどw
0173デフォルトの名無しさん
NGNG内部的にどの言語もポインタを使っているので、
ポインタは必要だしみんなポインタを使っている。
0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNGポインタを使っている。
それでいいじゃないか。
0176デフォルトの名無しさん
NGNG0177デフォルトの名無しさん
NGNG誰もが使っているが、通常のプログラミングに知識は必要ない。
0178デフォルトの名無しさん
NGNGポインタの勉強とSQLの勉強、どっちかやるならSQLの勉強せろ、って感じだ。
0179デフォルトの名無しさん
NGNG要するに「アドレスみたいなもの」だよ
問題はあの腐りきった表記法なんだよ
複雑なやつになるともう訳ワカラン
0180デフォルトの名無しさん
NGNG0181デフォルトの名無しさん
NGNG0182デフォルトの名無しさん
NGNG0183デフォルトの名無しさん
NGNG組み込み系では、まだあるかも知れないが。
0184デフォルトの名無しさん
NGNG0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNG0188デフォルトの名無しさん
NGNG打たなければ理解不能。
0189デフォルトの名無しさん
NGNG何が必要なくなったの?
0190仕様書無しさん
NGNG配列num[i]をポインタnum_pで表現する場合、Cの式上において
下記のことがきちんと整理できていればポインタなんて
難しくなかったんだよね。たったこれだけのことが初心者には
大きく混乱を招いてしまう。
num_p + i = num + i = &num[i] /* 配列のアドレス */
*(num_p + i) = num[i] /* 配列の中身 */
0191190
NGNG*(num_p + i) = *(num + i) = num[i] /* 配列の中身 */
0192デフォルトの名無しさん
NGNG関数ポインタ
0193デフォルトの名無しさん
NGNG「メモリ上の一点」を指しているだけみたいで。
同じアドレスを指してても型によって扱いが異なるわけだから
「メモリ上の塊」を指しているということをもっと強調すべきだろう。
0194デフォルトの名無しさん
NGNGchar **aa_p;
char ***aaa_p;
.
.
aa_p = &a_p;
aaa_p = &aa_p;
.
.
printf("%s\n", *aa_p);
printf("%s\n", **aaa_p);
.
.
一般の開発でダブルポインタ以上使うのはどこまで許されるもんですか?
0195デフォルトの名無しさん
NGNG0196デフォルトの名無しさん
NGNGさあ?。規約でその種の記述は見たこと無いし。
規約策定者が精通しているのなら「その種の規約は無い方が良い」と判断して、制約しない
規約策定者が精通していないのなら「どこで制約すべきなのかわからない」ので、制約しない
なのカモネ
0197デフォルトの名無しさん
NGNGこれが許されないのなら文字列の配列が作れないじゃーないか
0198デフォルトの名無しさん
NGNGメモリ上の一点じゃなくて、
メモリ空間を区画割りして、それぞれにつけた番地。
0199デフォルトの名無しさん
NGNG昔に、使った覚えが…
0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNG区画割してないよ。
それはallocの話で、ポインタはいくらでもその区画の途中を指すことができる。
区画割っていうのが、8ビットごとにまとめて1バイトっていうことなら、そのとおりだけど
0203デフォルトの名無しさん
NGNG増減の幅の話ってこと?
そしたら、区画割ではないよね。意味のある区切りを表す保証はまったくないんだから。
0205デフォルトの名無しさん
NGNG0206198
NGNGそれ以外の型は、複数区画をまとめたものに過ぎないという解釈で。
0207203じゃないけど
NGNGそれは型として保障されているだけであって、メモリ内部のデータ自体には関わらないって話じゃないの?
別に int 型の領域を char として計算してもかまわないんだし
0208207
NGNG0209198
NGNGアドレスの説明だ。
まぁ、アドレスが理解できればポインタはすぐ分かるだろうということで。
0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG0212デフォルトの名無しさん
NGNG0213まとめ
NGNG・メモリ上の物理的な位置を示す。
・最小単位(1Byte)で区切られた区画に割り当てられた数値(番地)。
ポインタ
・メモリ上の論理的な位置を示す。
・任意の型(のサイズ)で区切った区画を識別するもの。
・いわばメモリの目盛り。(型=メモリを測るためのものさし)
こんなんでどうでしょ。
…いや、「メモリの目盛り」なんてさぶいギャグを言いたかったわけではないよ。
0214デフォルトの名無しさん
NGNG>最小単位(1Byte)
とは限りません。
0215デフォルトの名無しさん
NGNGかならず1byteになる、という意味ではないんちがう?
0216デフォルトの名無しさん
NGNGa = b;
これすら面倒なワナ
0217デフォルトの名無しさん
NGNG間違ってたらフォローよろ
ポインタ変数
・メモリの目盛り、つまりポインタを格納する変数
ポインタ型
・ポインタ参照先のデータ型を定義する型
参照
・ポインタがさしている先のメモリ内容を使用する行為
相対アドレスと絶対アドレスの定義も必要かな?
>>213 ではアドレスが絶対、ポインタが相対みたいになっているけど、
実際には、ポインタにどちらが使われるのかは記述時には判んないような気もする
あと >>213 のポインタの説明は、微妙に間違っているような気がする
位置情報には、メモリ内部の型は含まれないはず
0218デフォルトの名無しさん
NGNG0219デフォルトの名無しさん
NGNGxxx *p;
っていう変数があるときに
++p;
での実際のアドレスの増幅が実行時にかわることはない。
0220デフォルトの名無しさん
NGNGメモリそのものの存在も実装いぞんであり
……とかいってまぜっかえしてみたりする
初心者の中にも
・メタファのほうが理解しやすい人
・実装に即したほうが理解しやすい人
の2種類がいるよね
どちらをターゲットにするかで説明の仕方を変える必要があると思う
0221デフォルトの名無しさん
NGNG実際に理解できないから、メタファで理解した気になる人・・・。
0222デフォルトの名無しさん
NGNG・(抽象的)仕様が理解できる人
・実装に即さないと理解できない人
はいるとおもうが。
0223デフォルトの名無しさん
NGNG金融系アプリかいてたときにMSの今猿にそこまでCOMの細部まで聞いてくる人はいませんと嫌がられた。
0224デフォルトの名無しさん
NGNG分かってないんだと思う。
変数の名前とか型とかLVALUEとかRVALUEとかさ。
Cは記法上はRVALUEとLVALUEの区別がない。
変数の名前と型とLVALUEとRVALUEを明確に理解している人にとって
ポインタの理解は(記法の面倒さとかは別として)、別に何でもないことの
はず。
まあC++や、MS-DOSのミディアムモデルとかになるとまた別の話ですがね。
0225デフォルトの名無しさん
NGNG教えていないだけなんじゃないかと
0226デフォルトの名無しさん
NGNGただ、ポインタへのポインタとか構造体へのポインタとか少し難しくなると
ついて来れなくなるやつが多いように思う。
0227デフォルトの名無しさん
NGNGなぜダブルポインタ?普通にシングルポインタが理解できた人なら
ダブルもトリプルもすぐ理解できるはずだよ。
ダブルポインタ変数はシングルポインタ変数のアドレスを格納する変数。
トリプルポインタ変数はダブルポインタ変数のアドレスを格納する変数。
以下略。
////////////////////////////////////////////
char *single = NULL;
char **double;
char ***triple;
double = &single;
triple = &double;
////////////////////////////////////////////
0228デフォルトの名無しさん
NGNG混乱する人が多いんじゃないだろうか
char*
は普通は暗黙にchar配列へのアクセスに使うし、おまけにNUL文字で終端されている
ことが通常は期待されるが、言語の構文だの記法だのには
それは一切あらわれないし、チェックする機構もない
ただのcharを指してるかchar[]を指してるかは「プログラマのみが知る」
セマンティクス上の問題だ
例えば配列を指しているならば
□--------------->□□□□□
のようなメモリイメージを思い浮かべるんだろう
そうでなければ
□--------------->□
だな
で、どっちなのかは宣言だけからは分からないわけだ
その辺がすでに分かりにくくて、その上で多次元の配列とかポインタ配列とか
関数ポインタだとかがごっちゃになって
どういうメモリイメージを思い浮かべたらいいか分からない
そういうのが初心者のありがちな展開ではないのかな
0229デフォルトの名無しさん
NGNG激しく同意
>>227
>普通にシングルポインタが理解できた人なら
>ダブルもトリプルもすぐ理解できるはずだよ。
同意
0230デフォルトの名無しさん
NGNGポインタの時点で既に説明が上手く出来ていない罠。
0231デフォルトの名無しさん
NGNG配列などで結果的に扱ったことはあったけれど。
0232デフォルトの名無しさん
NGNGつかっとるやないか・・・
0233前スレ755
NGNG0234デフォルトの名無しさん
NGNGダブルぐらいならmain()の引数として毎度おめにかかってるだろ
配列的使い方以外でありがちなのは
関数で「ポインタを(戻り値ではなく)引数経由で返す」場合かな
これだけで一段間接参照が増えるから少なくともダブルにはなる
0235デフォルトの名無しさん
NGNG0236231
NGNGイやもっと、こちらの予想だにしないトリッキーなコードを期待しているんだけれど
0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNG0239デフォルトの名無しさん
NGNGたとえばこういう話。
自分は指を相手の頭にさす。
そして言う。
「俺はそれをさした。」
ここで、それについて考えてみる。
それは、頭であり、番地であったり、場所であったりする。
こんなのどうでしょ。
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNG0242デフォルトの名無しさん
NGNG0243デフォルトの名無しさん
NGNGhoge = &foo;
*hoge → foo(保持している値)
hoge → foo(アドレス)
&hoge → (気にするな)
ポインタって、こんな感じでいいの?
0244デフォルトの名無しさん
NGNGかしこくみえるよ。
0245デフォルトの名無しさん
NGNGfooは左辺にかくとfooのアドレス(LVALUEをこう書いちゃうのは単純化かもしれんが)
右辺に(式の中に)かくとfooの値
hogeも左辺にかくとhogeのアドレス
右辺に書くとhogeの値=fooのアドレス
*hogeは左辺にかくとhogeの保持してる値=fooのアドレス
右辺に書くとfooの値
&hogeは式だからかならず右辺値で
hogeのアドレス
0246デフォルトの名無しさん
NGNG変数とか式とか
もっと基本的なことから勉強しなおそう
0247デフォルトの名無しさん
NGNG// GCC version 3.2 にて動作確認
#include <stdio.h>
int main(void) {
int* hoge;
int foo = 1;
int* bar;
hoge = &foo;
printf("%d\n", *hoge); // fooの値が表示される。
*hoge = 2;
printf("%d\n", foo); // fooの値が変わるぞい
bar = hoge;
*bar = 3;
printf("%d\n", foo); // fooの値が変わる
return 0;
}
0248デフォルトの名無しさん
NGNGせっかくgccもってるなら、cc -Sで出るasmのコードを見たほうが
あからさまにてっとり速い気がするけど
0249デフォルトの名無しさん
NGNG私の環境はMinGWなのね。
cc ないの
0250デフォルトの名無しさん
NGNG0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNG×月□日の時点では、○田 △夫が○○市長なのである。
だから×月□日発行の住民票の写しは、○田 △夫が発行するのである。
'○○市長' てのが変数名だとすれば、こいつはポインタの役割をする変数なのである。
※私を煽る人は、煽ってることが分かりやすいように、
文末に「ゲロッピーピュフプー」と書いて下さい
0253デフォルトの名無しさん
NGNG0254デフォルトの名無しさん
NGNG「紙をくれ」って言ってる人に
1枚とって渡してあげるのが「値渡し」
「紙なら隣りの用具庫にあるよ」って言って出て行くのが「ポインタ渡し」
0255デフォルトの名無しさん
NGNGゲロッピーピュフプー
0256デフォルトの名無しさん
NGNG解らせるつもりなら、他の何かに喩えたって無駄。
0257デフォルトの名無しさん
NGNG強制的に理解させようなんて思っても無駄
0258デフォルトの名無しさん
NGNG「参照渡し」じゃないのか?
0259デフォルトの名無しさん
NGNG宝地図がポインタ
宝地図の地図がポインタのポインタ
0260デフォルトの名無しさん
NGNGポインタはポインタだ
0261デフォルトの名無しさん
NGNG参照はこうじゃないか?
相手「紙なら隣りの用具庫にあるよ」
自分「そうか。ならXX(部下)、紙取ってきてくれ」
0262デフォルトの名無しさん
NGNG0263デフォルトの名無しさん
NGNG0265デフォルトの名無しさん
NGNG基本的な概念は同じ。
アドレスを指すという意味ではもう少し別の例えが必要だけど、
全く知らない初心者に教えるなら地図でも十分かと。
0266俺は文系だが
NGNGそれで分からないと...
0267デフォルトの名無しさん
NGNG0268デフォルトの名無しさん
NGNG「地図」だの「指」だの「頭」だの、いきなりコンピュータと無関係な
たとえ話するからダメなんだよ。
http://mikata.curiocube.com/hello/ch03_memory1.html
こんな感じでいいだろ?
0269デフォルトの名無しさん
NGNG| |
| |
| |
| |
∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´Д`)// < いいでぇーす。
/ / \_____________
/ /| /
__| | .| | __
\  ̄ ̄ ̄ ̄ ̄ \
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
0270デフォルトの名無しさん
NGNGポインタを使うことでスマートに実装できるという簡易な実例を列挙せよ。
/* こういうときポインタ使うよね、って例をだせということですわ */
0271デフォルトの名無しさん
NGNG・swap
・List
・コールバック関数
0272デフォルトの名無しさん
NGNGdump
0273デフォルトの名無しさん
NGNG仮想関数
0274デフォルトの名無しさん
NGNG>12にまだだれも突っ込みを入れていない?
といいつつも、漏れのポインタの認識もこんなだが。
[ポインタとは]
ポインタとは*演算子を使うことで特定のオブジェクトを間接参照することが出来る変数である。
まず、ポインタは以下の手順を用いて間接参照したいオブジェクトを指す手順が必要である。
手順1. 間接参照したいオブジェクトの型に *をつけて宣言する。
手順2. 間接参照したいオブジェクトのアドレスを代入する。
以上の手順を踏むと、ポインタ変数に*演算子を使って2で指定したポインタ変数を
間接参照できるようになる。
また、ポインタの値を変化させることによって間接参照するオブジェクトを
変えることができる。例えば、ポインタの値に++とすると一つ後ろのオブジェクト、
--とすると一つ前のオブジェクトというように。これはポインタ演算と呼ばれている。
ところがこのポインタ演算はメモリ破壊等の原因となりやすい。
例えば、++しすぎてあてずっぽのところを指してしまったりとか。
このためJava言語はポインタ演算のようなことが出来ない仕組みになっている。
0275デフォルトの名無しさん
NGNG通信などでメモリ直接いじるとき除く
0276デフォルトの名無しさん
NGNG多くのポインタ演算は配列演算子で書き換えることも出来るけど
結局Cでは内部的にはポインタ演算なので(危険度まで含めて)一緒でしょ
それに
c = *p++; // fetch and incr
*dst++ = *src++;// copy
みたいなのが簡潔に書けるのはやはり便利だけど
ほんとにつかわないの?
0277デフォルトの名無しさん
NGNG0278デフォルトの名無しさん
NGNGそういうのは、配列の書き方でした方が分かりやすいしなぁ。
(デバック時も含めて)
線形リストみたいなのだと、本質的にポインタを使うわけだが
線形リストに使うポインタでは、ポインタ演算を使う意味ないし。
この大きく分けて2つの使い方があるってのが、
ポインタの複雑さなんだろうな。
0279デフォルトの名無しさん
NGNG配列の途中から途中までを関数に渡して処理させる場合。例えば
int a[10];
sort(&a[5], 5);
とか。
0280デフォルトの名無しさん
NGNGな、なんかキワどいコードだね・・・。
まぁ、簡潔に見せるために、省略してるんだろうけど。
0281デフォルトの名無しさん
NGNGあれば便利、なくても問題ないなら別にいい
ってレベルの様な気がする
0282デフォルトの名無しさん
NGNG昔のC言語の教科書のレベルでも、
文字列操作とか、FILE* とか、ポインタは使うのですが。
0283デフォルトの名無しさん
NGNGポインタは難しいね、
って言われるようなポインタの利用法は
使い道自体が難しいってことかもな。
直感的にわかりづらくなるのは間違いないし。
0284デフォルトの名無しさん
NGNG0285281
NGNGでもポインタ使っていることを意識させない言語もあるでしょ
仮に言語レベルで隠すことが出来ればそっちのほうが初心には分かり易いんじゃないかって話
>>284 の言うとおり、分かっていた方が断然良いがな
0286デフォルトの名無しさん
NGNG所有の概念やaliasing、deep/shallow copyみたいなのが
初心者を挫折しやすいんじゃないだろうか
よくはしらないが
どのみち他の言語でも学ばなければならないことだ
Cのポインタの違いはより機械の実装に近いというだけだろう
0287デフォルトの名無しさん
NGNG逆にポインタを知らないから、浅い/深いコピーとかの違いが分からなくなるんじゃないか?
記述の難しさと、ポインタを意識する/意識しない部分の接合性が上手くいっていないのが、
原因の様な気がする
C は前者、Java は後者 (Java にはポインタなんて用語はねぇがな)
0288デフォルトの名無しさん
NGNG初心者に小一時間問い詰めないと空振りっぽい。
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNG「変数は入れ物」の世界から
「値にアドレスでアクセスする」の世界への
対応が出来てねーんじゃねーかと。
0291デフォルトの名無しさん
NGNG0292デフォルトの名無しさん
NGNG0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNG「thisはC++で定義されているオブジェクト自身へのポインタ」
なんて表記だと煙に巻かれた気がする。
実際
CPaintDC dc(this);
とかはもうイディオムで覚えてるし、これとreturn *this;を除いて、
突然、メンバの呼び出しで使われると困惑するよ。
基本的には変数ポインタと変わらないはずなんだけど、
俺がクラスを分かってないのか
あ、当然、職業プログラマじゃなく勉強中ね。
0295デフォルトでは辛抱たまらん
NGNG非常にインチキな入門書を買ってしまいましてね。
ポインタの説明が数ページしかないの。
「変数箱の荷札」のようなそれはそれは恐ろしい説明であった。
使い道も使用法も意味不明だったし。
マイバイブルとか言っちゃって、
わかんないから何度も何度もよみかえしちゃって、
C言語はむつかしいね〜とか脳みそに植えつけられる結果となった。
0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNGポインタの概念的な説明だけされても、
これが一体何の役に立つのかがわからんから、
初心者は難しく感じるんじゃないかと思う。
ゆえに、ポインタを使わんと解決できない問題を与えるのがいいかと。
0298デフォルトの名無しさん
NGNG住所録と住所の関係なり
そんなもんで悩むな
0299デフォルトの名無しさん
NGNGそういったことを気にせず手軽に使いたいならもっと高級な言語使えばいいことだし。
昔は選択肢がなかったのかもしれないけど、今はCPUも早いし、メモリも大量に積めるし、コンパイラも優秀だし、高級言語でまったく問題ないはず。
0300デフォルトの名無しさん
NGNG>そういったことを気にせず手軽に使いたいならもっと高級な言語使えばいいことだし。
だからこそ、VBがここまで普及してる罠。
0301デフォルトの名無しさん
NGNG>それは良質のサンプルソースを提示すりゃ済む問題です。
ちょっと分けてもらえませんか?
0302デフォルトの名無しさん
NGNGPCを入手する前に、本で大体覚えたし。
でも本のおかげで、ミスると暴走するというイメージが植え付けられて、
最初は使うのが怖かったな。
苦手意識の何割かは、ポインタの難しさそのものではなく「怖さ」なんじゃないかと思われ。
0303デフォルトの名無しさん
NGNGポインタを難しいと思っている人には
ポインタを使ったコーディングを(仕事で)
させるのはまずいだろうな
0304デフォルトの名無しさん
NGNG0305デフォルトの名無しさん
NGNG0306デフォルトの名無しさん
NGNGどうかと思う。
学生のころポインタの説明でいきなり定義したポインタに値設定するような記述があったり
して非常に混乱した記憶が。
説明に不必要でも扱ってよい領域をポインタに設定して書き込みを行うという一連の動作に問題ないサンプルソースにするべきだと思ったがどうよ?
0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNG韓国から出稼ぎにきてる方ですか?
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNGそこで「つくわか@void」ですよ。
0311デフォルトの名無しさん
NGNG配列とポインタを同列で考えると危険じゃなかんべ?
0312デフォルトの名無しさん
NGNGポインタを配列で表現することは・・・
0313デフォルトの名無しさん
NGNGこれさえあればどこへでもいけるはず……、なんだけど駄目な奴が扱うととんでもないことに。
参照:カーナビ
上のがよくわかっていない奴にはこっちの方がまだ安心できる(かも)。が、(当たり前だが)完璧に信用できるわけではない。
ポインタでも参照でもない変数等:駅〜家などよく通る道
言わずもがな。
0314デフォルトの名無しさん
NGNGしかもなんだ?完璧に信用できるわけではないって。
紙の地図は更新されないけど、カーナビの地図なら目的地が変われば更新できるしくみがある、という点はその例えでいいけど。
0315デフォルトの名無しさん
NGNGよけいわからんなるわそれ
0316デフォルトの名無しさん
NGNG> ポインタでも参照でもない変数等:駅〜家などよく通る道
>言わずもがな。
全然わからん。せめてなにか言ってくれ
0317デフォルトの名無しさん
NGNGint a = 5;
int *aP; int型のアドレスを入れたい時はポインタもint
aP = &a; を付けると先頭アドレス
printf("%d", *aP); *を付けると値
[文字の場合]
char a[] = "Hello";
char *aP; char型のアドレスを入れたい時はポインタもchar
aP = a; 変数名だけで先頭アドレス
printf("%s", *aP); *を付けると値
ポインタは変数の値を間接参照(アドレスを指定)する時に使う。
変数名, *, & 等ごちゃごちゃ出てくるからややこしくなっているだけ
0318デフォルトの名無しさん
NGNG0319デフォルトの名無しさん
NGNG変数を要素数が1つの配列と考えてください。
0320デフォルトの名無しさん
NGNG0321デフォルトの名無しさん
NGNG通常の配列のインデックス番号が0からはじまるのに対して、
ポインタの場合はメモリ全体を大きな一つの配列とみなしたときの
インデックス番号なので注意してください。
0322デフォルトの名無しさん
NGNGなどという基礎的な観点を礎に「アドレス」という語を使うべきなのか。
それとも「高級言語というのはアーキテクチャを隠蔽してもなお存立できうるべきなのだ」
などという観点から「アドレス」という語を避けるべきなのか。
俺は勉強する順番は基礎からの方がいいと思うんだが、
そんなものを全部飛び越えていきなり C++ やら Java やらやってる即席プログラマもいるわけで、
そういう連中に説明するには後者の方がいいんだろうかなぁ。
0323デフォルトの名無しさん
NGNG0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNG0326デフォルトの名無しさん
NGNGそうおもって、量子力学にまで興味を持ってしまってわけかわらなくなってる今日この頃orz...
廃人になりかけてる気がする...
0327デフォルトの名無しさん
NGNG0328デフォルトの名無しさん
NGNG俺も量子力学は良く分からんが
少なくとも難易度では
易:ポインタ<<<<<|越えられない壁|<<<<<<|越えられない壁|<<<<<<量子力学:難
である事は確か
0329デフォルトの名無しさん
NGNGそこに "矛盾" が生じない限り、
コンピュータの基礎から理解する
必要性は全く生じない筈なんだがな・・・
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNG0332デフォルトの名無しさん
NGNG0333デフォルトの名無しさん
NGNG0334デフォルトの名無しさん
NGNG0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNGああ、コンテナがあった!
だからポインタなんて覚えなくていいよ。
0337デフォルトの名無しさん
NGNG0338デフォルトの名無しさん
NGNG関係無いってどういう意味でいってるの?
少なくともコーディングレベルでは大いに関係あるわけだし。
0339デフォルトの名無しさん
NGNGほとんどの処理系が動的確保したメモリ領域のアドレスを管理するけど、アドレスと無関係なIDを振ってもいいわけだし。
Win32のGlobalAllocとかみたいに直接のアドレスじゃないこともある。
それに動的確保した領域のアドレスについて、演算ができる必要はないし。
0340デフォルトの名無しさん
NGNGほんとにそういうことが一般的な開発者だったらスマソ
0341デフォルトの名無しさん
NGNGをい、間違っているぞ。
> printf("%s", *aP); *を付けると値
0342デフォルトの名無しさん
NGNG特殊かどうかは知らんけど、Win32は多く使われているよね。
俺が言いたいのは、本質的には関係がない、ということ。
実装上関係がある処理系が多いというだけでね。
0343デフォルトの名無しさん
NGNGたしかに・・・。
間違っていました m(__)m
0344デフォルトの名無しさん
NGNG0345デフォルトの名無しさん
NGNG参照って何ですか?
0346デフォルトの名無しさん
NGNG参照はC++にもJavaにもVBにもあるんだが、一体君はどの言語が使えるんだ?
まさかCだけか?
0347デフォルトの名無しさん
NGNGポインタに悩んでいるような香具師が既にJavaやC++をやっていて
参照を知っているとはとうてい思えないのだが・・・。
0348デフォルトの名無しさん
NGNGVBが抜けているぞw
C++はともかくJavaやVBで参照を知らずにプログラミングすることは出来ない。
JavaやVBを知っているということは参照を知っていると言うこと。
君はポインタに悩む奴は、JavaやC++やVBをやっていないと言いたいのか?
逆にいえばJavaやC++やVBをやっている人間はポインタを知っていると
そういうことだね。
0349デフォルトの名無しさん
NGNG0350デフォルトの名無しさん
NGNGJavaやVBなら、参照しらなくてもプログラムできるよ。
0351347
NGNG> VBが抜けているぞw
VBなんてただ漏れが知らなかったから書かなかっただけだよ。
つーか参照がある言語なんて他にもあるだろ。
> 君はポインタに悩む奴は、JavaやC++やVBをやっていないと言いたいのか?
違う。「参照を理解している」≠「やっている」。
漏れが言いたいのはポインタを説明をするのに参照を持ち出すのは
適切ではないということだけだ。
> 逆にいえばJavaやC++やVBをやっている人間はポインタを知っていると
> そういうことだね。
んなことは言ってないよ。
ポインタについて悩む香具師≠参照を理解している香具師
が
参照の概念がある言語をやったことのある香具師=ポインタを理解している香具師
とはならないと思うのだが。
0352デフォルトの名無しさん
NGNGディープコピーとシャローコピーの違いがわかっている人は
ポインタも理解していると言えると思う。
0353デフォルトの名無しさん
NGNGそうでもない。ウチの会社のサブレト厨は
オブジェクトのコピーメソッドは用意してるけど
ポインタについて全く理解してない。手順として知ってるだけ。
Javaにはポインタは無いとかいまだに言ってるし。
0354デフォルトの名無しさん
NGNGUnko unko = new Unko();
Unko refUnko = unko;
どれがポインタになるの
0355デフォルトの名無しさん
NGNG考えるな、感じろ
0356デフォルトの名無しさん
NGNGわかっていて聞くあたりいやらしいな
マジレスすると
その中にはなくて
NullPointerExceptionの
5文字目から11文字目の中に隠れている。
0357デフォルトの名無しさん
NGNGアドレス演算可能なポインタはない。
0358デフォルトの名無しさん
NGNG(1) メモリ上の位置を一意に特定できる。
(2) 「何も指していない」状態を持つこともできる。
(3) 「何を指しているか判らない」状態を持つこともあって、非常に困る。
を満たさねばならず、従って「Java にはポインタはない」
0359263
NGNGunsigned long* p;
p = (unsigned long*) &c;
このとき,*p が 100 になることを期待したいんだが,
ならない.
なんでか,おしえて
0360デフォルトの名無しさん
NGNGアドレス&cの前後に0以外の数値が格納されているから。
0361デフォルトの名無しさん
NGNG指し示す型のサイズによる演算が可能、という大切なものが抜けている。
0362デフォルトの名無しさん
NGNGあっちこっちで聞くな、ぼけぇ。
0363デフォルトの名無しさん
NGNGようするに配列のインデックスに使っている変数は
増やしたり減らしたりできるってことだろ?
変数なんだから別に当たり前。
0364デフォルトの名無しさん
NGNG> ポインタとは
> (1) メモリ上の位置を一意に特定できる。
> (2) 「何も指していない」状態を持つこともできる。
> (3) 「何を指しているか判らない」状態を持つこともあって、非常に困る。
> を満たさねばならず、従って「Java にはポインタはない」
Javaに無いのは(3)だけだな。
0365デフォルトの名無しさん
NGNG値を増やしたり減らしたりできない変数をもつ言語も多いですよ。
0366デフォルトの名無しさん
NGNG(5)指し示す型のサイズによる増減が可能
0367デフォルトの名無しさん
NGNGCの場合は0番地を指すことになるから、(2)を満たさないということは、アレはポインターじゃないのかね?
0368デフォルトの名無しさん
NGNG0369デフォルトの名無しさん
NGNG0370デフォルトの名無しさん
NGNG0371デフォルトの名無しさん
NGNG0372デフォルトの名無しさん
NGNG何を指しているのか分からないというのは、どんな型を指しているのか分からないということだろ。
要するにCではvoid *
0373デフォルトの名無しさん
NGNG0374デフォルトの名無しさん
NGNGCにおけるぬるぽいんたは、0番地を指しているわけではない。
>>369
どこかを指しているが、何を指しているかはわからない。
ということだ。アドレスの範囲外である場合もある。
0375デフォルトの名無しさん
NGNGそういうのは、「何を指しているのか判らない」状態というのかね?
じゃあ、「何を指しているのか判る」状態というのもあるのかね?
0376デフォルトの名無しさん
NGNG0377デフォルトの名無しさん
NGNGとりあえず、Cのアレは、それ自身では有効なアドレスを指しているか無効なアドレスを指しているかわからないから、「何を指してるか判らない」状態はもたないね。
ということで、Cのアレは、>>358の定義によれば、やっぱりポインタではないと。
0378デフォルトの名無しさん
NGNGこの時点で、ポインタが指しているものを特定することができる。
0379デフォルトの名無しさん
NGNG補足きぼんぬ。
0380デフォルトの名無しさん
NGNGみたいなことができることから「int型は、どんな数値をもつか判らない状態をもつ」とはいわんだろ。
ポインタは、どこかを必ず指すんだよ。
0381デフォルトの名無しさん
NGNG0382デフォルトの名無しさん
NGNGint a;
の方が適切だな。
0383デフォルトの名無しさん
NGNG(3) というデメリットをあえて持ち出すことで、
Java はポインタのない欠陥言語だ、という体裁の定義を作りつつ、
その実 C を揶揄しているという、ウィットに富んだレスをしたかったのだと思うが、
しかし実際は「C ではポインタ変数に何でも代入できる」という、
言ってみれば単なる言語仕様のあやというべき程度のことであり、
それがゆえにレスの意図がみなつかめず、事態は紛糾してしまったと僕は分析する、
0384デフォルトの名無しさん
NGNG0385デフォルトの名無しさん
NGNG「どこも指していない」というのは言語の定義。
0386デフォルトの名無しさん
NGNG> (3) というデメリットをあえて持ち出すことで、
> Java はポインタのない欠陥言語だ、という体裁の定義を作りつつ、
いや(3)というデメリットを持ち出したことで、
ポインタにはデメリットがある。
ポインタは無い方が良いと暗に示したのだろう。
0387デフォルトの名無しさん
NGNGどっちが先でもいいと思う(むしろ言語をある程度触ってからのほうがよい気はする)が、まとまった時間の取れるときにコンピュータの基礎はやっておいた方がよい気はする。
基礎と言っても電磁気学レベルまで降りる必要はないけど、CPUアーキテクチャマニュアルを読める程度にはなっておいたほうがよい希ガス
0388デフォルトの名無しさん
NGNG0389デフォルトの名無しさん
NGNG0390デフォルトの名無しさん
NGNGC言語の規格で0は無効なポインタとは決められているはず
NULLは常に0(あるいは0Lだったり(void*)0だったり)で1や-1はだめだったはず
0391デフォルトの名無しさん
NGNG逆にそれを教えないと根本的な理解は難しいと思う。
0392デフォルトの名無しさん
NGNGポインタは理解できると思うが。
0393デフォルトの名無しさん
NGNG無効なポインタを整数にキャストしたら0になるだけで、
ビット表現が0かどうかは保証してない。
0394デフォルトの名無しさん
NGNGビット表現が0でなくてもCのソースコード上では0であることが保証されている。
http://www.catnet.ne.jp/kouno/c_faq/c5.html#5
0395デフォルトの名無しさん
NGNG0396デフォルトの名無しさん
NGNG無効なポインタをキャストしたら0になるなんて、どうやって実現するのよ。
0397デフォルトの名無しさん
NGNG0398デフォルトの名無しさん
NGNGガッ
0399デフォルトの名無しさん
NGNGCの中の人ががんばる
0400デフォルトの名無しさん
NGNG本気で言ってるの?
0401デフォルトの名無しさん
NGNGhttp://www.catnet.ne.jp/kouno/c_faq/c5.html#17
0402デフォルトの名無しさん
NGNGレジスタ教えるのだって楽じゃないよ。CPUとは何であるから始めないと。
0403デフォルトの名無しさん
NGNGポインタを理解している人って組んでて自然にニーモニックがこんな感じになるのかな〜って出てきたりしない?
0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNGんなことバカに言われてもなぁー
0406デフォルトの名無しさん
NGNGバカな人の典型的なレスですね(笑)
とりあえず本を読んでくださいね。
0407デフォルトの名無しさん
NGNGどのような点で?
0408デフォルトの名無しさん
NGNG例え有効でも、違う型からポインタへのキャストは全部無効にしちゃえばいい
0409デフォルトの名無しさん
NGNG0410デフォルトの名無しさん
NGNG買って送ってくれ。
そしたら読んでみようかと考えないでもない。
0411デフォルトの名無しさん
NGNG0412デフォルトの名無しさん
NGNGメモリマップのようなものは思い浮かべるが、
ニーモニックは思い浮かべない。
0413デフォルトの名無しさん
NGNGアセンブラもわかるけど、CやらC++で組んでてニモニックが出てくることはない。
0414デフォルトの名無しさん
NGNG出てこさせなきゃ組めないような愚か者でもない。
0415デフォルトの名無しさん
NGNG0416デフォルトの名無しさん
NGNG激しく仕事遅そうだなw
0417デフォルトの名無しさん
NGNG片やWinなどでのシステム開発、片や組み込み関連の業種の人でしょ。
0418デフォルトの名無しさん
NGNG0419デフォルトの名無しさん
NGNG0420デフォルトの名無しさん
NGNGいまどきのOSは物理メモリなんぞは隠蔽してるから、枝葉の質問は遠回りになるだけだしな。
0421デフォルトの名無しさん
NGNG0422デフォルトの名無しさん
NGNGインタープリンタな人でつね。
0423デフォルトの名無しさん
NGNGできるだけシンプルかつポインタやメモリを理解するのに、
必要最小限のものを選んだ方が良い。
ということでアセンブラはCASLがいいよ。
基本情報技術者試験を受けておけばいい。
0424デフォルトの名無しさん
NGNG0426425
NGNG353じゃないです
0427デフォルトの名無しさん
NGNGつまり、MSXエミュレータでゲームを作れ、と。
0428デフォルトの名無しさん
NGNGそんなカリキュラムがあったらイイかも。
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNG{
asm("...");
...
}
カコイイ
0431デフォルトの名無しさん
NGNGうちの大学のカリキュラムはそんな感じです。
C言語は自分でやれとか言われますが...
0432デフォルトの名無しさん
NGNG俺はたまたま仕事上でその道を歩んだから幸運だった。
PICマイコンのセットなんかいいと思うよ。
Windowsでイジれちゃうし。
0433デフォルトの名無しさん
NGNG同じ処理をアセンブラとCで書いてみればすぐわかる希ガス
0434デフォルトの名無しさん
NGNG>PICマイコンのセットなんかいいと思うよ。
それは、およそ考えうる限りの中でも最悪の選択だと思うが・・・
試しに PIC 上のイメージで "ローカル変数" の概念を説明してみれ。
0435デフォルトの名無しさん
NGNG>432はポインタを学ぶには、アセンブラが良いと言ってるだけであって
他の事には、触れてないと思うのだが。
アセンブラでクラスがどのように配置されるのかとか俺にはさぱーり分からん。
ま、言語の向き不向きって事で
0436名無しさん@お腹いっぱい。
NGNG---------------------------------------------
void func(char *, char **);
main()
{
char *namber[] = {"one", "two", "three"};
char *string = "hoge";
printf("%s:%s\n", string, *number);
func(string, *number);
}
void func(char *string, char **namber)
{
printf("%s:%s\n",string, *number);
}
---------------------------------------------
上記をコンパイルするとfunc関数の第2パラメータのところで
エラーがでます。*numberのアスタリスクをはずして
func(string, number);
とすれば問題なくコンパイルが通り正しい実行結果も得られるのですが
なぜ*をつけては駄目なのでしょうか?printfの場合は逆につけないと
上手く動作しません・・・
0437デフォルトの名無しさん
NGNGデバッガーでnumberの値、*numberの値を見てから再度質問にこい。
0438デフォルトの名無しさん
NGNGダブルポインタがが分からないんじゃなくて
型と配列を理解していないだけでしょ
int配列で考えてみたら?
ダブルポインタは出てこんよ
0439デフォルトの名無しさん
NGNG俺:へー。
これで理解出来てしまったから俺にはうまい説明は出来ない。
0440デフォルトの名無しさん
NGNGそれだけで理解できたってのは適正があったんだな
って、普通この程度で理解出来て当たり前かも.....
漏れなんか、1時間先輩に説明してもらって分からず
コーヒーカップとコーヒーの説明でようやく理解したorz
0441デフォルトの名無しさん
NGNG0442デフォルトの名無しさん
NGNGいったい脳の中で何が起こってるんだろう。
この変化がすべての人間に共通の変化の仕方をするのであれば
ポインタ薬だかポインタ音楽を処方すると自動的に理解するようにはできないだろうか。
もし可能になれば学校なんていらなくなるね。
義務教育と新入社員研修全部で3日で終わるよ。
0443デフォルトの名無しさん
NGNG人口の多い中国人にすべて奪われて終わりです。
0444デフォルトの名無しさん
NGNG本一冊読んで、適当に練習すりゃ、使えるようになるでしょ?
俺はBorland C++のマニュアルの言語仕様を読んでC言語を習得したよ。
0445デフォルトの名無しさん
NGNG0446444
NGNG0447デフォルトの名無しさん
NGNG必要なのは*不適切な使い方*を教え禁止することだろ。
0448デフォルトの名無しさん
NGNG0449デフォルトの名無しさん
NGNGわからないところだけ聞く相手がいて、コードレビューすれば、教育としては十分でしょ。
つーか、常に新しいことを学び続けるのがプログラマなんだから、
人を育てる = 学ぶ時間を業務時間内に確保する
だけでよいと思うよ。
0450デフォルトの名無しさん
NGNG両手もの数って、、、
そもそもそんなに言語あるのか?
0451デフォルトの名無しさん
NGNG#1024とか言うなよ。
0452デフォルトの名無しさん
NGNG0453デフォルトの名無しさん
NGNG0454デフォルトの名無しさん
NGNG0455デフォルトの名無しさん
NGNG単純にJavaでサイト作ったとしても
Java・SQL・HTML・JavaScript・EL・JSTL
くらい使う
そこにVBとかPHPとかPerlみたいな使えて当たり前のものとか、C/C++/Delphiとか含めれば、軽く10は越える。
0456デフォルトの名無しさん
NGNG重複分やプログラミング言語じゃねだろうっての外しても両手両足は越えるな。
組み込みマクロなんかも数に入れるか?
0457デフォルトの名無しさん
NGNGオレが使えるアセンブラでも6個か・・・。
0458デフォルトの名無しさん
NGNG0459デフォルトの名無しさん
NGNG言語を混在して用いるのはその相で最適なものを用いるからだが
ほんというと相/層ごとに開発単位を分けたほうが
開発効率は上がるしバグも少なくなるんだよね
外設にひっぱられた縦割開発のところが多いけど
そうすると個々の開発者に万能を要求するわけだが
実際にはそうではないから(とくに新人は)個々の弱いところに
バグが出てシステムにむらができる
ソースコードひとつとっても全然違う構造になったりする
0460デフォルトの名無しさん
NGNG規模にもよるし、プロセスの問題は、ある組織で開発効率や品質があがったからといって、それがほかの組織にも適用できるとは限らないし、ここではそういう話をしてるわけじゃない。
0461デフォルトの名無しさん
NGNGぬるぽっぽ♪
0462デフォルトの名無しさん
NGNGガッガッガッ
ガガガッガッ
0463デフォルトの名無しさん
NGNGおよそポインタ。
0464デフォルトの名無しさん
NGNGほとんどそうじゃない?
動けばいいし。
0465デフォルトの名無しさん
NGNG0466デフォルトの名無しさん
NGNG関係ないじゃん。
0467デフォルトの名無しさん
NGNG0468デフォルトの名無しさん
NGNG0469デフォルトの名無しさん
NGNG0470デフォルトの名無しさん
NGNG0471デフォルトの名無しさん
NGNG>>465 がんがんネスト汁!
>>467 実際にサラリーマンを巡回汁!
>>468 右足からの方が折れ好みだ!
>>469 あえてカセットテープに汁!
0472デフォルトの名無しさん
NGNG0473デフォルトの名無しさん
NGNGいまはクラナドと買うのがいいよ
0474デフォルトの名無しさん
NGNGポインタ理解してても?
0475デフォルトの名無しさん
NGNGそう。ポインタ理解してても。
0476デフォルトの名無しさん
NGNGおっけー。
このスレの300あたりからずっと悩んでたんだけど、解決した。
0477デフォルトの名無しさん
NGNGそれはおまえだけだ。オレは理解してるよ。およそポインタ。
0478デフォルトの名無しさん
NGNGそういうオマエは、風呂に入るとき右足から?左足から?
悩まない?
0479デフォルトの名無しさん
NGNG俺は頭から入るね。
0480デフォルトの名無しさん
NGNGああ、俺も。さすがポインタ理解してる奴は話せるな。
0481デフォルトの名無しさん
NGNGポインタ理解してないので、ついていけない・・・
0482デフォルトの名無しさん
NGNGポインタ理解していても、ついていきたくない・・・
ところでさ、
int *p;
ってした場合、「int」型の変数「*p」っても読めるんだよな
じゃなんで C の開発者は
int *p = &a;
なんて初期化式を考えたんだろか?
0483デフォルトの名無しさん
NGNG読めるけど、実際はそうではないから。
「int」型を扱える「*p」とは読んでいいだろうけど。
0484デフォルトの名無しさん
NGNGJavaのオブジェクトは標準でポインタで扱ってるよなぁ、
C++使ってる俺には、標準でポインタにする意味がわからん。
標準でvirtualだからかも知れんが。
0485デフォルトの名無しさん
NGNG標準で実体を扱う意味の方がもっとわからん。
0486デフォルトの名無しさん
NGNG0487デフォルトの名無しさん
NGNG>標準で実体を扱う意味の方がもっとわからん。
返り値(無論関数の)にしたとき
>>486と同じ理由があるので面倒。
0488デフォルトの名無しさん
NGNGその場合、ヒープにとるより高速だったり?
0489デフォルトの名無しさん
NGNGちなみに、インテル系CPUの・・・。
BCCだからインラインアセンブラ使えないポ。
0490デフォルトの名無しさん
NGNG0491デフォルトの名無しさん
NGNG汎用レジスタには番地がないからポインタではない。
しかし、擬似レジスタ変数で読み書きできるよ。_EAXとか。
0492デフォルトの名無しさん
NGNGTenx!!
>>490
>>491
メモリマップド対応のレジスタはインテル系では無いんですか?
参考までに・・・。
0493デフォルトの名無しさん
NGNGそれって単に汎用レジスタが無いCPU?
0494デフォルトの名無しさん
NGNG0496デフォルトの名無しさん
NGNGTMS9900でぐぐれ
0497デフォルトの名無しさん
NGNG0498デフォルトの名無しさん
NGNG0499デフォルトの名無しさん
NGNGint a[1][1];
int *b;
a = "hoge";
b=a[1];
printf("%s",b[0]);
とすると
hoge
0500デフォルトの名無しさん
NGNGint a = 123;
とかと構文を統一したかったから。
0501デフォルトの名無しさん
NGNGエラーだろ
0502デフォルトの名無しさん
NGNGポインタ以外→値を格納する変数
どう使うかは、使う側の問題。
実体指してない(有効なアドレスを設定していない(ポインタの)変数)状態で、
使わなければ桶
それだけ。
所詮変数でしかない。
0503デフォルトの名無しさん
NGNGポインタ変数→値を格納する変数
ポインタ以外の変数→値を格納する変数
0504デフォルトの名無しさん
NGNG誰か通訳してくださると大変便利
0505デフォルトの名無しさん
NGNGポインタ変数:ポインタの値を格納する変数
0506デフォルトの名無しさん
NGNGポインタが変数でしかないかどうかは実装によるよな
ポインタはその言語でのポインタの定義を満たす「なにか」であればいいだけで
アドレス値を実態とする32(or64or16or8)bit変数である必要もない
ヌルポインタの実態が0でなくてもよいのといっしょで
0507デフォルトの名無しさん
NGNG0508デフォルトの名無しさん
NGNGC/C++以外で、ポインタがある言語教えてください。
0509デフォルトの名無しさん
NGNG0510デフォルトの名無しさん
NGNG0511デフォルトの名無しさん
NGNG0512デフォルトの名無しさん
NGNGつまり、知らない、と。
0513デフォルトの名無しさん
NGNG表記の違い
逆参照演算子 *p が p^ になったりとか
0514デフォルトの名無しさん
NGNGActiveBasic
VisualBasicもないとは言えない
0515デフォルトの名無しさん
NGNG機能的には違いないのかな?足し算引き算できるかどうかとか。
int *a;
があるとして、a[n]というのが*(a + n)と等価になるか、とか。
0516デフォルトの名無しさん
NGNGJavaの参照みたいな、「ポインタと同じような役割の、違う名前のしくみ」は除くよ。
0517デフォルトの名無しさん
NGNGVBには密かに変数/文字列変数/オブジェクト変数のアドレスを取得するVarPtr/StrPtr/ObjPtrって関数と、
関数のアドレスを取得するAddressOf演算子がある。逆参照演算子/関数はないけど。
ABはもっとしっかりしていてポインタ型として〜Ptrが存在し、VarPtr/StrPtrでアドレスを得られる。
Get〜系の関数で値を読み込めて、Set〜系の関数で値を書き込める。(〜には型名が当てはめる)
あるいは配列添え字の[]も使えるし、構造体ポインタなら->が使える。
(ただし、あいかわらず関数ポインタから関数を呼び出すことはできない)
0518デフォルトの名無しさん
NGNGVBのは、アドレスが取得できるというだけで、ポインタがあるとはいえないね。
0519デフォルトの名無しさん
NGNG関数ポインタは条件さえ良ければEnum〜系列挙関数やCreateProcessなんかに渡してWindowsが呼び出させることができる。
0520デフォルトの名無しさん
NGNG日本語勉強してください。
0521デフォルトの名無しさん
NGNG0522デフォルトの名無しさん
05/01/25 22:30:300523デフォルトの名無しさん
NGNG0524デフォルトの名無しさん
05/02/01 20:43:090525デフォルトの名無しさん
05/02/01 20:57:44教えてわかる
むつかしさ
〜芭蕉〜
う〜ん、スレタイにもっとセンスを求む。
0526デフォルトの名無しさん
05/02/01 21:07:57C++と機能としては殆ど変わらなくなったと聞いたがマジっか?
0527デフォルトの名無しさん
05/02/02 06:17:58・二つのポインタを受け取り、一つのポインタを返す関数へのポインタの配列の宣言を書け。
・次に前述の関数で、受け取る二つのポインタと返すポインタを、
先の関数へのポインタとして受け取る宣言を書け。
(つまり、関数自身が受け渡されたり返されたりする、関数へのポインタの配列)
・さらに、対象とする関数をクラス内のメンバ関数(プライベート)とし、
この関数へのポインタの配列の宣言の例(クラス内メンバ)を示せ。
これが出来ない奴はポインタがわかっていない奴。
(typedef,defineは使用禁止、無駄なスペースやカッコを入れてもいけない)
0528デフォルトの名無しさん
05/02/02 10:05:39char *(*(*func[]))(char *(*(*func1[]))(char *, char *), char *(*(*func2[]))(char *, char *));
char *(*Klass::memb(*(*[]))[])(char *(*(*func1[]))(char *, char *), char *(*(*func2[]))(char *, char *));
0529デフォルトの名無しさん
05/02/02 16:26:58それだと、返り値が関数へのポインタになってないのでは?
0530デフォルトの名無しさん
05/02/02 19:22:310531デフォルトの名無しさん
05/02/02 21:02:04まあ無理だな
0532デフォルトの名無しさん
05/02/02 23:12:44よっぽど気になる。 わたしだけ?
0533デフォルトの名無しさん
05/02/03 00:19:51>>527の意図がまったく理解できない。
> ・次に前述の関数で、受け取る二つのポインタと返すポインタを、
> 先の関数へのポインタとして受け取る宣言を書け。
> (つまり、関数自身が受け渡されたり返されたりする、関数へのポインタの配列)
前述の関数(二つのポインタを受け取り、一つのポインタを返す関数)における「受け取る二つのポインタと返すポインタ」
を、
「先の関数(「前述の関数」と同じ?)へのポインタ」として受け取る
宣言を書け。
?????「先の関数へのポインタとして受け取る」?「前述の関数で受け取る二つのポインタと返すポインタ」を?
つまり、
関数自身が受け渡されたり返されたりする関数
へのポインタ
の配列
「つまり」????ということは前半と後半の記述は「同じことを説明している」わけか????
俺の脳内パーサが異常な量のエラーを吐いて落ちたので続行不能。
0534デフォルトの名無しさん
05/02/03 00:23:46マシン語ハードコーディング以降の高級言語を使う人でもヒントになることは多いと思うのですが...
0535533
05/02/03 00:36:06つまり、
「引数を二つ取り、値を返す関数を定義せよ。引数と返値の型は、先の関数へのポインタとする」
と言いたかったのか。
>>527はまず日本語を理解しろ。頭がもげるかと思った。
0536デフォルトの名無しさん
05/02/03 00:57:10関数A :
戻り値 : char*
引数 : char*, char*
関数B :
戻り値 : 関数Aと同タイプの関数へのポインタ
引数 : 関数Aと同タイプの関数へのポインタ
問題 1)
関数Aと同じタイプの関数へのポインタの配列を宣言(要素数N)。
問題 2)
関数Bと同じタイプの関数へのポインタの配列を宣言(要素数N)。
問題 3)
> さらに、対象とする関数をクラス内のメンバ関数(プライベート)とし、
「対象とする関数」が関数Aなのか関数Bなのか分かりません。
0537デフォルトの名無しさん
05/02/03 02:14:28typedef禁止が条件だから問題(2)と(3)は「文法的に記述出来ない」が正解だな
0538デフォルトの名無しさん
05/02/03 14:56:000539デフォルトの名無しさん
05/02/03 15:21:06こんなか?
#include <stdio.h>
char* funcA_1(char *str1, char *str2 ) {
return str1;
}
char* funcA_2(char *str1, char *str2 ) {
return str2;
}
char* (*( funcB_1( char*(*funcIn)(char*,char*) ) ))(char*,char*) {
if ( funcIn == funcA_1 ) return funcA_2;
else return funcIn;
}
char* (*( funcB_2( char*(*funcIn)(char*,char*) ) ))(char*,char*) {
return funcIn;
}
int main() {
char*(*arrayA[])(char*,char*) = { funcA_1, funcA_2 };
char*(*(*arrayB[])(char*(*)(char*,char*)))(char*,char*) = { funcB_1, funcB_2 };
printf( "%s\n", arrayA[0]("test", "string") );
printf( "%s\n", arrayA[1]("test", "string") );
printf( "%s\n", arrayB[0](funcA_2)("test", "string") );
printf( "%s\n", arrayB[1](funcA_2)("test", "string") );
return 0;
}
0541デフォルトの名無しさん
05/02/05 02:15:160542デフォルトの名無しさん
05/02/05 02:24:24やっぱCは永遠なのか?
0544デフォルトの名無しさん
05/02/05 03:52:240545デフォルトの名無しさん
05/02/05 04:42:550546デフォルトの名無しさん
05/02/05 17:53:140547デフォルトの名無しさん
05/02/05 18:11:210548デフォルトの名無しさん
05/02/05 19:24:54char *s = ""
の違い教えるのにめちゃ苦労したぞ。
0549デフォルトの名無しさん
05/02/05 19:32:31どのようにコンパイルされるか見せれば簡単ジャン
0550最凶VB厨房
05/02/06 15:05:13配列(まんま値)の先頭アドレスが入ったポインタ
って違いでええのか?
0551デフォルトの名無しさん
05/02/09 14:03:26初期化される奴とそのまま使われる奴
下は文字列を変更しちゃいけないことになってる
0552デフォルトの名無しさん
05/03/09 09:42:41下の形式って個別のメモリに書き込もうとしたらアクセス違反が出るんだけど、
char s[1]型としての変数に""を代入したってもんと、""つー文字列が入ったアドレスが入ったポインタとの違いでOK?
char *number[] = {"one", "two", "three"};
このような形のnumberを使って個別のcharを書き換えるには(number[0][1]='p'とか)以下のようにしないと無理?
char num1[] = "one", num2[]="two", num3[]="three";
char *number[] = {num1, num2, num3};
それともうまく宣言する方法があったりするんでしょうか。
0553551
05/03/14 15:00:07一行にまとめたければこうするとか
char number[][8] = {"one", "two", "three"};
8 は、中に入る文字列の長さの最大値よりも大きくすべし
でも、これだとかなりの領域が無駄になるので注意
0554デフォルトの名無しさん
2005/05/08(日) 11:53:15>このような形のnumberを使って個別のcharを書き換えるには(number[0][1]='p'とか)以下のようにしないと無理?
定義先の、"one" が置かれて居るのが定数領域に置かれているから
書き換えは出来ないんじゃなかったけな?
0555デフォルトの名無しさん
2005/05/08(日) 11:59:53>char *s = ""
上のは、sって配列はメモリ上のRAM領域(OSが管理している)に取られる。
s[0]はRAM領域に確保されてるから書き換えは可能。
下のは、""がROM領域に置かれている。
で、sは、その""のアドレスが入っている。
そのアドレスは、ROM領域だからs[0]='p'みたいに書き換えは出来ない。
0556デフォルトの名無しさん
2005/05/08(日) 12:05:29そうでないとオーバフロでバグの元になりかね
0557デフォルトの名無しさん
2005/05/08(日) 12:46:57概念と用語がきちんと整理できていないことにあると思う。
「ポインタ」という言葉一つとっても、曖昧に使われていて
はっきりとした定義がない。
そのために初学者は不要の混乱をする。こんなもの本来中学生でも理解できる程度の
ものでしかないのに。
だいたいK&R程度の内容の本がありがたがられる学問っていったいなんだよ。
0558デフォルトの名無しさん
2005/05/08(日) 13:57:06いいこといったな
おまえ、Wiki立てろ。
ウィキペディアみたいに用語を定義していこうぜ。
0559デフォルトの名無しさん
2005/05/08(日) 14:00:500560デフォルトの名無しさん
2005/05/08(日) 14:10:59変わらないのは、前提じゃないが
長さが変わる可能性があるなら
配列の長さは、多めに確保しないといけない。
もしくは、本当の意味での可変文字列を扱うなら
mallocを使うかってバッファを超えそうになれば、
再取得するか。
0561デフォルトの名無しさん
2005/05/08(日) 14:42:52上級者が行き詰ったときにも読む
0562デフォルトの名無しさん
2005/05/08(日) 14:43:55悩んだりしたときに素数を数えるような気持ちで読む
0563デフォルトの名無しさん
2005/05/08(日) 17:42:250564デフォルトの名無しさん
2005/05/08(日) 18:50:13ポインタのポインタ?
int a=3;
int *p=&a;
int **pp=*&p;
は一緒?コンパイルエラー??
(int *)p=&a;と
int *p=&a;は一緒?
(int *)* pp;とint **pp;は一緒?
迷子
0565デフォルトの名無しさん
2005/05/08(日) 19:04:44悩む前にコンパイラに通せよ
0566デフォルトの名無しさん
2005/05/08(日) 22:30:35int **pp = &p;だ。
int *はint型へのポインタ。
int **はint *型へのポインタ。
int *型の変数も「変数」なんだからアドレスが存在する。
アドレスが存在する以上それを格納するポインタ型も存在する。それがint **になる。
さらにtypedef使ってこうも書ける。
HOGE a;
HOGE *p = &a;
もしtypedef int HOGE;でもtypedef int *HOGE;でもこのコード片はコンパイルできる。
(実際にはaを初期化していないのがまずいけど)
0567デフォルトの名無しさん
2005/06/30(木) 21:18:560568デフォルトの名無しさん
2005/06/30(木) 21:27:280569デフォルトの名無しさん
2005/10/01(土) 02:18:12但し、ただのアドレスと違うところは
インクリメントやディクリメントに対して
変数のサイズ分ずつ増減するところ。
これで充分なのでは?
■ このスレッドは過去ログ倉庫に格納されています