ポインタ地獄
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
NGNG0002名無しさんダーバード
NGNG00031
NGNGつまり「示す」という意味でしょうか?
0004名無しさん@お腹いっぱい。
NGNGギコ猫のプログラミング相談室に聞けと言うことです
0005名無しさん@お腹いっぱい。
NGNG0006名無しさん@お腹いっぱい。
NGNG0007名無しさん@お腹いっぱい。
NGNGそのアドレス情報をもつ変数がポインタです。
0008名無しさん@お腹いっぱい。
NGNG住所は他の箱の場所を指していたり、1つの箱の場所を覚えておいて、
そこから何番目までを記録に使ったりする。
言うのは簡単だけど概念的に理解できないと面倒なだよなあー。
0009名無しさん@お腹いっぱい。
NGNG初心者の内は理解しようと必死になるより馴れることに重点置いた方が良いんじゃない?
0010名無しさん@お腹いっぱい。
NGNG0011初心者さん@ポインタいっぱい。
NGNG0012名無しさん@お腹いっぱい。
NGNG0013名無しさん@お腹いっぱい。
NGNGただあのCの宣言の文法は腐ってると思う。
ちょっと半年くらい別の言語やってたりするとすぐわかんなくなる。
0014名無しさん@お腹いっぱい。
NGNG0015名無しさん@お腹いっぱい。
NGNG0016名無しさん@お腹いっぱい。
NGNGそのポインタ変数がまた別のポインタ変数を…
とかなってると、頭パンクしそうになるかもですねぇ。
自分、高校の授業で、8085のワンボードマイコンで
ハンドアセンブルとかやってて良かったですわ。
アレがあったから、コンピュータってどうやって動いてるのか
わかったような気がする。
そういう低レベルなところを理解できてれば、
ポインタうんぬんがわかんない、なんて事にはならないですな。
0017名無しさん@お腹いっぱい。
NGNG終了
0018名無しさん@お腹いっぱい。
NGNGポインタの何がわかってないんだかもわかってないようだ‥
人にきくなら、できるだけ具体的に
せめて簡単な事例を用意してきくように。
0019名無しさん@お腹いっぱい。
NGNGしかしどんな書き方だったらわかりやすいのかな?
0020名無しさん@お腹いっぱい。
NGNGこれだ!
0021名無しさん@お腹いっぱい。
NGNGうちは思わない。
0022優しい名無しさん
NGNGじゃなくて
int* a;
ならわかりやすくないかい?
0023厨房@C/C++暦○年
NGNG「A2」の様に、他のセルを参照しているセルはポインタ変数。
…では駄目ですか?
あくまで「例え」なんで間違ってる部分もあるとおもいますが。
0024名無しさん@お腹いっぱい。
NGNGint* a,b;
と書いちゃう人が増えるんだな。期待しているのは
int *a, *b;
なのに。
0025名無しさん@お腹いっぱい。
NGNG0026優しい名無しさん
NGNG頭の中で変数の実体とポインターがごっちゃになってる。
で気分次第で意味解釈が変わってきてた。
あと、ポインター宣言したら実体も同時にできていると思ってたり…。
だけど、がんぱってWinのアプリ一本作ってみたら、
なぜこれがわからなかったのかがわからなくなってた。
結局、文法書で終わってるとこがダメなんだよ。
文法はコンパイラと対話しながら学びなさい。
0027名無しさん@お腹いっぱい。
NGNG0028優しい名無しさん
NGNGそうですね。
いっぺん、Z80でもCASLでもいいから
文字列テーブルでも作ってプログラムの中で参照してみるといいかも。
0029名無しさん@お腹いっぱい。
NGNG0030名無しさん@お腹いっぱい。
NGNG0031名無しさん@お腹いっぱい。
NGNG0032名無しさん@お腹いっぱい。
NGNG値呼び出しが破綻しただけなら参照呼出しをちゃんとサポートすればよかったんだよ。
0033名無しさん@お腹いっぱい。
NGNGchar* const p;
はやはり
char *const p;
とかくのか?
0034名無しさん@お腹いっぱい。
NGNGがふつーだと思う。
0035名無しさん@お腹いっぱい。
NGNG0036名無しさん@お腹いっぱい。
NGNG0037名無しさん@お腹いっぱい。
NGNG意味的には
char (* (const p));
なんだから、char と * をくっつける強い必然性はない。
まぁ、const と p をくっつけるわけにはいかないから
char *const p;
または 34 さんのように
char * const p;
だろうな。
この場合も、
char a;
char*const p = &a, q;
とした場合など q の型が直感的には認識しづらい。
0038名無しさん@お腹いっぱい。
NGNG0039名無しさん@お腹いっぱい。
NGNGは?
0040名無しさん@お腹いっぱい。
NGNGconst char* const p;
とおっしゃりたいところでしょう(笑)。
つーか、やっぱこの*の位置キライなんだが。
C++がデフォになると(もうほとんどなってるが)
こっちが標準になっちゃうからなあ。
うー、どうしよう。うにゃにゃにゃにゃ。
0041名無しさん@お腹いっぱい。
NGNGメモリを動的に確保・廃棄したいから、であってますか?
0042名無しさん@お腹いっぱい。
NGNG0043>38
NGNG0044名無しさん@お腹いっぱい。
NGNGchar *p, *q;みたいに一行に何個も書くこと自体廃れてきた
ような気がする。それでいいと思う。
0045名無しさん@お腹いっぱい。
NGNGまーCの演算子解決順ってなんでもう少しわかり安くしてくれなかったんだろ。
いまだに*p++とか書くとき一瞬迷いが走るのは修行が足りない?
0046>Stroustrup先生
NGNGchar const * const * const * const p;
0047>46
NGNG004846
NGNGやなこった。
0049名無しさん@お腹いっぱい。
NGNGchar const* const* const* const p;
だろな。
>48
これは同感。ポインタをtypedefすると何か使いにくい。
0050名無しさん@お腹いっぱい。
NGNGがいいな。
0051どーでもいーことだが
NGNGでないの?
0052名無しさん@お腹いっぱい。
NGNG0053名無しさん@お腹いっぱい。
NGNGあとはキャストして使ってくれ。
0054名無しさん@お腹いっぱい。
NGNGchar ********************************************************pp = (char ********************************************************) p;
0055名無しさん@お腹いっぱい。
NGNG0056名無しさん@お腹いっぱい。
NGNG世界人類がこんな関数を作りませんように。
0057名無しさん@LV2
NGNGを始めて書いたときはめっさうけた^^
0058名無しさん@お腹いっぱい。
NGNGホンモノの地獄をみせてくれっ!!
0059名無しさん@お腹いっぱい。
NGNG* * *
* * *
***
* * *
* * *
*
よく見ると雪印っぽくて地獄。
0060名無しさん@お腹いっぱい。
NGNG多次元配列のポインタ教えて。
0061名無しさん@お腹いっぱい。
NGNG54にすでに40次元ぐらいのがあるだろ。
0062>60
NGNG006362
NGNG配列を構造体に入れてからtypedefしてポインタにすれば判りやすいよ
0064名無しさん@お腹いっぱい。
NGNG0065名無しさん@お腹いっぱい。
NGNGvoid (*signal(int, void (*)(int)))(int);
そんでもって、Cプログラマのまあ多分6割以上はこれを読めないというのが、
日本の悲しい現状。
0066名無しさん@お腹いっぱい。
NGNG0067>65
NGNGPASCALとかではどうかくの?
0068>67
NGNGchar *p;は var p:^Byte; です。
じゃ同じじゃないかと思われるでしょうが、参照渡しが使えるのと
absoluteで別名参照が出来るのと、そもそもクラスが参照なので
C程ポインタにお世話になるチャンスは少ないですね
0069>67
NGNG0070ぴか虫
NGNG/)_/) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(,’ー’) < 適当に探してみたぞ。http://home1.infonia.ne.jp/~delphian/delphi/compo/graphmul.html#GM0047☆
_( U U) \____________________
0071名無しさん@お腹いっぱい。
NGNG0072名無しさん@お腹いっぱい。
NGNG0073名無しさん@お腹いっぱい。
NGNG確か、
main() {
goto togo; gototo: goto gogo; togo: goto gototo; gogo:
}
こんな感じのがあったような。
0074名無しさん@お腹いっぱい。
NGNG用件を聞こうか。
0075名無しさん@お腹いっぱい。
NGNG傍観してるのは面白いけど。
0076名無しさんi486
NGNG2chがコンタクトポイントだったのか
0077名無しさん@お腹いっぱい。
NGNG0078名無しさん@お腹いっぱい。
NGNGそれは Pascal というか Delphi の話だね。
0079名無しさん@お腹いっぱい。
NGNGmain()
{
int = 1;
loop:
printf("%d\n", i);
i = i + 1;
if (i <= 10) goto loop;
return 0;
}
うあああ。昔のBASICみたいだ。
0080名無しさん@お腹いっぱい。
NGNG{
printf("%d\n", ******************************************x);
}
0081名無しさん@お腹いっぱい。
NGNGconst が付いてないので減点。
0082名無しさん@お腹いっぱい。
NGNG0083名無しさん@お腹いっぱい。
NGNG0084名無しさん@お腹いっぱい。
NGNG0085名無しさん@お腹いっぱい
NGNG話しがずれてるような?
0086名無しさん@お腹いっぱい。
NGNG0087名無しさん@お腹いっぱい。
NGNGvoid (*signal(int, void (*)(int)))(int);
とかは、
typedef void TVIFunc(int);
typedef TVIFunc *TVIFuncPtr;
TVIFuncPrt signal(int, TVIFuncPtr);
とかみたいにtypedefしてくれるとわかりやすいと思う。
0089名無しさん@お腹いっぱい。
NGNGんで、おまえもできないんだろ(藁
0090名無しさん@お腹いっぱい。
NGNG一番最後の(int)っていうのは、
void (* 〜 )(int)
こうみるのね。
つまり、signalという関数の戻り値が
「「引数int 戻り値void の関数」へのポインタ」というわけです。
0091学生
NGNGでもせっかく気付いてもらったのに・・・ 分からんです。
今はもう一度みっちり勉強してまふ。
0092名無しさん@お腹いっぱい。
NGNGvoid ( *signal )( int )
でこれが
void ( *signal(int, void(*)(int)) )( int )
こうなると解りません
signalのあとから始まるかっこはどういう意味なんですか?
すみませんだれか教えて下さい
_(._.)_ _(._.)_ _(._.)_ _(._.)_ _(._.)_ _(._.)_
0093ネスティング
NGNGその関数は(int, void(*)(int))型の引数をとる。
引数内のvoid(*)(int)は、関数へのポインタ型。
この引数内の関数はintの引数をひとつとり、voidを返す。
その関数の返り値は関数へのポインタ型。
この関数はintの引数をひとつとり、voidを返す。
0094名無しさん@お腹いっぱい。
NGNGsignalは、引数にintとvoid(*)(int)を持ち、void ( * )( int ) の関数ポインタを返す関数だよ。
わかんなかったら素直にtypedefしろよ。
typedef void ( *tproc)( int );
tproc signal(int, tproc);
これで済むだろが。だぁほ!
0095名無しさん@お腹いっぱい。
NGNGそのsignalのあとから始まるかっこは関数を意味します。
名前の前につく*はポインタ、名前の後につく()は関数を意味するんだ。
このかっこの中にあるのは関数の引数なんで、さいしょは分けて考える。
*より()の方が結合が強いことに気をつけて。
*hoge()
は、*と()の両方がくっついてるけども
()の方が結合が強いので、hogeは関数。
{{hogeは関数}ポインタを返す}
てな感じで考える。一方
(*fuga)()
は、*と名前をかっこでくくってるから*の方を先に評価して
{{fugaはポインタ}関数への}
てな感じで考える。
で、問題の
void(*signal(int,void(*)(int)))(int)
なのだけども、
(*signal())()
として考えて、名前に近いほう(内側)から考えよう。
{signalは関数}ポインタを返す}そのポインタは関数への}
こんなんでわかってもらえたかな?
もちろん、自分で書くときはtypedefを使ったほうがいいね。
ちなみに、93は間違い。おしいけど‥
009693
NGNG009792
NGNG皆様解りやすい説明ありがとうございました
0098ホントにわかってるのか?
NGNG0099名無しさん@お腹いっぱい。
NGNG0100名無しさん@お腹いっぱい。
NGNG010192
NGNGtypedef tproc signal(int, tproc);
signal *psignal;
signal *psignal[5];
0102名無しさん@お腹いっぱい。
NGNG0103名無しさん@お腹いっぱい。
NGNG0104名無しさん@お腹いっぱい。
NGNG膨大なデータとか、引き渡すの面倒だから住所だけ教えて。
そのアドレスデータを格納するのがポインタで、その参照先の
データを書き換えたり、その値を代入したりできる。
つまり馬鹿でかいデータAがあるとすると、
A = B = Cとか3つ作るんじゃなくて、
A、Aのアドレスを入れたポインタB、Aのアドレスを入れたポインタC、って
形にできて、メモリを節約できる。それだけだろ。基本は。
ポインタのポインタとかが初心者を混乱させてるけど、ただの住所録って思ってれば
問題ないよ。
データを入れた書類と、その書類の保管場所を書いたメモみたいなもの。
そのメモもどこかに保管した場合、その場所を記入してるのがポインタのポインタ。
こんな風に実生活でイメージすると混乱しないはず。
仮に何十個ポインタが重なっても、参照を繰り返してるだから。
0105名無しさん@お腹いっぱい。
NGNG関数と混同しやすい書式指定、ってのも混乱を生んだ一因だし。
けど、それ以前に。
ムダにわかりにくくしてるのは、教科書の説明なんだよな。
何やってんだか。
本来は、どっちかっつーと簡単な概念なのにな。ポインタなんて。
0106名無しさん@お腹いっぱい。
NGNG一発で理解できると思うんだが、どうか。
オートインクリメントがある今のCPUなら、
*p = 1;
p ++;
なんてのがどうなるかも判るしな。
0107ポインタ
NGNG0108デフォルトの名無しさん
NGNG簡単に理解できます。
例題として時々ポインタのポインタとかわけ分からないこと
教えるからこういうことが起きるんだよ。
0109デフォルトの名無しさん
NGNGint i
の中に入っている数値を文字列として扱うにはどうすればいいんですか?
0110名無しでGO!
NGNG0111デフォルトの名無しさん
NGNG> の中に入っている数値を文字列として扱うにはどうすればいいんですか?
すんごく情けない事がわからないんです。助けて下さい。
これってポインタと何か関係あるんですか?
0112デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNG○ ((char*)&i);
int*iと勘違いしておったぞな‥
0114109
NGNG例えば、
int a = 1;
char* b;
sprintf(b,"%.2d",a);
でばっちり、「01」という文字列を扱えるようになりました!!
ありがとうございます。
0115デフォルトの名無しさん
NGNGあ゛ーーーーーっ、それはちがーーーーう
せめて
int a = 1;
char b[10];
sprintf(b,"%.2d",a);
か
int a = 1;
char c[10];
char* b = c;
sprintf(b,"%.2d",a);
としてくれ
いまは*たまたま*動いているにすぎない
0116109
NGNGこれだから、ポインタってやつは…
でもなんとなくわかりましたよ。領域を確保してないから、ですね?
0117デフォルトの名無しさん
NGNGこのスレでやるってことは狙ってんだよな。。<109
0119777
NGNG間違ってわり算の時に「0で割る」ということがありますが、そのとき
にエラー処理が行われると思うのですが、いったいCPUでは何が
起こっているのでしょうか?ポインタとかも関係あるのでしょうか?
おおまかなことでもいいので、わかる方いましたらお願いします。
0120マジレスさん
NGNG危ないことするなよー
0121デフォルトの名無しさん
NGNG初心者がそんな疑問いきなり思いつくとは思えない。
また例によって宿題レポートマル投げ君かよ。
0122デフォルトの名無しさん
NGNG「ポインタは関係ない」
とだけ答えといてやろうΨ(`∀´)Ψ
0123デフォルトの名無しさん
NGNGDIV 0
なんてアホな命令が読み込まれたら例外を発生します。
(初期ペンタでは発生しない事もあり。)
0124デフォルトの名無しさん
NGNGポインタではてなー?ということがなくなった。俺ってバカ?
0125デフォルトの名無しさん
NGNG馬鹿だけど、わりと普通なので気にしなくて良い。
0126名無しさん@お腹いっぱい。
NGNG使用例があるので大体わかった(つもり)です。
で、void** っていうのがどーにもイメージがつかめません。どういう利用法が
あるのか、実例とか教えて欲しいのですが。
0127デフォルトの名無しさん
NGNG(void **)などは主に関数の引数に与えるポインタの参照位置を変更したい時などに使う。
実は、キャストすれば型はなんだっていい。(サイズさえ同じなら)
void intinc(void **p) {
((int *)*p)++;
もしくは
((int *)*p) = ((int *)*p) + 1;
}
void test() {
int *p;
intinc(&p); // p += sizeof(int)と同じ
}
0128デフォルトの名無しさん
NGNGchar *p;
でした
0129名無しさん@お腹いっぱい。
NGNGありがとうございます。よく読んでこれから (^^; 理解してみます・・
0130777
NGNGありがとうございました。
CPUは自分が処理出来ないときには、
「例外」を出すと考えていいんですね。
0131122
NGNGま、揚げ足とりだけど
0132デフォルトの名無しさん
NGNG俺の彼女、貧乳だし。
0133デフォルトの名無しさん
NGNGお馬鹿。オヤジギャク。30後半と見た。
0134デフォルトの名無しさん
NGNG0135デフォルトの名無しさん
NGNG量子メモリーの時代になったら、いったいどうなるんだろう?
0136デフォルトの名無しさん
NGNGフジテレビでやってたけどどうなるの?
「一般人には想像もつかない」
みたいなこといって教えてくれなかった。
0137デフォルトの名無しさん
NGNG人の脳をシュミレートすることも可能。超並列量子コンピュータという。
0138デフォルトの名無しさん
NGNG0139デフォルトの名無しさん
NGNG0140デフォルトの名無しさん
NGNGC 言語やってると実体に触れなくても、ポインタや、ポインタのポインタを、触れるだけで、満足になってくるなあ。
0141デフォルトの名無しさん
NGNGポインタの先は実体を指しているかどうかは気をつけていた方がいい
穴の空いたバケツに水を入れると自分の足をぬらす事になる
0142デフォルトの名無しさん
NGNGだんだんそれでもよくなってくるサ。
0143名無しさんi486
NGNG>>101 は
------------------
i>typedef void ( *tproc)( int );
ii>typedef tproc signal(int, tproc);
まず(i)で『"int型の引数を持つtproc型の関数へのポインタ"
をvoid型と同義であると宣言する』
これでtprocという形が(*void)(int)という形と同義である
と宣言されるのでしょうか?
次に(ii)で『signalはintと(*void)(int)の二つを引数に持つ
(*void)(int)という型の関数へのポインタと同義である』
ということで、関数signalと同じ構造を持つわけですね?
iii>signal *psignal;
iv>signal *psignal[5];
それでやっとsignal型のポインタが宣言できる。
という解釈で良いんでしょうか? どうかお教えください(__)
0144名無しでGO!
NGNGi) tproc=void (*)(int)
ii) signal=tproc (*)(int,tproc)
014565
NGNGっていうか、signal.h をインクルードしてたら、名前が衝突しない?
0146デフォルトの名無しさん
NGNGint (*a)[3] なんですか?
int[3]* a とか int[3] *a
とかなら理解できそうなんですが…
なんで(*a)なんですか?????
0147デフォルトの名無しさん
NGNG[]が最初に来るのも困るし、()を付けないと *(a[3]) だかなんだかわからないし。
0148名無しさんi486
NGNGありがとうございます。何となくわかったような気分にな
れました(^^;) ポインタって極めようとおもうと難しいです
ねぇ。
>146さん
*よりも[]のほうが演算子の優先度が高いからじゃないか
な? int *a[3] だと意味変わっちゃうし・・・
そっかぁint [3]* a とか int [3] *a なんて書き方もで
きるのですか・・・勉強になりました
0149SAGE
NGNG[3] … to an array(size 3)
int … of int
「 a は、[int型の、大きさ3の配列] へのポインタ 」
って感じに、優先順位の強いものから順に解釈していくとわかりやすいらしい。
0150デフォルトの名無しさん
NGNG日本語だと外側(優先順位の低いほう)からね。
0151デフォルトの名無しさん
NGNG例えばchar *c;は
c[1] = '\0';できますが
(char *)a[1] = '\0';とやるとエラーになってしまいます。
((char *)a)[1] = '\0';とやるとエラーになりませんが、
C的に見て正しい文法なのでしょうか?
識者の方、よろしくお願いします
0152さぁねぇ
NGNGじゃなくて
(char *)&a[1] = '\0';
ならいいのかなぁ。。
どっちにしろ
void *a;
char *b;
b = (char *)a;
ってやるな。おれなら。
0153デフォルトの名無しさん
NGNG>void *a;
>a[1];
の部分
void *
の配列ってなんだ?
サイズは?
0154151
NGNG> void *
> の配列ってなんだ?
void *a;をcharの配列のように扱いたいのです。
>>152さんのように
char *c = (char *)a;として
c[1] = '\0';としてもいいんですが余計な一時変数は使いたくないのです。
一応、((char *)a)[1] = '\0';としたらうまく動いてますが
これが*たまたま*うまく動いているようにみえるのか
それともCの文法上正しいかどうか知りたいのです。
よろしくお願いします。
0155152
NGNG((char *)a)[1]は正しいよ。
voidポインタaをchar型ポインタにキャストする。
そこからoffsetが1の領域に代入するって意味。
(char *)a[1] = '\0'; だと
void型配列のポインタaを基点としてoffsetが1の変数をcharポインタ型にキャストする
っていうわけの分からんことをやってる。
だいたいa[3]とかはいいのかなぁ。。
voidポインタの場合、基点しか使えない気がする。
どっちにしろおれはこんな使い方しないからこれ以上言うこともないし
調べようという興味もないな。。。
>余計な一時変数は使いたくないのです。
そのためにキャストだらけのコードになったら、普通の人は読みたくないと思うよ。
0156151
NGNG> ((char *)a)[1]は正しいよ。
ありがとうございます。
>だいたいa[3]とかはいいのかなぁ。。
駄目でした。void *a[];ならば正当なのでしょうけど...
>>余計な一時変数は使いたくないのです。
>そのためにキャストだらけのコードになったら、普通の人は読みたくないと思うよ。
そうですね。void *も本来ならあまり多用すべきでないんですけど、
局所的に封じこめてしまって、そこは汚くてもいいやと開き直ってます。
どうも、ありがとうございました。
0157デフォルトの名無しさん
NGNGint main( void )
{
int i=0;
unsigned char yyy[10] = {0,};
unsigned char* st = MemorySet( 10, '\0' );
unsigned char* hBuff = MemorySet( 10, '\0' );
unsigned char* pch = MemorySet( 10, '\0' );
yyy[0] = '\x03';
yyy[1] = '小文字のオ';
pch[0] = yyy[0];
pch[1] = yyy[1];
for( i=0; i<2; i++ ){
sprintf( (char*)hBuff, "%X", (char*)pch[i] );
//st="2B5" st[0]='3' st[1]='B5'//
}
return 0;
}
unsigned char* MemorySet(int nCapa, char nWor){
unsigned char* TempBuf = (unsigned char*)malloc(nCapa);
memset(TempBuf, nWor, nCapa);
return(TempBuf);
}
最後、コメントに書いてあるようにしたいんだけど、スマートなやり方教えて
0158デフォルトの名無しさん
NGNG0159デフォルトの名無しさん
NGNG0160デフォルトの名無しさん
NGNG0161デフォルトの名無しさん
NGNG//st="2B5" st[0]='3' st[1]='B5'//
って書いてるけど、st[0] = '2'の間違い?
あと、stは今のままではすべて'\0'で初期化されてるけど、
sprintf(st,...)の間違い?
0162デフォルトの名無しさん
NGNGst[1] == 'B'
st[2] == '5'
st[3] == '\0'
にしたいんだよね?
それと
yyy[0] = '\x03';
の'\x03'ってなに?
0163デフォルトの名無しさん
NGNG説明下手ですまんです。
yyy[0] = '\x03';
yyy[1] = '小文字のオ';
という、文字のアスキーコードの16進値がほしいんです。
それぞれのアスキーコードが
'\x03'…3
'小文字のオ'…B5
とsprintfの行で変換されて、変換するたびに
hBuffは更新されるんで、それを別のところに保存する
例えば
unsigned char last[10] = {0,};
見たいな配列に
last[0]=3,last[1]=B5
というようにしたいんです。
お願いします。
0164偽名無しさん
NGNG理解するのに時間かかったぞ。
main(){
char buf[10][10];
char ch[2];
ch[0]='0x03';
ch[1]='0xb5';
for(int i=0;i<2;i+)
sprintf(buf[i],"%X",(int)ch[i]);
}
0165偽名無しさん
NGNGch[1]='\xb5';
じゃん。打ち間違い。
0166デフォルトの名無しさん
NGNGちがうような気がする。こいつ(>163)何やりたいのかさっぱりわからん。。
だれか解読してくれ!
0167デフォルトの名無しさん
NGNGint main(void)
{
int i;
unsigned char yyy[10];
unsigned char hBuff[10];
yyy[0] = '\x03';
yyy[1] = '\x0B';
yyy[2] = '\x05';
yyy[3] = '\0';
printf("%d, %d, %d\n", yyy[0], yyy[1], yyy[2]);
hBuff[0] = yyy[0];
hBuff[1] = (yyy[1] << 4) + yyy[2];
printf("%X, %X\n", hBuff[0], hBuff[1]);
return 0;
}
これ?ってワケないよね。。
0168デフォルトの名無しさん
NGNGhBuff[1] = (yyy[1] << 4) + yyy[2];
これでやっていることをやりたいのです。
でも
sprintf( (char*)yyy, "%X", (char*)pch[i] );
で変換したとき
167さんの
yyy[1] = '\x0B';
yyy[2] = '\x05';
にあたる部分が
yyy[0] = 'B'
yyy[1] = '5'
になってるんです。
どうしたらいいでしょうか?
0169デフォルトの名無しさん
NGNGint main(void)
{
int i;
unsigned char yyy[10];
yyy[0] = '3';
yyy[1] = 'B';
yyy[2] = '5';
yyy[3] = '\0';
i = strtol(yyy, '\0', 16);
printf("%X, %X, %X\n", yyy[0], yyy[1], yyy[2]);
printf("%X", i);
return 0;
}
もしかしてお望みのものはこれ?
0170デフォルトの名無しさん
NGNG俺だったら
C言語の前に日本語やりなおして来いムキー!!
とかいってきれちゃうょ、、、
0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNG167さんの方法でいくことにしました。
0173デフォルトの名無しさん
NGNG前橋 和弥 著
C言語 ポインタ完全制覇
ISBN4-7741-1142-2
http://www2.gihyo.co.jp/books/bookinfo.asp?ID=971
0174デフォルトの名無しさん
NGNGアセンブリをちょっと勉強したら、いやそこまでしなくても
デバッガでプログラムの流れを追ったらわかるだろ、普通。
0176デフォルトの名無しさん
NGNGちょっと目次みてみたけど
>1・3 配列について
>1・3・5 ポインタ演算なんか使うのはやめてしまおう
ってとこにハゲシク同意
0177デフォルトの名無しさん
NGNGこれは何でしょう?
0178デフォルトの名無しさん
NGNGそんなもの存在しない
0179177
NGNGあぁっ、こう書くのが正解か。わけわかんねぇゴルァ!!(逆ギレ
0181デフォルトの名無しさん
NGNG片っ端からsizeofで大きさ調べるのが、結構ポインタ理解の助けになったナァ。
ポインタ配列のポインタとか、多次元配列のポインタ配列へのポインタとか
訳ワカメにナリゲなやつも、どんな型のポインタだろうがポインタ自体はアドレス値が
入った[同サイズの変数]ってのが分かれば、理解しやすいんでは。
とか昔をふりかえってミタリ。
0182デフォルトの名無しさん
NGNGもはや私に不可能はない。
0183>181
NGNG0184デフォルトの名無しさん
NGNGアセンブラは習得したが、OOPはいまだ習得できん
厨房なのはわかってるが、コーディング前に図を書いたりせにゃならん
のがしょうにあわない。
箇条書きで良いじゃんかよぉ〜
0185デフォルトの名無しさん
NGNG箇条書きですむような程度のものなら箇条書きですました方がじつは楽。
その程度ですまないようなもののために
オブジェクト指向は考え出されたようなもの。
0186デフォルトの名無しさん
NGNG突き詰めると図を書いたほうがいいんだけど、
図が性に合わないのであれば、
OOが軌道に乗るまでヘッダファイルを設計仕様にしたほうがいいよ。
つまりクラス定義が仕様書件設計図面。
構造化設計あがりの人は眉をひそめるかもしれないけれど、
オブジェクト指向というのはインターフェイスが非常に重要だから、
これでも大きな問題は出ないんだよ。
でもそのうち美しいインターフェイスを構築できないことが
度々発生して、なにかいい解決方法が無いかと探すことになるでしょう。
そのときになって初めてUMLやOMTで図を書くことの素晴らしさに気づくと思います。
0187デフォルトの名無しさん
NGNG今月から行くようになった職場、面接の時に「ポインタを理解できないと
かなり大変ですよ」と脅すから、4〜5段階なんて当然なんだろうなあと
思ってたら、1段階しか使ってねーの。爆笑。
しかも使わないでいいようなところで無理やり使ってるソースが大半。
面接官もよくわかってないというオチだったのかなぁ
0188デフォルトの名無しさん
NGNGそうやって舐めてる奴が領域確保せずにメモリにアクセスしたりして
再現頻度の低いバグを起こす。自重せいよ。
0189デフォルトの名無しさん
NGNGポインタをメンバとしてもったオブジェクトをコピーするとき、
浅いコピーなのか深いコピーなのかとか、
ポインタを返す関数をコールしたときにだれが解放するかとか、
ちゃんとポインタを理解してないと気付かずに
変なコーディングしちゃうのが一番怖いんだ。
0190デフォルトの名無しさん
NGNG186マンセー!
0191デフォルトの名無しさん
NGNG0192デフォルトの名無しさん
NGNG> 4〜5段階なんて当然なんだろうなあ
普通、1段か2段
それ以上の場合はtypedefで抽象化する
ポインタで難しいのはオブジェクトの管理
数箇所から参照されていたり、
循環参照しているオブジェクトとかの解体が厄介
0193デフォルトの名無しさん
NGNGってゆーか
4〜5段使うなんて、愚かすぎでは?
スクナクトモ ソンナソースニハ ゼッタイ サワリタク ナイ
0194デフォルトの名無しさん
NGNG世の中にはいろいろな考え方の人がいるのねぇ〜。勉強させていただいたわ。
でも、ぜひ一緒にはお仕事させていただきたくないわね。ほほほ。
0195デフォルトの名無しさん
NGNGとりあえず見やすいほうが命の為だよ。身のためでもある。
0196デフォルトの名無しさん
NGNGもっと根本的なところから考え直せよ
0197デフォルトの名無しさん
NGNGアセンブラでも学習してろや>ALL
0198ボインタ
NGNG0200デフォルトの名無しさん
NGNG関係ねーぞ。アホか?
0201デフォルトの名無しさん
NGNGポインター渡ししなくて グローバルで渡してるって言うんでしょ。
まあ、判って馬鹿にしてると思うけど、一応 >>199 が
勘違いすると嫌だから。
とりあえず、グローバル変数は基本的に使うな。
途中で増やすな。
しっかり頭の中で構築してくれ。
すまん、ちょっと鬱になるプログラム思い出しちまって....
0202199
NGNGフォローサンクス。>>200は多分判ってないと思う。
以前Cを勉強してきたという新卒に説明したとき、同じことをけろっとした
顔で逝ってたし。
どういう風に使うかの話をしているのに、
「グローバル変数とポインタは別物じゃないですかあ」と呆れるような
ことを言ってた。>>200は人間として勉強する点がまだまだ多いな。
0203デフォルトの名無しさん
NGNG0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNGいまだによく分らない。(もう1年使ってるのに)
ポインタを使ってた方が、ポインタと実体の区別がつきやすくて
コーディングしやすかったYO!
0206デフォルトの名無しさん
NGNGよーく分かったが、はっきし言って今の時代にはそぐわない。
今時プログラミング言語初心者に Basic を勧めるようなもんだ。
とおれは思った。
0207デフォルトの名無しさん
NGNGマンコ まんこ
ちんこ=&まんこ
0208デフォルトの名無しさん
NGNGなんでチンコ型でマンコ型を刺すのよ?
0209デフォルトの名無しさん
NGNG>Basic を勧めるようなもんだ
それっていいことなんじゃないの
文脈をよむと悪い例に使ってるようだけど・・・?
0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNGそのデータをどのように参照するのか…
その辺をイメージできるようになるのは重要かと。
この辺テキトーに済ますと立派なプログラマーにはなれませんよ?
0212206
NGNGいや、悪い例のつもりで言ったんだけど(^^;
MSX とかの頃 (若いからよく知らないけど) ならそれがベスト
だったと思うけど、大抵の優れた処理系がフリーで手に入る
今の時代に、Basic から入らせるってのは無理があると思って。
0213207
NGNGちんこががまんこのアドレスをさしてるんだよ。
0214デフォルトの名無しさん
NGNG憂鬱本の解説が白眉だが、
それってスコープの問題が残るなあ。
グローバル変数に「グローバルスコープ」そのものを
(名前どおりに)望むなら健全なんだけど、
実は望んでいるのが「長い寿命」のほうだったりして
スコープは広くなくてもいいのにな、という場合だと、
管理上おかしなことになることがよくあるよね
(別のプログラマに、スコープの広さは望んでいない、と伝わらないとか)、
という話>憂鬱本
Cだと気分的代用として(グローバルな)構造体のメンバに
押しこめることもある。が、釈然としない。
>>209
Basic、よくないと思う。
ポインタのことも考えると、初心者には
rubyとかのほうがまだしもマシじゃないかな。
抽象化されたポインタ(というか参照:C++は除外)を知る重要性と
具体的なアドレスを知る重要性とは、かなり別の概念と思われ。
0215デフォルトの名無しさん
NGNG0216209
NGNGプログラミングのABCとは
A アセンブラ
B ベーシック
C C
という持論があるので言ってみただけ。
BASICでポインタはまず使わないし、そういう概念がほしいと
思った時点で別の言語に目を向けるのもいいかな・・・と。
BASIC信者のたわごとなんで、あんまり気にしないでください
0217209
NGNGしまった!このスレはポインタのスレだった!
0218デフォルトの名無しさん
NGNGprimitive型が実体渡しなのに、キモイったらありゃしない。
ポインタ地獄はいつでもどこでも健在death!!!
0219デフォルトの名無しさん
NGNGJavaって実体わたしたいときどうすんの?
class tinpoko{
void tinko(int Thickness,int Length)
{
Thickness=10;
Length=30;
}
}
void main(){
int fff=200,ggg=3000;
tinpoko tnk;
tnk.tinko(fff,ggg);
}
これだとfff,gggはどうなるわけ?
0220219
NGNG0221デフォルトの名無しさん
NGNG>primitive型が実体渡しなのに、キモイったらありゃしない。
実体渡しというか、classじゃないのがキモイが、
Singletonだと考えれば参照渡しと考えてもいいんじゃない?
0222デフォルトの名無しさん
NGNGつくりっぱなしってすっごい不安じゃない?
0223デフォルトの名無しさん
NGNG0224デフォルトの名無しさん
NGNGfff, gggの型を Integer にすると
Javaの威力が分かる(藁
0225デフォルトの名無しさん
NGNG構造化アセンブラプリプロセッサ(R86用) RPP
http://www.vector.co.jp/soft/dos/prog/se022441.html
実用性云々の話じゃなくて、こんなものが存在しうると言うのが凄い。
Cがいかに低級言語の性質を色濃く残しているか、
C++もその性質をどれだけ引き継いでいるか、よく分かる。
0226デフォルトの名無しさん
NGNG自分でdeleteする方がすっごい不安ですよ。
特に大規模になればなるほど。
0227デフォルトの名無しさん
NGNGMASMは単体で既に構造化アセンブラだぞ
0228255
NGNGOK。サンクス。
0229225
NGNG最近は構造化だけじゃなくて、オブジェクティブと称している。
きわめて不完全ながらも、それ系の機能をある程度もっている。
>>228
高等なツッコミだねえ。高等すぎて228=225と間違われるぞ。
0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNGコンテナに置いておけば恐れることは無い。
工夫すれば直接deleteする機会はほとんどない。
0232デフォルトの名無しさん
NGNGてゆーか、ポインタって「初心者は後回しにすべき難しいもの」
なのかなあ?
たしかに俺もCの前はBASだったが、
ポインタの概念はサクっと抵抗無く脳に入ったなあ。
それはBASICに飽き飽きするまで馴染まない限り
得られないサクだったと考えるべきなんでしょうか?
それともBASなんか実は不要だったんでしょうか…
ポインタ=URL 説 まんせー
0233255
NGNG0234デフォルトの名無しさん
NGNGアホ発見
0235デフォルトの名無しさん
NGNGだよねえ。
ところで番号が未来なんですけど…
0236デフォルトの名無しさん
NGNGポインタでだけでなく、つまずくことはダメダメではありません。
むしろ当然です。
完全に理解できるまで、じっくり何回も本を読みましょう。
しかし悪い本では、じっくり何回もよむだけ時間の無駄。
いい本に出会ったらそれは幸運です。
0237デフォルトの名無しさん
NGNGすんなりわかったよ。
0238デフォルトの名無しさん
NGNGURLなんだよとかなんとか、説明を受けてぼんやりとわかるものの、
実際に使ったこと無いし使い道もわからんので、
なんとなく怖いから使わない、だからわからない状態になってると思われ。
ポインタじゃないとできないこと、
ポインタでできることの目がさめるようなサンプルがあれば
役に立つんじゃネーノとか思ってみる。
俺はオナーニで忙しいから誰か作って。
0239デフォルトの名無しさん
NGNG確かに「ポインタとは何か?」ていうのはなんとなく分るとして、「で、何の役に立つの?」ってとこでつまずく初心者は多い(自分はそうだった)。
0240デフォルトの名無しさん
NGNG>役に立つんじゃネーノとか思ってみる。
それ、オレ見たい。
0241デフォルトの名無しさん
NGNG(*p)++;
printf("i:%d *p:%d\n",i,*p);
↓
i:1 *p:1
眠くなってきた。
0242onamae
NGNGこの本によると
void ( *signal(int, void(*)(int)) )( int )
みたいな複雑なものは英語で解釈して
signal is a pointer to a function(int, a function(int)
returning void) which is returning a function(int) returning void.
って鬱だ。
0243onamae
NGNGごめんなさい
0244onamae
NGNG>a pointer to a function returning void
0245天才国津
NGNGまず、iが0なわけだ。
そしてint型のポインタ変数pがさすアドレスはiなわけだ。
そして*pは何をあらわすかというと実体だ。pはアドレスだ。
つまり(*P)を++ということは実体を1プラスする。
つまりiは1になる。
それをprintfしてやると当然i:1,*p:1になるわけだ。
感謝しろよ貴様ら。
0246デフォルトの名無しさん
NGNGで、なんかいいサンプルを見れば、ポインタの有用性が実感できると思います。
なんかないかのぉ
0247デフォルトの名無しさん
NGNG>void(*)
ってなに?(void*)では無くて?
0248onamae
NGNG>signal is a function to a pointer
うう、はずい
逝ってしまいます。
0249onamae
NGNGわかりません。
どっちでもいいようにおもわれ
0250デフォルトの名無しさん
NGNGK&R本の文字列コピー
あれを超えるサンプルはみたことない。
だんだんコードが短くなっていくさまは壮観だよ。感動できる。
0251名無し関数のλさん
NGNGvoid(*)(int) までで一塊で、
int を引数にとり戻り値がない関数へのポインタ
って意味。
void(*)(int) は関数へのポインタで、void * はデータへのポインタ
なんで、意味が全く違う。
C の型宣言は非常に読みにくいんだが、気合で慣れてくれ。どうして
も分からなくなったら typedef で書き直すと、少しはマシになる。
typedef void (*sig_t)(int);
sig_t signal(int, sig_t);
0252デフォルトの名無しさん
NGNGなんでカッコがいるのかとか、演算子の優先順位からやった方が良いと思われ。
0253コピペ
NGNGint a=40,b=5,c;
int *A,*B;
A=&a;
B=&b;
c=*A/*B;
0254天才国津(ガッシュ入ってます)
NGNGたんにc=a/bとすればよいのではないかバカモノ。
0255デフォルトの名無しさん
NGNGreturn a/b;
}
int (* calc(int (*f)(int, int)))(int, int){
return f;
}
calc(division)(10,2);
0256コピペ
NGNG0257デフォルトの名無しさん
NGNG↑
0258天才国津
NGNG0259デフォルトの名無しさん
NGNGわしは逆に「あ、そう」としか思えんかったなぁ。
struct data {
char *name;
char sex;
int height;
int weight;
struct data *next;
};
"struct data *next;" を見て「おぉ」と思った。
0260デフォルトの名無しさん
NGNG0261デフォルトの名無しさん
NGNGwindowsのDLL関数の引数の組み立てを動的に
行なう方法があったら教えてください。
名前と関数型が後で分かる場合とかに対応したいんです。
例えば、名前と、関数の型を文字列で与えると、その方式で呼ぶ様な感じを考えています。
dllcall("stdcall int f(int a, char *b)", a b);
0262デフォルトの名無しさん
NGNGC言語だけでも不可能ではないんじゃない?
当然、未定義な挙動を散々使うことにはなるけど。
まぁ、__fastcallと構造体の値渡しor値返しな関数の
呼び出しはアセンブラ使わないと無理じゃないかな?
具体的なやり方だけど、プロトタイプを解析しつつ<stdarg.h>の
マクロで引数を取得して行き、サイズがわかった時点で_allocaで
スタックにメモリを確保する。で、そこにさっき計ったサイズ分だ
け自分の引数の先頭のアドレスからコピーして、戻り値の型で分岐
して、(戻り値の型 (*)(void))でキャストして関数を呼ぶ。
__cdeclでも__stdcallでもちゃんと呼べるはず。スタックのずれも
自動的に修正されます。これはスタックフレームをEBPを使って構築
しているから。ESPが引数のサイズ分ずれようが、EBPから位置を得
られるんで問題ないというわけ。
呼び出し側のプロトタイプは次のような感じでしょう。
void __cdecl dllcall(const char *prototype,
void (*proc)(), void *result, ...);
素直にアセンブラ使ったほうが安全な気もするけどね(笑
0263261
NGNGありがとうございます。
とりあえずコンパイラの出力コードを真似てみます。
0264デフォルトの名無しさん
NGNG0265デフォルトの名無しさん
NGNG0266デフォルトの名無しさん
NGNG0267デフォルトの名無しさん
NGNG↑
こんなの書いても注釈行と扱うコンパイラがあるのね。
0268デフォルトの名無しさん
NGNGchar *name;
char sex;
int height;
int weight;
struct data *next;
};
ってうちのコンパイラ(グリーンヒルズ)じゃ通りません、なぜ?
0269天才国津
NGNG0270デフォルトの名無しさん
NGNGstruct data {
char *name;
char sex;
int height;
int weight;
data *next;
};
じゃ駄目?
0271デフォルトの名無しさん
NGNGCじゃstruct省略できないだろ
0272デフォルトの名無しさん
NGNGPascalかModulaコンパイラか。
■ このスレッドは過去ログ倉庫に格納されています