ポインタの説明をしてみて初めて解かる難しさ
■ このスレッドは過去ログ倉庫に格納されています
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。
■ このスレッドは過去ログ倉庫に格納されています