5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

ポインタを難しいと言う奴が理解できない

1 :デフォルトの名無しさん:2008/07/27(日) 10:47:14
int i = 10;
int * p = &i;//int型ポインタpにiのアドレスを代入する
簡単。
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。

2 :デフォルトの名無しさん:2008/07/27(日) 10:52:49
>>1
5ポイント

3 :デフォルトの名無しさん:2008/07/27(日) 10:52:54
str1 = "別の文字列"; //エラー
str2 = "別の文字列"; //OK

上と下どっちを使うか状況によって異なる。
同じとかいってしまっているお前は、結局何も理解出来ていない。

4 :デフォルトの名無しさん:2008/07/27(日) 11:03:14
if(sizeof(str1) == sizeof(str2))
  puts(">>1は天才");
else
  puts(">>1は愚か者");


5 :デフォルトの名無しさん:2008/07/27(日) 11:20:52
>>1
つ、釣られないぞ!

6 :デフォルトの名無しさん:2008/07/27(日) 11:25:57
* を両方から離して書くのは
かけ算と紛らわしいので嫌い

7 :デフォルトの名無しさん:2008/07/27(日) 11:28:07
その昔、ポインタの冒険と言うゲームがあってだな

8 :デフォルトの名無しさん:2008/07/27(日) 11:47:27
code、data、bssの何処に配置されるのかが重要

9 :デフォルトの名無しさん:2008/07/27(日) 11:54:39
>>1

*(s+5)
s[5] (⇒ Compile時に*(s+5)に変換される)
5[s] (⇒ Compile時に*(s+5)に変換される)

は全部同じ意味だから当たり前だろ。

10 :デフォルトの名無しさん:2008/07/27(日) 11:59:12
↑はずれ

11 :デフォルトの名無しさん:2008/07/27(日) 12:04:28
実務で使うようなGUIプログラミング・Windowsプログラミング(CとC++どちらも必須。他言語のGUIは遅すぎる)を学びたいなら、
構造体とポインタの絡みくらいは理解しておく必要がある。
これを理解しておかないとWindowsプログラミングの入門書すら読めない。

しかし今は良書が揃っているので馬鹿でなければ2〜3週間で習得できるだろう。


「C言語 ポインタ完全制覇」
(言わずと知れたポインタのバイブル。これを読めば99.9%の人はポインタが得意になる。Amazonでも2chでも類を見ない程の高評価。)
http://www.amazon.co.jp/review/product/4774111422/

「C言語ポインタが理解できない理由」
(人によって好き嫌いがあるが、気軽に読める)
http://www.amazon.co.jp/review/product/4774114316



12 :デフォルトの名無しさん:2008/07/27(日) 12:05:52
>>10
はずれはお前の頭だ

13 :デフォルトの名無しさん:2008/07/27(日) 12:08:34
* と []は同じ

14 :デフォルトの名無しさん:2008/07/27(日) 12:09:48
とは限らない

15 :デフォルトの名無しさん:2008/07/27(日) 12:13:01
char str1[] = "abcde";
char *const str2 = "abcde";

これならよかったのに

16 :デフォルトの名無しさん:2008/07/27(日) 12:17:00
ここはバカのすくつか・・・。

char (*p)[6] = &str1; // OK
char (*p)[6] = &str2; // Error

if (sizeof str1 == sizeof str2) {
 puts("same");
} else {
 puts("different"); // こっちが出力される
}

17 :デフォルトの名無しさん:2008/07/27(日) 12:19:34
str1[0] = 'A'; // OK
str2[0] = 'A'; // 未定義動作

これもだな。

18 :デフォルトの名無しさん:2008/07/27(日) 12:24:26
str2はただのアドレスを格納するだけの変数(普通は4byte)
str1は実体を持つ(char*6 = 6byte)
"abcde"は定数でメモリのナンチャラ領域に密かに存在したまま。


19 :デフォルトの名無しさん:2008/07/27(日) 12:26:53
"abcde"はfree()が必須ですか?

20 :デフォルトの名無しさん:2008/07/27(日) 12:28:31
お前は一体何を言っているんだ?

21 :デフォルトの名無しさん:2008/07/27(日) 12:29:48
1.str1は定数で、str2は定数じゃない。(str1++とか出来ない。)
2.str1の指す領域は変更可能で、str2に関しては未定義。
って感じ?

22 :デフォルトの名無しさん:2008/07/27(日) 14:42:45
あ、いや、その・・・・
ポインタは理解できる。
がしかし、
ポインタのポインタが出てくるともう俺の頭はオーバーヒートしてしまう。
すんませんVBしか触ったことがないもので。

23 :デフォルトの名無しさん:2008/07/27(日) 15:05:01
こんなテキストベースのコミュニティで聞くより
>>11の本を買って視覚的に学んだほうが早い

24 :デフォルトの名無しさん:2008/07/27(日) 15:10:21
くだらない本を読んでいる暇があったら、アセンブラをかじればいいだけ。

25 :デフォルトの名無しさん:2008/07/27(日) 15:44:48
前スレかもしれない

ポインタはどうやって学ぶべきか
http://pc11.2ch.net/test/read.cgi/tech/1193166476/l50

26 :デフォルトの名無しさん:2008/07/27(日) 17:48:22
>>25
そうでもない

ポインタはどうやって学ぶべきか part2
http://pc11.2ch.net/test/read.cgi/tech/1217147291/

27 :デフォルトの名無しさん:2008/07/27(日) 20:26:10
ポインタのポインタを理解できないようでは
ポインタが理解できているという言葉も怪しいな。

28 :デフォルトの名無しさん:2008/07/27(日) 22:12:42
ポインタは理解できたけど、ポインタのポインタが理解できないってのは
大抵ポインタは配列の表現を変えた物と認識している
で、ポインタのポインタ=二次元の配列と考えてしまい混乱する

29 :デフォルトの名無しさん:2008/07/27(日) 22:47:46
ポインターが理解できないのは
mov eax,esi

mov eax,[esi]
の違いがわからないのと一緒。
この違いがわかればポインターが難しいはずがない。



30 :デフォルトの名無しさん:2008/07/27(日) 22:51:40
文法が曖昧で難しいのであって、ポインタが難しいのではない

31 :デフォルトの名無しさん:2008/07/27(日) 22:55:39
このスレタイみたいなことを職場でいう奴がいると本当に萎える
ポインタが分かる・分からないという話自体、ど素人が好む話題だから

32 :デフォルトの名無しさん:2008/07/27(日) 23:48:03
・なぜポインタを使う必要があるのか
・どういう場合にどういう風にポインタを使うべきなのか

この二点を誰も説明してくれないんだよなあ。
山ほど解説書を買ったけど、前者について解説している本は皆無。
後者については、関数の引数を参照渡しして直接更新して返す
サンプルくらいしかない。
これで理解して使えという方が無理だ。

33 :デフォルトの名無しさん:2008/07/28(月) 00:01:19
> 理解して使えという方が無理
そう、だから理解しないでなんとなくコード書いて、
そのうちなんとなくみんな分かってきた気になるというのが現状。
悩んでいる暇があったらとりあえず何か書いてみ。

34 :デフォルトの名無しさん:2008/07/28(月) 00:19:34
>>33
いや、俺は理論から入る人間だから
使う必要性を理解してからでないと使いたくないんだ。

ただ一つ、最近の本で「配列とポインタではポインタの方が
実行速度が速い」という記述を読んだ。
これだよこれ。こういうのをなぜ一番に言わないかね。
初心者は、同じことを配列でできるのに、なぜわざわざポインタを
使うのか、そのことで悩んでるんだから。

「配列とポインタはやってることは同じだけどポインタの方が速い」
この一言だけでポインタを使う理由になるじゃないの。

35 :デフォルトの名無しさん:2008/07/28(月) 00:31:32
>>34
俺も理論から入る人間だからこそ言える。

たぶんそういう考えの俺らはPG/SE/PMには向いてないよ。

36 :デフォルトの名無しさん:2008/07/28(月) 00:33:24
この業界の出来る人というのは、常に最新の技術を追い続けている。
必要有か無か、流行るか流行らないか、の判断も付かないうちから、最新技術に興味を示す。

37 :デフォルトの名無しさん:2008/07/28(月) 00:34:15
実は大嘘
配列とポインタでは配列のほうが実行速度が速い

38 :デフォルトの名無しさん:2008/07/28(月) 00:37:12
>>34
プログラムなんてどんな言語で作られたモノであろうと結局はCPUがメモリのアドレスを行ったり来たりしている。
隠蔽されてないアセンブラ・Cが速いのは当たり前。

勿論、零細企業で小規模システムの開発しかしていない人にとってはJavaどころかVBでも十分

39 :デフォルトの名無しさん:2008/07/28(月) 00:38:13
速度と省メモリ

40 :デフォルトの名無しさん:2008/07/28(月) 01:04:18
結論:ポインタを考えた奴は馬鹿

41 :デフォルトの名無しさん:2008/07/28(月) 01:15:48
C言語の文法が糞
もっと紛れのない文法の高級アセンブラが普及すべきだった

42 :デフォルトの名無しさん:2008/07/28(月) 01:28:28
ポインタの必要性くらい書いてある本はある。
書いてないようなら捨ててしまえ。

43 :デフォルトの名無しさん:2008/07/28(月) 02:17:17
>>40
>>41もいってるが文法がクソなだけ。
先にポインタの概念を取得してからCに入れば
表現の違いでしかないんだけどな。

44 :デフォルトの名無しさん:2008/07/28(月) 02:25:06
>>32
やっぱプログラミングの入門書には
データ構造の話とかも書くべきだよな。




>>34
ちょwwwwwwwwwwそんな理由www

45 :デフォルトの名無しさん:2008/07/28(月) 04:56:20
>>34
それが事実じゃないからさ
ポインタと配列は別物であり、使える場所も変わってくる
例えば関数の引数として使えるのはポインタだけで
配列使ってるように見えるのは見せ掛けで実はポインタ使ってるとか
そういう細かい事実があるわけ
今の処理系じゃポインタの方が速いなんてことも別にないし

46 :デフォルトの名無しさん:2008/07/28(月) 07:36:31
>>37
ハァ?
メモリ上の配列とポインタの事言ってんだったら変わらねーよ。
例え配列がスタックで、ポインタの方をヒープのつもりで発言してても、
確保に時間が掛かるだけで、アクセス速度は変わらん。


47 :デフォルトの名無しさん:2008/07/28(月) 07:57:28
特定のコンパイラの実装・最適化の話とか?
まー配列の方が当たりをつけやすい場面が多いとはおもうけど
それをもって速いってのもなぁ。

48 :デフォルトの名無しさん:2008/07/28(月) 08:01:37
ポインタ判らないとかいってるやつはクローじゃ、ラムダ指揮、公開関数(なぜか変換できない)理解できるのか?

49 :デフォルトの名無しさん:2008/07/28(月) 08:02:33
訂正
→できないのかな?

50 :デフォルトの名無しさん:2008/07/28(月) 08:18:57
Cのポインタは参照・束縛の概念だけじゃなく
メモリアドレスを意識できなくちゃいけないしな。
ポインタ自体の演算や型キャストもできるわけだし
高級言語にくらべたら無法に近い。

>>48
一見関係ないように思えるけど……。

51 :デフォルトの名無しさん:2008/07/28(月) 08:21:03
Cでポインタを使わなくてはならないケースは
malloc関数で動的にメモリを確保して使う場合と
scanf関数の引数だろ。
これ以外でポインタを使う香具師はDQN。

52 :デフォルトの名無しさん:2008/07/28(月) 09:20:26
>>46-47
機械語レベルの話だから別にいいよ
説明する気もないし

53 :デフォルトの名無しさん:2008/07/28(月) 09:34:29
リンカのことを考えれば
>>29にたどり着く。

54 :デフォルトの名無しさん:2008/07/28(月) 10:04:59
>>51
  |   |  | |   |    |  | |   |   |   || | |
  |   |  | レ  |    |  | |   |  J   || | |
  |   |  |     J    |  | |  し     || | |
  |   レ |      |  レ|       || J |
 J      し         |     |       ||   J
             |    し         J|
             J                レ
     /V\
    /◎;;;,;,,,,ヽ
 _ ム::::(l|l゚Д゚)| …うわぁ
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'

55 :デフォルトの名無しさん:2008/07/28(月) 10:17:48
後半は釣りだが、それまでmallocの話が出てこなかったのは異常。

56 :デフォルトの名無しさん:2008/07/28(月) 10:27:07
>>52
× 説明する気もないし
○ 説明する能力もないし

57 :デフォルトの名無しさん:2008/07/28(月) 10:32:51
1. 配列を関数に渡す際にどうしても必要
2. 構造体を関数にコピーレスで渡したい際にどうしても必要
3. 別関数内の変数の値を変更したい際にどうしても必要
4. メモリを動的に確保する際にどうしても必要
5. 特殊なデータ構造を実現する際にどうしても必要

ポインタがどうしても必要になるケースは、普通はこのくらいかね。
他にも使う状況はなくはないと思うが。

58 :デフォルトの名無しさん:2008/07/28(月) 11:07:44
>>56
煽っても何もでないよ

59 :コピペ:2008/07/28(月) 11:11:54
【ポインタがないと?】
void func(char c){
c = 'z';
}
int main(){
char subarac = 'a';
func(subarac);
printf("%c",subarac);
}

mainの人「'a'って書いた紙を渡すよ」
func作業員「じゃあそれをコピーして使いますね」
mainの人「なんでんなことすんだよそのまま使えよ」
func作業員「コピーしたのをzと書き換えました」
mainの人「じゃあくれ」
func作業員「これはあなたのものではなく私たち作業員のものです、渡せません」
mainの人「結果、手元にあるaと書かれた紙が表示されるのであっためでたしめでたし」

60 :デフォルトの名無しさん:2008/07/28(月) 11:27:13
void func(char *c){
c = 'z';
}
int main(){
char subarac = 'a';
func(subarac);
printf("%c",subarac);
}

この場合を教えてくれ




61 :デフォルトの名無しさん:2008/07/28(月) 11:29:54
>>60
ひと目で間違いに気づかないとか、もうね…

62 :60:2008/07/28(月) 11:43:47
>>61
わざとやってるんだが

63 :デフォルトの名無しさん:2008/07/28(月) 11:48:37
ポインターはどこでもドア。
好きなところに移動してデータを置ける。
開けた先がお風呂だと大変なことになる。

64 :デフォルトの名無しさん:2008/07/28(月) 12:12:38
>>63
お風呂が溢れちゃいますね。

65 :,,・´∀`・,,)っ:2008/07/28(月) 12:20:57
>>60
コンパイルエラー

66 :60:2008/07/28(月) 12:53:55
警告は出るがコンパイルはできる

PPP.C(2) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'int' で異なって
います。
PPP.C(6) : warning C4047: '関数' : 間接参照のレベルが 'char *' と 'char' で異な
っています。
PPP.C(6) : warning C4024: 'func' : の型が 1 の仮引数および実引数と異なります。
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

/out:PPP.exe
PPP.obj


67 :デフォルトの名無しさん:2008/07/28(月) 13:17:34
>>57
おお、いいね。
これを五つの章構成にして
実例とともに詳細解説を加えれば
画期的なポインタの解説書になるよ。
たぶん、今までこういう本はなかったよ。
本を出したら俺は印税の一割でいいよ。

68 :デフォルトの名無しさん:2008/07/28(月) 13:24:02
1. 配列を関数に渡す際にどうしても必要

可変個引数で渡せる

69 :デフォルトの名無しさん:2008/07/28(月) 13:33:44
そもそも、配列を使うためにはポインタ演算が必ず行なわれているわけだが。
p[i]というのは*(p+i)でしかないのだから。
# だからこそi[p]という書き方もできるわけで、3["abcd"]なんてこともできると。

70 :デフォルトの名無しさん:2008/07/28(月) 13:34:48
仮引数を [] で受けてたら、ポインタを使っていることに
気づかない奴もいるかも知れない。

71 :デフォルトの名無しさん:2008/07/28(月) 13:38:56
そこをきちんと説明しないから理解できないのではないかと思う。

72 :デフォルトの名無しさん:2008/07/28(月) 13:41:34
scanfを教えるときに&を{おまじない}として教えるのも良くないと思う

73 :デフォルトの名無しさん:2008/07/28(月) 13:49:32
ポインタの使いどころを書いてる本がないってことはないと思うんだが。

74 :デフォルトの名無しさん:2008/07/28(月) 13:51:02
#include<stdio.h>
char func(char c);
int main(void)
{
char subarac = 'A';

subarac = func(subarac);

printf("%c\n",subarac);

return 0;
}


char func(char c)
{
c = 'Z';

return c;
}


>>59先生できました\n

75 :デフォルトの名無しさん:2008/07/28(月) 13:57:23
char str1[] = "abcde";
だと長さが5の配列の実体が出来ると思ってたんだけど違うのか?
char *str2 = "abcde";
だとリテラル"abcde"のアドレスをstr2に代入すると思ってたんだけど違うのか?

76 :デフォルトの名無しさん:2008/07/28(月) 13:58:47
>char str1[] = "abcde";
>だと長さが5の配列の実体が出来ると思ってたんだけど違うのか?
違う。長さは6。

>char *str2 = "abcde";
>だとリテラル"abcde"のアドレスをstr2に代入すると思ってたんだけど違うのか?
あってる。

77 :,,・´∀`・,,)っ:2008/07/28(月) 13:59:35
>>69
いいや
配列p[]を *(p+i)でアクセスするのは無理だろ

78 :デフォルトの名無しさん:2008/07/28(月) 14:08:47
>>77
自信満々に書く前に、ちょっと確認してみたら?
#include <stdio.h>
int main()
{
int i = 3;
int p[] = {1, 2, 3, 4, };
printf("%d\n", *(p + i));
printf("%d\n", i[p]);
return 0;
}

79 :デフォルトの名無しさん:2008/07/28(月) 14:12:55
>char str1[] = "abcde";
なんで長さが5なの?

80 :デフォルトの名無しさん:2008/07/28(月) 14:25:11
\0を忘れていました。

81 :デフォルトの名無しさん:2008/07/28(月) 14:30:49
char str1 = {'a','3','-','o','ω'};

82 :デフォルトの名無しさん:2008/07/28(月) 14:52:49
アドレス空間の概念が理解できてないとポインタが理解できないんじゃない?
あと、できればスタックとヒープの違いぐらいは理解して欲しいけど。

そもそもC言語の場合、スタックにたくさん積みたくない→ポインタの概念導入、っていう流れの気がする。

83 :,,・´∀`・,,)っ:2008/07/28(月) 15:11:47
>>78
すまぬ

だがこういうのよく使わないかな?
sizeof (a) /sizeof (a[0])
ポインタと配列混同すると痛い目にあう例だが

84 :デフォルトの名無しさん:2008/07/28(月) 15:24:41
だが

のつながりがよくわからないです

85 :デフォルトの名無しさん:2008/07/28(月) 15:31:52
>>83
配列とポインタの区別がよくできていないことが判りますね。

int main()
{
short i;
short a[3];
short * p;
printf("%u, %u\n%u, %u, %u, %u\n%u, %u, %u, %u\n",
sizeof(i), sizeof(& i),
sizeof(a), sizeof(* a), sizeof(a[0]), sizeof(& a),
sizeof(p), sizeof(* p), sizeof(p[0]), sizeof(& p));
return 0;
}

86 :デフォルトの名無しさん:2008/07/28(月) 15:44:43
きっと配列へのポインタも理解できてないんだろうなあ。

  short (*pa)[3] = a;

87 :デフォルトの名無しさん:2008/07/28(月) 20:14:21
C言語でint[100000000000000]とかにしちゃうとエラーになるんですけど
(コンパイラだかリンカだかの制約でスタックには○○MBしか積めないルール)

他の言語でも同じなんですか??
Java,VB,Ruby

88 :デフォルトの名無しさん:2008/07/28(月) 20:18:51
>>86
そんな危険な宣言すんなよ。

89 :デフォルトの名無しさん:2008/07/28(月) 20:20:33
>>87
仮想メモリとして扱う処理系もあるし、そのエラーと言うのは全部の処理系で確認した?

90 :デフォルトの名無しさん:2008/07/28(月) 20:21:29
>>87
>C言語でint[100000000000000]とかにしちゃうとエラーになるんですけど
sizeof(int) が4だとして、300テラバイトを超えるメモリを割り当てられる処理系が思いつかない。

91 :デフォルトの名無しさん:2008/07/28(月) 20:21:58
>>85

$ ./a

2, 4
6, 2, 2, 4
4, 2, 2, 4


ところで
short *ponta = a;
とやってもsizeof(ponta)は4byteでしかない。

aを使わずにqが指すshort配列の大きさを調べることはできないの?

92 :デフォルトの名無しさん:2008/07/28(月) 20:22:49
配列へのポインタ

ポインタの配列
の違いと宣言文法が分からない。

93 :デフォルトの名無しさん:2008/07/28(月) 20:24:31
訂正

>aを使わずにqが指すshort配列の大きさを調べることはできないの?

aを使わずにpontaが指すshort配列の大きさを調べることはできないの?

94 :デフォルトの名無しさん:2008/07/28(月) 20:26:41
BCCでもGCCでも
int[200万]あたりでエラーになる。メモリは6GB積んでるのに

95 :デフォルトの名無しさん:2008/07/28(月) 20:28:44
>>86
アホか
それはポインタの配列だろ

96 :デフォルトの名無しさん:2008/07/28(月) 20:37:57
>>92
short (*p2a)[X]; // p2aは short[X] を指すポインタ
short *(p2a[X]); // p2a[X] は short を指すポインタ
short *p2a[X];  // 同上

>>93
不可能。

>>94
その配列が静的か動的かによって違う。
つか、6GB積んでたって全部1プロセスで使えるとも限らん。

>>95
1から勉強し直せ。

97 :デフォルトの名無しさん:2008/07/28(月) 21:15:46
>>96
結局ポインタの配列ってのは?

98 :デフォルトの名無しさん:2008/07/28(月) 21:31:54
・ポインタの配列

[アドレス][アドレス][アドレス][アドレス]・・・

と言う風にアドレス空間にポインタの配列が確保されていて、アドレスが入っている。

・配列のアドレス

アドレス
 ↓
[データ][データ][データ][データ][データ]・・・

配列の先頭アドレス。インクリメント時にサイズだけインクリメントされる。

・配列のアドレスを保持するポインタ

ポインタ
 ↓
[アドレス]
 ↓
[データ][データ][データ][データ][データ]・・・

これが

(*p)[i];

だと思う。「配列のアドレス」を略して「配列」って呼ぶのはちょっとどうかなと思う。
わかりにくい。


99 :デフォルトの名無しさん:2008/07/28(月) 21:33:21
ちなみに俺は

int i, *p, *a;
・・・
p = a + i;

って書き方はしないようにしてる。

int i, *p, *a;
・・・
p = &a[i];

って書くようにしてる。
理由は俺がアホで理解しにくいから、

100 :デフォルトの名無しさん:2008/07/28(月) 21:34:04
変数は配列を考えることができますね。たとえば、次の例ではchar型変数10個の配列を宣言しています。

char charray[10];
ポインタといっても変数なので、他の型と同じように配列を宣言して使うことができます。

char *chr_ptr[10];  (char* chr_ptr[10];でもいい)



2次元配列のことをポインタの配列だという人がたまにいますが、ちょっと違います。
ポインタの配列は2次元配列などではなくあくまでもポインタ変数の配列で、上のように宣言したものは1次元配列です。
メモリの確保のされ方からいって、2次元配列とポインタ配列は全く違うものです。


101 :デフォルトの名無しさん:2008/07/28(月) 21:35:58
別に、char型の2次元配列と思っていいんじゃないの?


102 :デフォルトの名無しさん:2008/07/28(月) 21:37:33
ポインタは完璧!だと思ってたのにこのスレ見たら自信なくなってきた

103 :デフォルトの名無しさん:2008/07/28(月) 21:41:12
お、おれも!

104 :デフォルトの名無しさん:2008/07/28(月) 21:45:46
これらのスレ>>1から読めばちょっとは力付くよ・・・余計混乱するかもだけどw

ポインタはどうやって学ぶべきか
http://pc11.2ch.net/test/read.cgi/tech/1193166476/l50
ポインタはどうやって学ぶべきか part2
http://pc11.2ch.net/test/read.cgi/tech/1217147291/l50
ポインタ死ねよ。
http://pc11.2ch.net/test/read.cgi/tech/1171172537/l50

105 :デフォルトの名無しさん:2008/07/28(月) 21:46:07
俺はアホばっか見てて自惚れそうで怖くなってきた。

106 :デフォルトの名無しさん:2008/07/28(月) 21:48:53
**argvはポインタのポインなのか配列のポインタなのかポインタの配列なのか詳しく!


167 :デフォルトの名無しさん:2007/11/03(土) 14:30:24
>>157
char **p;
と書いて配列へのポインタと解釈することなんてありえるか?
配列へのポインタといったら
char (*p)[N];
じゃないのか?

168 :デフォルトの名無しさん:2007/11/03(土) 14:31:55
>>167
int main(int argc, char **argv)

170 :デフォルトの名無しさん:2007/11/03(土) 14:32:48
>>168
それはポインタの配列


107 :デフォルトの名無しさん:2008/07/28(月) 21:51:27
これでFA


(intへのポインタ)の配列
int* ponta[10];


(int配列)へのポインタ
int(* ponta)[10];



108 :デフォルトの名無しさん:2008/07/28(月) 21:52:51
(int)へのポインタ
int* ponta;


??
int(* ponta);

109 :デフォルトの名無しさん:2008/07/28(月) 21:56:49
以下の3つの違いを明確に理解せよ。
特にメモリ上でどう表現されるかについて考えるといい。
  (a) 3つの int[5] からなる配列 int a[3][5]
  (b) 3つの int* からなる配列 int* a[3]
  (c) int[5] へのポインタ int (*a)[5]

(a) と (b) は似たようにアクセスできるかもしれないが全くの別物。
(a) から (c) に自動変換が効くのは一般の配列の場合と同様。

110 :デフォルトの名無しさん:2008/07/28(月) 21:58:34
>>106
**argv は文字列配列の先頭アドレスが確保されている配列の先頭アドレスのポインタ。

言い換えると文字列群の各文字列の先頭へのアドレスが配列で保持されていて、その配列の先頭アドレス。

"test"
"yaruo"
"bararaika"

と文字列があったら、 "test"の "t" のアドレス、"yaruo" の "y" のアドレス、 "baranaio" の "b" のアドレス


[アドレス][アドレス][アドレス]

と言う風に格納されていて、その一番最初のアドレスが argv。

要するに、

argv が指すアドレス
 ↓
[アドレス][アドレス][アドレス]
 ↓    ↓    ↓
"test"  "yaruo"  "bararaika"

ってなってる。


111 :デフォルトの名無しさん:2008/07/28(月) 21:59:02
>>109
里佳石井素股

112 :デフォルトの名無しさん:2008/07/28(月) 22:14:16
>>110
>**argv は文字列配列の先頭アドレスが確保されている配列の先頭アドレスのポインタ。
文字列配列じゃなくて、文字列または文字配列じゃね?
「文字列群」が文字列配列であるかはどうかは**argvには関係ねぃし。

113 :デフォルトの名無しさん:2008/07/28(月) 22:21:44
**argvは、機能的にはどう見ても
ポインタの配列なのだが、
星が二つついてるのだからあくまで
ポインタのポインタと理解しなければならない。

114 :デフォルトの名無しさん:2008/07/28(月) 23:15:58
*argv[]
この書き方が好きだ

115 :デフォルトの名無しさん:2008/07/28(月) 23:25:43
要するに、c では「配列」の実体だけを書くことができないんだよ。(anonymous 配列を書くシンタクスがない)
書けるのは「配列の名前」で、それは配列の実体へのポインタをそう呼んでいるだけ。
char a[128]; というときの a 自体は配列ではない。a は「配列の名前」で、それは [128] という配列実体へのポインタ。
その a へのポインタは、char (*a)[128];

116 :デフォルトの名無しさん:2008/07/29(火) 01:27:34
日本語でおk

117 :デフォルトの名無しさん:2008/07/29(火) 01:56:11
[]演算子が混乱の元だ。
シンタクス・シュガーではなく、
シンタクス・ビターになっとる。

118 :デフォルトの名無しさん:2008/07/29(火) 01:59:28
うまくない

119 :デフォルトの名無しさん:2008/07/29(火) 01:59:30
わざと分かり辛く書いてんだろ。
[]も*も同じだと思えばいいんだよ。そのうち違いが分かってくるさ。

120 :デフォルトの名無しさん:2008/07/29(火) 06:53:10
>>105
俺は改めてコの業界の糞さを思い知らされた。

>>115
自慢げに適当な嘘並べるな。
オブジェクト「a」そのものは配列であり、その右辺値が「配列の先頭を指すポインタ」になるだけだ。

121 :デフォルトの名無しさん:2008/07/29(火) 07:17:11
>>120
2ちゃんに書き込む人間はみんな糞ですがなにか?
オレモナー

122 :デフォルトの名無しさん:2008/07/29(火) 12:06:30
>char * str2 = "abcde";
いまだにここが分からない
ポインタに何故文字列を代入できるの?

123 :デフォルトの名無しさん:2008/07/29(火) 12:09:35
>>122
"abcde"はconstな文字列(≒char配列)ですが、右辺値はconstな文字列へのポインタになります。従って、代入できるわけです。
char foo[] = "abcde"した後、char * p = fooと言うように代入できるのと同じことです。

124 :デフォルトの名無しさん:2008/07/29(火) 12:41:40
>>122

それは文字列の書かれてる場所を教えてるだけ。
文字列自体は別にある。

だからその後に str2 = NULL; なんてやったら、"abcde" のありかは永久に失われる。


125 :デフォルトの名無しさん:2008/07/29(火) 12:50:00
char * str2 = "abcde";
の"abcde"はstaticな感じって言えばいいのかな?
constな無名変数とでも言うか

126 :デフォルトの名無しさん:2008/07/29(火) 13:31:55
回りくどい言い方になるが、コード上は文字列を代入してる形だけど、実際は数字を扱ってるだけ

たとえば、右辺に"abcde"を書くということは、
あるアドレス(仮にXとする)に対して、
Xにaの文字コード97をセット
X+1にbの文字コード98をセット
X+2にcの文字コード99をセット
X+3にdの文字コード100をセット
X+4にeの文字コード101をセット
X+5に0をセット
以上を行って、左辺にXを渡している
上の例だと、*(str+3)をintにでもキャストして眺めると、100が入ってるはず

この領域は変更付加
その意味ではstaticだけど、配列の宣言と一緒にやった場合は例外
詳しくは、「文字列リテラルの変更」でググると解説が

127 :デフォルトの名無しさん:2008/07/29(火) 13:44:37
115は良くある間違いで、(わかってて書いてたらスマン)120の言うとおりCの配列とポインタは明確に別物
どちらで宣言するかで、動作が変わる
具体的に言うと、sizeof()の動作が、ポインタの場合はポインタのサイズ(通常は4)を返すが、
配列の場合は使用バイト数を返す

混乱のもとは、[]記号が、宣言、右辺値、左辺値、それぞれのケースで意味が微妙に違うところ
整理してないと、すぐわからなくなる

128 :デフォルトの名無しさん:2008/07/29(火) 13:50:45
>>126
一言で言い表せないよねなかなか

129 :デフォルトの名無しさん:2008/07/29(火) 16:30:04
>char (*a)[128];

こういう表現って普通に使います?
おいら使ったことないんだけど。

130 :デフォルトの名無しさん:2008/07/29(火) 16:33:52
泉源寺に()つけちゃって大丈夫なんだっけ

131 :デフォルトの名無しさん:2008/07/29(火) 16:37:36
配列へのポインタ(≠ポインタのポインタ)が必要なときはそうせざるを得ないね。

132 :デフォルトの名無しさん:2008/07/29(火) 16:39:59
そんな宣言はしない
使う時にキャストするから。

133 :デフォルトの名無しさん:2008/07/29(火) 17:47:59
>>129
横WIDTH個、縦HEIGHT個の長方形のchar配列を動的に確保したい時、
char (*tbl)[WIDTH] = malloc(sizeof(char)*WIDTH*HEIGHT);
とかやる。
tbl[y][x] = data;
とかいうふうにアクセスする。
>>130
論外
>>132
おまえだけ


134 :デフォルトの名無しさん:2008/07/29(火) 17:53:27
私は
char * tbl = malloc(WIDTH * HEIGHT)で確保して、
static inline unsigned offset(int width, int x, int y) {return x + y * width;}みたいな関数を用意して、
tbl[offset(WIDTH, x, y)] = dataと言う風にアクセスするかな。

135 :デフォルトの名無しさん:2008/07/29(火) 19:18:00
>>133
なるほどそういうことですか。ようやく意味がわかりました。

136 :デフォルトの名無しさん:2008/07/29(火) 19:19:31
サンプルのためのサンプルじゃなくて、実際的なシチュエーションが思いつかん。
まったく無責任な想像だが、メッセージ通信処理とかで使えそうかなぁ。
1個のチャンクが固定長でうんちゃらかんちゃらとか。まーよー知らんけど。

137 :デフォルトの名無しさん:2008/07/29(火) 19:30:18
メッセージ通信でポインタ使う奴の気が知れない。

138 :デフォルトの名無しさん:2008/07/29(火) 20:08:03
リストとツリーをC言語で自力で実装できるぐらいポインタを理解しておけば、
現実問題としてポインタ周りで困ることはあんまりないな。



139 :デフォルトの名無しさん:2008/07/29(火) 21:49:47
char (*p)[4];
って有ったとき、p++てやると、
pは4バイト移動するって考えると分かりやすいな。

140 :デフォルトの名無しさん:2008/07/30(水) 09:42:39
>>139
で、実際はそうはならないので混乱する、と。

でも混乱するのは理解が足りない所為だよ。

141 :デフォルトの名無しさん:2008/07/30(水) 10:18:13
>>136
処理を順次実行したい場合の関数ポインタの配列とか。
後は可読性を捨ててでも処理速度を稼ぎたい時とかかなぁ。

使わない方がコード的に遅くて長くても安全って場合の方が多いよなぁ。
特に複数人でコードを書く場合は。

142 :デフォルトの名無しさん:2008/07/30(水) 13:05:37
ぱっと見で動きの想像しにくいポインタの使い方はちょっとなあ。
2次元以上だったら最大値規定して最初から配列取るわ。

143 :デフォルトの名無しさん:2008/07/30(水) 13:24:17
>>133
それC99じゃないとWIDTHを変数にできないから困る。
できればやりたいんだけどね。

144 :デフォルトの名無しさん:2008/07/30(水) 14:20:47
define

145 :デフォルトの名無しさん:2008/07/30(水) 14:42:36
#define PTA(sex) *(sex)
#define TRF(sex) &sex



main(int itn, char PTA PTA)
{
int itn;
scanf("%d", TRF(itn));
write(itn, 4);
}

146 :デフォルトの名無しさん:2008/08/01(金) 20:47:45

int a[100] = { 1, 2, 3, 4, 5,・・・・,100 };
int *po;
po = a;
int cnt;

1)
for( cnt = 0 ; cnt < 100 ; cnt++ ){


147 :デフォルトの名無しさん:2008/08/01(金) 20:54:15
>>146
すいません。誤爆しました

148 :デフォルトの名無しさん:2008/08/01(金) 21:24:47

int *********************************a;


149 :デフォルトの名無しさん:2008/08/02(土) 03:41:14
a.next->next->prev->next->next->name = "shine>>148";

150 :デフォルトの名無しさん:2008/08/02(土) 03:59:13
輝け148

151 :デフォルトの名無しさん:2008/08/02(土) 09:25:34
昔、トリプルポインタを使っているコードを業務で見た。
それ自体はよくできているプログラムだし、公開されているインタフェースも
ちゃんとしていた。しかしまぁ、これを作った人(ベテランプログラマー)は
よく自分で理解できるもんだ、と素直に関心した。

152 :デフォルトの名無しさん:2008/08/02(土) 11:03:57
終始ビット演算を使われるよりまし


153 :デフォルトの名無しさん:2008/08/03(日) 00:55:51
むしろ何で理解できないかが理解できない

154 :デフォルトの名無しさん:2008/08/03(日) 06:29:00
そういうこと言う奴は理解してない

155 :デフォルトの名無しさん:2008/08/04(月) 12:13:42
5次元配列をいくつか使っているソースみて爆死した。
書いた本人はリタイアして該当コードは最初から書き直しになった。

156 :デフォルトの名無しさん:2008/08/04(月) 12:50:32
多次元配列を扱う部分だけLispのコードから生成するとかはやるよ
ルールが決まってて単純にそのルールを繰替えし適用するだけだから
機械にやらせた方が絶対安全

157 :デフォルトの名無しさん:2008/08/05(火) 01:41:35
配列なんて、マトリックス構成する要素が幾つにでもなるから
何次元だろうとどうでもいいじゃん。


158 :デフォルトの名無しさん:2008/08/05(火) 01:50:07
量子化学計算やるには5次元配列が普通に必要になるよ。
小原積分計算する時に。

159 :デフォルトの名無しさん:2008/08/05(火) 01:51:39
といいつつ、まあ実際には普通の配列にはしないんだけどな・・・。

160 :デフォルトの名無しさん:2008/08/05(火) 11:32:01
>>151
ポインタにダブルだとかトリプルだとか属性があるような解釈の仕方をするから理解できないんじゃないの?
アスタリスクが並ぶのがいやならtypedefすればいいだけの話だし、そうしてしまえばただのポインタと同じことじゃないか。

161 :デフォルトの名無しさん:2008/08/17(日) 11:40:50
関数ポインタを引数に取る関数ポインタの二次元配列とか
そういうのになってくると泣ける程複雑になる
こういうのってtypedef使ってもいいんだよね?
よくポインタの理解度を試すようなクイズで「typedefを使わずに」とかあるけど、
日常的に使っててもできる気がしないわ

162 :デフォルトの名無しさん:2008/08/17(日) 11:45:54
人間がコンパイラになる必要は無いんだから
そういうクイズは無視でおkだと思う

163 :デフォルトの名無しさん:2008/08/18(月) 10:52:16
void (*fnc[YLEN][XLEN])(int(*)(int));

Cエキスパート:出来るけど見にくいからtypedef
なんちゃってプログラマ:出来ないからtypedef、人間コンパイラになる必要はないと言い訳


164 :デフォルトの名無しさん:2008/08/18(月) 11:50:21
typedefは見やすくするためにあるんじゃなくて、
型を抽象化するために使うべきだと思う。

165 :デフォルトの名無しさん:2008/08/18(月) 23:01:11
関数ポインタは積極的に typedef しとけ。他は必要なし。

166 :デフォルトの名無しさん:2008/08/20(水) 12:54:58
そういうのが直ぐできるようになるにはどうすりゃいいんだろうな
規格からルールを理解すれば少しは楽になるんだろうかね?

167 :デフォルトの名無しさん:2008/08/20(水) 13:03:32
簡単にエキスパートになる方法を教えろと言ってるんですね、わかりません

168 :デフォルトの名無しさん:2008/08/20(水) 13:13:53
GCCのソース読むのが近道
読めなければそれが読めるようになるまで簡単な物から読んだり
パッチ作ったりしてオープンソースコミュニティに貢献してりゃ10年もすりゃ
今君が想像してる程度のエキスパートには楽になれる

って以前言われたことがある

169 :デフォルトの名無しさん:2008/08/20(水) 20:50:49
10年かあ・・・
確かに俺がブラインドタッチできるように
なったのは、毎日PCをさわるようになって
10年くらい経ってからのような気がする。
人間、何事も10年は精進が必要なんだね。

170 :デフォルトの名無しさん:2008/08/20(水) 20:51:55
GCCってそんないいソースか?

171 :デフォルトの名無しさん:2008/08/20(水) 21:00:02
ブラインドタッチに10年って・・・・身体障害者の方ですか

172 :デフォルトの名無しさん:2008/08/20(水) 21:09:59
>>171
いや、10年くらいかかっても不思議じゃないと思うぜ。
人さし指タイピングから始めた俺は、タッチタイピングに切替えるだけでかなりの年月を費したが。
それでもまだブラインドタッチにはたどり着けない。
英語キーボードと日本語キーボードを行ったり来たりした日にはもう大変。

173 :デフォルトの名無しさん:2008/08/20(水) 21:11:17
gaucheの作者も昔HPで
どんな言語でも10年は使わなきゃほげほげって書いてたからだいたいあってると思う

174 :デフォルトの名無しさん:2008/08/21(木) 15:14:41
タイピングなんて我流でいいよ
どうせ出力見ただけじゃ経過は見えないんだから

175 :デフォルトの名無しさん:2008/08/23(土) 03:19:03
出力だけ要求されるならそれでもいいが
運指が偏ってると年食ってからバネ指とか悪影響もあるから気をつけろ

176 :デフォルトの名無しさん:2008/08/23(土) 10:16:24
年とると管理業務になるので問題ないです

177 :デフォルトの名無しさん:2008/08/24(日) 02:44:08
>>166
無理に使わなくていいと思うぞ。それを必要と感じる時が来たらそうすればいいんじゃないか。

178 :デフォルトの名無しさん:2008/08/26(火) 11:35:40
#include <windows.h>

#define typedef_func_ptr(returntype, yobidasikiyaku ,functionname) \
returntype (yobidasikiyaku * functionname)

main()
{
typedef_func_ptr(int, WINAPI, ptrMessageBox)(HWND, LPSTR, LPSTR, UINT);
ptrMessageBox = MessageBox;
ptrMessageBox (NULL, "セクロス", "セクロス", MB_OK);

}

179 :デフォルトの名無しさん:2008/09/07(日) 07:05:32
ポインタ?あれはショートカットだショートカット

っていうセンパイの言葉でわかった

180 :デフォルトの名無しさん:2008/09/07(日) 10:13:02
たとえ話は、ポインタの理解の役には立たない。

これ定説。

181 :デフォルトの名無しさん:2008/09/07(日) 15:10:11
使って覚えろ
これが基本ですね、マクロしかりテンプレートしかり各種ライブラリしかり

182 :デフォルトの名無しさん:2008/09/07(日) 15:54:49
アドレスとデータの区別がつけば、あとは簡単。

183 :デフォルトの名無しさん:2008/09/07(日) 18:37:35
矢印と箱の差。
図を描いてみればアホでもわかるだろ。描こうともしないでわからないとかほざく無能は氏ね。
構造を把握したうえで、「たぐりよせる」操作と「矢印を作る」操作がわかればあとは簡単。

184 :デフォルトの名無しさん:2008/09/07(日) 20:09:49
たとえ話で説明するやつの理解はけっこアヤシイ。

ところで、ポインタには型がある事をお忘れなく。

185 :デフォルトの名無しさん:2008/09/08(月) 14:20:46
>>184
例えを用いずに話して相手が理解出来るなら最初っから躓いてないだろ。

186 :デフォルトの名無しさん:2008/09/08(月) 14:26:31
例えを用いずにうまく説明できないところがアヤシイw

187 :デフォルトの名無しさん:2008/09/08(月) 14:39:55
本当にわかっている人は例えなんか使わない。
実際にPGを組ませてビシビシしごく。
ついてこれない香具師は見捨てる。

188 :デフォルトの名無しさん:2008/09/08(月) 16:52:47
>>185-186
喩え話ってのはどーしたって誤謬があるわけで
「理解“した気に”させる」効果しかない。

189 :デフォルトの名無しさん:2008/09/08(月) 21:50:34
メモリ上にデータが配置されるイメージさえつかめば
ポインタ使ったプログラムの動きは見えてくるんだよな。

そんな低レベルなことまで意識しなきゃならないというのは、
教える側にするとちょっと面倒でもある。

190 :デフォルトの名無しさん:2008/09/08(月) 21:52:10
ポインタ自体が低レベルな操作のためにあるもんだし

191 :デフォルトの名無しさん:2008/09/08(月) 22:12:10
なんかもー面倒くさいからポインタ禁止にしてこんな感じのクラス使おうよw

template<classT>
class Shortcut
{
 T *pTarget;

 // ショートカットを設定
 void SetShortcut( T &target ) { pTarget = ⌖ }

 // ショートカット先にデータを設定
 void SetData( T data ) { *pTarget = data; }
};

名前は>>179から頂きますた。

192 :デフォルトの名無しさん:2008/09/08(月) 22:15:31
そしてスマポへ…

193 :デフォルトの名無しさん:2008/09/08(月) 22:18:25
それoperator=とかoperator*とかoperator->とか実装すると便利だよきっとたぶんおそらく

194 :デフォルトの名無しさん:2008/09/08(月) 22:22:03
C++使ってるとポインタ演算をしなくなるな

195 :デフォルトの名無しさん:2008/09/08(月) 22:23:43
STLは使わんの?



196 :デフォルトの名無しさん:2008/09/08(月) 22:25:11
アレは見た目が似てるだけか。スマソ。


197 :デフォルトの名無しさん:2008/09/08(月) 23:14:41
mplの
metafunc<type>もポインタっぽく思える
metafunc<type>::valueとかで参照できたりするし

198 :デフォルトの名無しさん:2008/09/08(月) 23:22:20
>>193
+とか-とかも定義しようぜ

199 :デフォルトの名無しさん:2008/09/08(月) 23:44:12
Cのポインタ演算子*が悪い。かけ算記号と同じなんだもの。
この点だけは、リッチー先生を殴る権利が俺たちにあると思うよ。
俺が言語設計者なら、Data_Pointed_by(ポインタ変数)にする。
あとポインタ変数の型をなくし、すべて1バイトを示すものとする。
ポインタ変数のインクリメント・デクリメントも1バイト単位。

200 :デフォルトの名無しさん:2008/09/08(月) 23:47:01
>>199
どうしてもポインタをモノにできなかった奴の定番台詞ですな

201 :デフォルトの名無しさん:2008/09/08(月) 23:57:39
>>199
それなんてCのご先祖様BCPL、特に後半。

202 :デフォルトの名無しさん:2008/09/08(月) 23:57:44
>>199
そんな糞設計の言語を誰が使うんだよw

203 :デフォルトの名無しさん:2008/09/08(月) 23:58:41
ポインタの概念を図で説明するときにアドレスの存在を明示しないやつがたまにいるんだよな。
四角から四角へ矢印を引いた図は書けるんだけど、アドレスの存在が意識されにくい図になってる。
つまりこんな図。

□→□

int aという変数にはaという値と&aという値があり、
int *pという変数にはpという値と&pという値と*pという値がある。

これらの5つの要素を図中に明示しないと上手な説明とはいえないね。




204 :デフォルトの名無しさん:2008/09/09(火) 02:04:43
初心者ですが教えてください。
ポインタ演算で型に応じてポインタが進むのは知っているのですが、
その「どの型ならいくつ進む」という情報は実行ファイル中にどういうふうに保存されているのでしょう?

205 :デフォルトの名無しさん:2008/09/09(火) 03:02:00
>>204
静的に決まる型を解釈して、そういう言うアセンブラコードに変換されてるんだよ
坊や。


206 :デフォルトの名無しさん:2008/09/09(火) 03:08:51
動的に決定する型はどうやって決定されるんだろうね。
ああ、CやC++じゃそんな芸当出来ないかw

207 :デフォルトの名無しさん:2008/09/09(火) 08:44:30
>>204
コンパイラが吐いたasm読めば分かるよ。
よく分からなかったら、型を変えて見比べてみる。

208 :デフォルトの名無しさん:2008/09/09(火) 09:41:45
>>203 ポインタの俺解釈いいかげんおなかいっぱい

209 :デフォルトの名無しさん:2008/09/09(火) 10:20:57
>>206
Cは兎も角、C++にはRTTIってもんがあるわけだが。

210 :デフォルトの名無しさん:2008/09/09(火) 10:53:06
C++のRTTIはデバッグ用途以外では要らない子

211 :デフォルトの名無しさん:2008/09/09(火) 23:25:55
>>210
いやいやdynamic_castはデバッグ用途ではないだろ。
しょっちゅう使うものでもないけれど。

212 :デフォルトの名無しさん:2008/09/10(水) 00:42:46
×dynamic_castでオブジェクトの型を判別し、そのオブジェクトのメンバ関数を呼び分ける
→わざわざ多態性のメリットを殺さずに、仮想関数で解決すべき。

○dynamic_castでオブジェクトの型を判別し、判別している側の振る舞いを変える
→これはあり得る。けど委譲で解決したいかな。



213 :デフォルトの名無しさん:2008/09/10(水) 01:52:31
それは、動的に判定されるというより、
予め考えられる型を全部網羅してコーディングしてるだけだしなぁ。
新たに組み込んだhogehogeクラスのポインタとか実装が無いと動かんだろ?
あ、仮想関数で呼んでもらえば自前で用意しておくだけで追加が簡単か/

214 :デフォルトの名無しさん:2008/09/11(木) 00:05:54
JavaやC#でこういう感じのコードに時々出食わす。
setObject(new Hoge);
//別のところ
Hoge h = (Hoge)getObject(); //戻り値の型はObject型
帰ってくるオブジェクトは絶対さっきsetObjectしたときの引数という場合。
もしこれがC++だったらboost::polymorphic_downcastの出番だな。

215 :デフォルトの名無しさん:2008/09/11(木) 14:58:51
>>214
インターフェースを利用できない理由があるの?

216 :デフォルトの名無しさん:2008/09/11(木) 20:59:10
C言語には文字列がないので文字列ポインタ作っちゃいました的ナ

217 :デフォルトの名無しさん:2008/09/11(木) 23:36:59
>>215
setObjectやgetObjectは既存のライブラリで、しかも標準だったり有名だったりして
自分が手を加えられるような存在ではないんだ。

218 :デフォルトの名無しさん:2008/09/12(金) 01:27:35
Cの文字列型は廃止の方向で…

219 :デフォルトの名無しさん:2008/09/12(金) 03:01:53
メモリモデルよくわからない

220 :デフォルトの名無しさん:2008/09/12(金) 03:16:36
プログラマにメモリを意識させる言語は糞。
Javaが理想に近いが、記述が冗長すぎてこれも結局は糞。
これからはロジック書きのみに集中できてシンプルな
記述で済む言語がトレンドになる。

221 :デフォルトの名無しさん:2008/09/12(金) 08:40:39
スクリプト系?

222 :デフォルトの名無しさん:2008/09/12(金) 09:00:57
ML系やLispのようなLL言語ですね
ロジックといえばprologやマイナーですがCoq, ETIも見逃せません

223 :デフォルトの名無しさん:2008/09/12(金) 11:33:37
>>220
バターナイフ振り回して「包丁は危険だから糞」って言ってる訳ですね、わかります

224 :デフォルトの名無しさん:2008/09/12(金) 11:53:19
プロセス空間とかよくわかんない

225 :デフォルトの名無しさん:2008/09/12(金) 12:06:38
糞かどうかはともかく、誰にでも向くものではないのは確かだね。
まあJavaでも十分メモリを意識すると思うが。

>>219
メモリモデルはポインタとかより遙かに悩ましいね。

226 :デフォルトの名無しさん:2008/09/12(金) 12:32:18
>>218
「文字列」などという型はありません。

227 :デフォルトの名無しさん:2008/09/12(金) 12:33:06
>>220
つ[COBOL]

228 :デフォルトの名無しさん:2008/09/12(金) 13:02:56
>>220
Haskellをどうぞ

229 :デフォルトの名無しさん:2008/10/04(土) 11:47:17
あげ

230 :デフォルトの名無しさん:2008/10/04(土) 12:01:50
char str1[] = "abcde";
char * str2 = "abcde";
>上と下は同じでどっちを使ってもいい。

これは間違い。str1は書き込みできるが、str2は書き込みができないことがある。


231 :デフォルトの名無しさん:2008/10/04(土) 12:19:38
>>230
どっちも書き込めないときがあるだろ。
パソコン上ではどちらも書き込めるが、
ROM化環境などではどちらも固定される事がある。

これらの最大の違いは、sizeof(); で返される値。

char str1[] = "abcde";
char * str2 = "abcde";

printf("%d¥n",sizeof(str1));
printf("%d¥n",sizeof(str2));
やってみそ


232 :デフォルトの名無しさん:2008/10/04(土) 12:28:25
噛み付かれた>>230が不憫でならない

233 :デフォルトの名無しさん:2008/10/04(土) 12:28:59
要はアドレスという概念がわかっているかどうか。
あとは書式の問題でなれだな。

てすぐ結論をだそうとする漏れorz..

234 :デフォルトの名無しさん:2008/10/04(土) 12:44:58
>>231
配列に書き込めないコンパイラがあるの?


235 :デフォルトの名無しさん:2008/10/04(土) 12:50:49
オプション次第では、str1も書き込みできないようにできるものがあるかもしれないが、
そんなこと言ったらきりないだろ。

str1にconstがついているなら文句なしに書き込み不可だけど。

236 :デフォルトの名無しさん:2008/10/04(土) 12:51:43
>>234
多分、配列自体に代入する式が評価中に存在すれば固定領域ではなく揮発領域に設定されるんだろうな。
まあ、ポインタという代物はその操作をコンパイラには分からせなくするチカラもある訳で、
配列で指定した領域にポインタ参照で書き込もうとしたら落ちるとかはあるよ。

237 :デフォルトの名無しさん:2008/10/04(土) 12:59:42
>>236
すまんが何をいってるのかさっぱりだ
バッググラウンドを簡単に説明してくれないか
○○と言う本やコンパイラのマニュアルに書いてあった、でもいいから

238 :デフォルトの名無しさん:2008/10/04(土) 13:14:21
>>237
「世間には色んなコンパイラがある」ってこと。

239 :デフォルトの名無しさん:2008/10/04(土) 13:18:31
char s[] = "abcde";

ポインタ経由だと、これに書き込めない環境があるってこと?
ないだろ。

240 :デフォルトの名無しさん:2008/10/04(土) 13:21:27
>>239
最適化されてなければな。
だからおまいの脳内環境だけで結論出すなよw

241 :デフォルトの名無しさん:2008/10/04(土) 13:23:08
最適化されたからって、書き込めなくなるのはおかしいだろ。

242 :デフォルトの名無しさん:2008/10/04(土) 13:23:55
ないってのは言いすぎだな。
ウンコな処理系ってよくあるから。

243 :デフォルトの名無しさん:2008/10/04(土) 13:26:29
処理系じゃなくって、コンパイラの問題なの。

244 :デフォルトの名無しさん:2008/10/04(土) 13:37:36
「処理系」ってコンパイラも含んでるだろ。ふつー。

245 :デフォルトの名無しさん:2008/10/04(土) 13:39:58
ああ、分野が違うとこうも話が噛み合ないという見本だな。

246 :デフォルトの名無しさん:2008/10/04(土) 13:44:29
知ったかでしゃべってるのを「分野の違い」にすんなよ。
>>239 が、ポインタ経由だと書き込めないってどんな処理系だよ。

247 :デフォルトの名無しさん:2008/10/04(土) 13:50:24
>>246
だからさ、世の中には色んなコンパイラがあって、色んな環境で色んなCPUが色んな場所で動いてるわけよ。
その全部のローカルな俺様コンパイラ的な物では定数は全部固定データなワケよ。
特に初期化宣言以降どこに右辺に現れない変数も固定な訳よ。 わかる?

248 :デフォルトの名無しさん:2008/10/04(土) 13:51:26
>>247
ああ、適正だ。
どこにも左辺に現れない変数な。

249 :デフォルトの名無しさん:2008/10/04(土) 13:55:33
>>247
定数を書き込み禁止領域に置くコンパイラってこと?
それごく普通のコンパイラじゃん
文字列リテラルを書き換えようとして落ちるのはANSI仕様上も問題ない

知ったか乙

250 :デフォルトの名無しさん:2008/10/04(土) 13:55:43
どうやら今日は誤字が多いのでこの辺で消える。

251 :デフォルトの名無しさん:2008/10/04(土) 13:56:24
というか日本語の上手な人か
言わんとすることはわかったよ

252 :デフォルトの名無しさん:2008/10/04(土) 13:57:51
>>247
おたくの「分野」の、どのコンパイラでそういう最適化をするのか書けばいっぱつで終了する話題だろ。


253 :デフォルトの名無しさん:2008/10/04(土) 13:59:13
>>249
だからさ、

char t[] = "abc";
t[0] = "0";

とかあれば、このtは書き換え出来る領域に"abc"をコピーしてくるけど、

char t[] = "abc";
char *p;
p = &t[1];
*p = "0";

とかすると、落ちるとか普通にある訳よ。


254 :デフォルトの名無しさん:2008/10/04(土) 14:02:56
まあ、コンパイラがANSIに沿ってないってオチなんてドコにでもあるわけで。
そんな事言ってちゃ、ここでマトモな議論が出来なくなるわけで。

255 :デフォルトの名無しさん:2008/10/04(土) 14:05:55
>>253
落ちるどころかコンパイルすら通らないだろうな

256 :デフォルトの名無しさん:2008/10/04(土) 14:06:21
>>253
ふつーにコンパイラのバグだよね。

257 :デフォルトの名無しさん:2008/10/04(土) 14:08:52
>>256
そだね。

258 :デフォルトの名無しさん:2008/10/04(土) 15:40:17
まぁ、組み込み系だろうな、そういうコンパイラがあるのは。
PICとかPICとか、あとはPICとか。

259 :デフォルトの名無しさん:2008/10/04(土) 16:33:17
>>231
> パソコン上ではどちらも書き込めるが、
> ROM化環境などではどちらも固定される事がある。
知ったか乙
汎用OS下でも処理系によって違うんだよ。
そもそもANSI読んだのか?

260 :デフォルトの名無しさん:2008/10/04(土) 16:37:03
>>258
PIC?あんなヘタレ石に組込みを代表されてたまるかいw

261 :デフォルトの名無しさん:2008/10/04(土) 16:38:32
>>259
処理系によって異なるのに、ANSI読んでも意味無いだろw

262 :デフォルトの名無しさん:2008/10/04(土) 16:47:22
>>261
規格で「パソコン上ではどちらも書き込める」ように定められてるかどうか、そうでないか確認するんだから、意味あるだろ。

263 :デフォルトの名無しさん:2008/10/04(土) 16:48:28
>>262
ANSIにそんな但し書きあるなら見てみるワ

264 :デフォルトの名無しさん:2008/10/04(土) 16:52:58
>>263
但し書きがないんなら「> パソコン上ではどちらも書き込めるが」ってのはウソってことか?

265 :デフォルトの名無しさん:2008/10/04(土) 16:55:31
>>264
それはWindows上のVCの実際の動きから書いてるから嘘じゃないだろ。

266 :デフォルトの名無しさん:2008/10/04(土) 17:05:00
>>265
べつに特定の環境の話はしてないだろ。
書き込める環境もあるし、書き込めないのもあるって話だから、>>231がウソってことになる。

267 :デフォルトの名無しさん:2008/10/04(土) 17:35:37
いつから汎用機がパソコンという名前になったんだろう? ? ?

268 :デフォルトの名無しさん:2008/10/04(土) 18:15:05
そもそもこの流れで「パソコン」って表現は意味が無いだろ。

269 :デフォルトの名無しさん:2008/10/05(日) 16:29:00
ポインタはヤバイぞ・・・
ポインタのポインタとか、
二次元配列のポインタを取る時に
= の右がconstだったりすると左が酷いことになる
まずそんなことはやらないとは思うけど

270 :デフォルトの名無しさん:2008/10/05(日) 17:05:49
そんなことやってもまあコンパイル時に警告かエラーだけどな。

271 :デフォルトの名無しさん:2008/10/05(日) 18:49:32
>>270
警告だったら無視する習慣があったら、実行時に死亡だね?

272 :デフォルトの名無しさん:2008/10/05(日) 22:45:27
警告って事は何かしら書き方間違えているわけで
無視しても問題ないものでもなるべく除去するよう心がけるべき

273 :デフォルトの名無しさん:2008/10/05(日) 22:46:27
main関数の引数を使ってませんよ的な警告も無視しちゃだめですか

274 :デフォルトの名無しさん:2008/10/05(日) 22:47:09
Visual C++で警告レベルW4にしてSTLを使ってみれば楽しいよ

275 :デフォルトの名無しさん:2008/10/05(日) 23:13:45
>>273
int main()でいいじゃない。
argvだけ使って、argcは使っていないというのなら、int main(int, char** argv)で。

276 :デフォルトの名無しさん:2008/10/10(金) 00:30:51
>>127
> 混乱のもとは、[]記号が、宣言、右辺値、左辺値、それぞれのケースで意味が微妙に違うところ
プリーズ詳しく


277 :デフォルトの名無しさん:2008/10/16(木) 15:38:48
>>253
誰か突っ込んでやれよ。。

278 :デフォルトの名無しさん:2008/10/16(木) 15:59:36
突っ込むのも面倒と思われるくらいに呆れられたんでしょ。
t[0] = "0"; とかありえないし。

279 :デフォルトの名無しさん:2008/10/17(金) 01:41:52
t[0] = '0'; じゃね?

280 :デフォルトの名無しさん:2008/10/17(金) 09:24:27
>>277
>>255 で既に。

281 :デフォルトの名無しさん:2008/10/19(日) 10:01:08
main(){
char *t[1];
t[0] = (char *)malloc(072);
t[0] = "0";
puts(t[0]);
}

282 :デフォルトの名無しさん:2008/10/19(日) 10:08:11
malloc いらんがな

283 :デフォルトの名無しさん:2008/10/19(日) 12:28:45
>>282
malloc無いとメモリリークしないだろ

284 :デフォルトの名無しさん:2008/10/20(月) 13:05:51
>>283
しないよ。直後にmain()から抜けているから。
それより、なんで58バイト確保するのかそっちが知りたい。

285 :デフォルトの名無しさん:2008/10/20(月) 13:58:56
三度の飯より072好きだからだろう。

286 :デフォルトの名無しさん:2008/10/20(月) 14:12:04
おまえらしってるか

円周率にはある言葉が隠されているということを!

円周率という永久に続く小数
3.1415926…

これの小数点第93299341桁目から先をみてほしい
…0721454525520877136375156…
最初の8文字に着目だ。
そう"07214545"とは「オナニーしこしこ」のことある。

これはどういうことだ?
神は我々に何を訴えようとしているんだ…

287 :デフォルトの名無しさん:2008/10/20(月) 14:19:28
わからないのことある。

288 :デフォルトの名無しさん:2008/10/20(月) 14:23:07
無理数なら、そんな数列はどれでも出現するわボケ

289 :デフォルトの名無しさん:2008/10/20(月) 16:21:49
どれでも? 無理数の定義からやり直せカス

290 :デフォルトの名無しさん:2008/10/20(月) 16:22:28
むりっす

291 :デフォルトの名無しさん:2008/10/21(火) 00:27:21
無理数だけに、むりっすうwww

292 :デフォルトの名無しさん:2008/10/21(火) 10:48:53
大事なことなので日をわけて2回言ったんですね。

293 :デフォルトの名無しさん:2008/11/03(月) 11:56:34
>>286
なに、オナニーで演習することが大事だといっているのです。簡単なことです。♂も♀も。

294 :デフォルトの名無しさん:2008/11/06(木) 02:43:45
ポインタで正整数しか指せない時代はもう終わり
そろそろ浮動小数アドレスとか複素数アドレスとか出てきてもいい頃
いやその前に負数アドレスが先か

295 :デフォルトの名無しさん:2008/11/06(木) 02:45:15
>>294
おまえはなにをいってるんだ?

296 :デフォルトの名無しさん:2008/11/06(木) 02:59:38
ネタが滑っただけ

297 :デフォルトの名無しさん:2008/11/06(木) 04:08:47
x64のアドレス空間なんか符号付き整数だといっても差支えないような構成に思える。

298 :デフォルトの名無しさん:2008/11/06(木) 11:32:02
その昔、8ビットCPUの時代にも最上位ビットでROM空間とRAM空間を区別するのはよくある手でしたが。

299 :デフォルトの名無しさん:2008/11/06(木) 12:42:45
>>298
それはROMとRAMを32KBずつ割り当ててるだけジャン
0000-7FFF : ROM
8000-FFFF : RAM

今見ると少ないメモリでよくやってたな


300 :デフォルトの名無しさん:2008/11/06(木) 13:31:51
ROMは下から使ってRAMは上から使うんだから、符号付整数として捉えてもいいじゃんw

301 :デフォルトの名無しさん:2008/11/06(木) 14:14:32
>>300
32KiB + 32KiB 以外の構成は思いつかないのかアホタレ。

302 :デフォルトの名無しさん:2008/11/06(木) 14:36:45
それ以外の構成でもスタックを最上位に配置する関係から、アドレス0から上下になるように配置するのが普通だと思うが。
アドレスバスをフルデコードしないでミラーイメージになっている場合もあるだろうけど。

303 :デフォルトの名無しさん:2008/11/06(木) 16:16:42
例えばRAM48Kだと0x0000〜0xBFFFなわけだが。

304 :デフォルトの名無しさん:2008/11/06(木) 17:01:51
>>303
素朴な疑問だけど、その環境で0c000h-0ffffhは何もない状態なの?
例えば8080やz80のようにリセット直後にはSPが0になるようなCPUだったら
SPを設定するまでスタックが使えなくて不便だと思うのだけど。

つーか、>302が想定している次元と>303が想定している次元が噛み合ってない希ガス。

305 :デフォルトの名無しさん:2008/11/06(木) 18:16:57
>>304
「符号付整数」だと捉えると、アドレス範囲が
 0x8000〜0xFFFF、0x0000〜0x7FFF となって
 非常に見づらくね?つか上下逆にならね?」
程度の主張。
そういえば (>>294 は知らんだろうが) ポインタが
{アドレス, バイト位置} だの {セグメント, オフセット} だのという
構造を持ってるてのは有り得る。

>素朴な疑問だけど、その環境で0c000h-0ffffhは何もない状態なの?
ROMがないなどとは一言も書いてないんだけど、何でそう思ったのか。
>8080やz80のようにリセット直後にはSPが0
PCも 0x0000。

306 :デフォルトの名無しさん:2008/11/12(水) 23:25:21
相対アドレスだって結局はどこかの物理メモリにマッピングされるだろ

307 :デフォルトの名無しさん:2008/11/13(木) 01:35:59
どうやっても、一意に区別出来る情報の形になるからデジタルなんですよ。

308 :デフォルトの名無しさん:2008/11/14(金) 19:05:44
かならずしも物理メモリにマッピングされてるとは限らないだろ。
I/Oだったり、スワップアウトされてたり。

309 :デフォルトの名無しさん:2008/11/15(土) 01:37:09
論理メモリーには物理メモリーにマッピングされていない闇の空間がある。

310 :デフォルトの名無しさん:2009/01/23(金) 12:26:31
ポインタってアドレス型とかいう名前にしとけばよかったのに

311 :デフォルトの名無しさん:2009/01/23(金) 14:21:34
アドレスという概念を抽象化したかったのでは?

312 :デフォルトの名無しさん:2009/01/23(金) 14:46:00
実際、アドレスひとつに1バイト割り当てられてたわけじゃないし。

313 :デフォルトの名無しさん:2009/01/23(金) 17:24:59
ポインタは別に難しくない。
ポインタが難しいと勘違いされているのは、Cでは「配列のサイズチェックをしない」というポリシーがある
ために、バグで配列の範囲外をポイントしてしまったとき、デバッグが難しくなるからだ。
また、1個のオブジェクトへのポインタも、オブジェクトの配列へのポインタも、同じに扱われることも
(これも、大きな意味では「サイズチェックをしない」ことの弊害だ)難しさを倍加している。
もしこれが、「オブジェクトへの参照」であり、更に、「確保されたオブジェクト範囲外をアクセスすると
アサーションが発生する」という仕様であれば、ポインタなんて全然難しくない。
結局ポインタのせいにしているだけで、ポインタが難しいと思っている人は、
Cの「出来る限り高速に、出来る限りチェックは省き、プログラマは完全無欠であるべき」
というポリシーに付いていけないだけだと思う。


314 :デフォルトの名無しさん:2009/01/23(金) 20:48:11
付いていけないから難しいと言うわけで

315 :デフォルトの名無しさん:2009/01/24(土) 00:09:38
ポインターってのは、Cが、アセンブラのへのラッパー言語だと割り切れる奴しか扱えないんだよ。

316 :デフォルトの名無しさん:2009/01/24(土) 00:25:31
右辺値と左辺値の場合で参照レベルがひとつずれているように見ようと思えば見えるから、
そう見えちゃうとハマるんじゃねーの。

int a, b;
a=b;
aは変数、bは変数の中に入っている値

int a, *b;
a=*b;
*bは bという場所に入っている数値をアドレスとしてみて、そのアドレスの中にある値
*b=a;
*bはbという場所に入っている数値をアドレスとしてみたその場所で、その中にaの中の値を入れる

てな感じで。
左辺値だと代入する場所、右辺値だとその場所にある値、と参照レベルが一段変わる(用に見えなくもない)

shellだとaに値を代入するときはa=b、値を参照するときは$aで、aは変数、$をつけるとその値、とまあ参照レベルが統一されている。

と、ポインタわからんという人がなぜ出るのかを考えていたらそういうこともあるんじゃねーのかな、という結論に至った。

317 :デフォルトの名無しさん:2009/01/26(月) 11:28:07
>>316
それは、理解できる人間の理屈。理解できない人はそんなレベルで理解できていないわけではない。
ある意味、虫食い算は計算できるのに方程式が解けないと嘆く中学生のようなもんだ。

318 :デフォルトの名無しさん:2009/02/04(水) 11:04:42
ポインタの記号ってドルマークの方が良かったと思う
アスタリスクだと掛け算とごっちゃになるから嫌いなんだよ

319 :デフォルトの名無しさん:2009/02/04(水) 11:31:18
単項演算子が二項演算子とごっちゃになるとは
是如何に。

320 :デフォルトの名無しさん:2009/02/04(水) 14:20:23
a*=b と a=*b とか
a**b とかじゃないの?

321 :デフォルトの名無しさん:2009/02/04(水) 18:13:00
a+++++b ?

322 :デフォルトの名無しさん:2009/02/04(水) 21:24:04
*a*b

323 :デフォルトの名無しさん:2009/02/05(木) 08:40:05
>>318
>>6

>>320
大昔のHP-Cで =* という独自拡張された演算子
(*= と同じなんだけど、式の値は演算“前”の左辺) があって
a=*b なんて書くと「ambiguous だぜ。演算子の後ろに空白入れな。」
という警告をくらったのを思い出した。
bがポインタかどうかで判断つくだろうに。
つか、誰が得するんだあの拡張。

324 :デフォルトの名無しさん:2009/02/05(木) 11:58:49
>>323
無能なプログラマほど、空白を詰めて書きたがる。
で、そういう馬鹿なミスをやって人件費を無駄遣い。
それからな、=* の類は「独自拡張」じゃないぞ。

325 :デフォルトの名無しさん:2009/02/05(木) 12:33:45
>>324
>無能なプログラマほど、空白を詰めて書きたがる。
for 内部の代入は空白あけないぞスタイルだったもんで。

>で、そういう馬鹿なミスをやって人件費を無駄遣い。
コンパイル時に警告出てんだから
数秒以内で修正可能なレベルだろに。
大袈裟だな君は。

> =* の類は「独自拡張」じゃないぞ。
mjsk

326 :デフォルトの名無しさん:2009/02/05(木) 13:42:15
> > =* の類は「独自拡張」じゃないぞ。
> mjsk
こんなことも知らん割には、ずいぶん上から目線だな。

327 :デフォルトの名無しさん:2009/02/05(木) 14:04:34
>>326
>こんなことも知らん

>ずいぶん上から目線だな。
に、なんの相関が?

つか、>>325 程度で「上から目線」て
どんだけ繊細なんだ。
>>326 みたいな言われ方したら
ショックで死ぬんじゃないの?
ご自愛下さい。

328 :327:2009/02/05(木) 14:05:22
×>>326 みたいな
>>324 みたいな

329 :デフォルトの名無しさん:2009/02/05(木) 18:19:53
C++のイテレータってのはポインタ使って動いてるんだよな?

330 :デフォルトの名無しさん:2009/02/05(木) 18:26:01
特にvectorとかでそういう実装はあり得る。
でも、listなど中の実装もそうであるとは限らない。

もちろん、使う側の見かけはもちろんポインタの模倣だけど。

331 :デフォルトの名無しさん:2009/02/05(木) 20:35:39
ほうほう,ありがと

332 :デフォルトの名無しさん:2009/02/05(木) 22:35:51
vector は VC++6 あたりではポインタだったような気がする。
今はポインタで実装してる方が珍しいと思うが。

333 :デフォルトの名無しさん:2009/02/07(土) 12:47:03
if for 変数 なんかの説明と比べればポインタは難しいよ
一度、誰かに教えようとすれば説明のし辛さが解る

334 :デフォルトの名無しさん:2009/02/07(土) 13:46:19
文字と文字列の扱いの違いから説明してるけどな
まぁ配列の扱い方とポインタの扱いがちょっと似てるからだけど
入りとしてはやさしいとおもってやってる

335 :デフォルトの名無しさん:2009/02/12(木) 13:08:00
操作的意味論を使ってポインタを理解したい

336 :デフォルトの名無しさん:2009/02/12(木) 23:05:20
ポインタの理解度段階付け

0.javaマンセー
1.ポインタを使ったプログラムが読める
2.ポインタの使い方が解る。
3.ポインタを効果的に使える。

337 :デフォルトの名無しさん:2009/02/12(木) 23:08:15
ex.ポインタを誰でも分かるように説明できる

338 :デフォルトの名無しさん:2009/02/12(木) 23:13:48
間接参照のセマンティクス

339 :デフォルトの名無しさん:2009/02/13(金) 01:19:03
#include <stdio.h>
#include <stdlib.h>

int main(int ac, char *av[]){
FILE *write = fopen("test.txt", "w");
FILE *read = fopen("08112801.L81", "rb");
while(!feof(read)){
int j;
for(j = 0; j < 4096; j++){
unsigned short ch1, ch2;
fread(&ch1, 2, 1, read);
fread(&ch2, 2, 1, read);
fprintf(write, "%u %u\n", ch1, ch2);
}
}
fclose(read);
fclose(write);
return 0;
}


340 :デフォルトの名無しさん:2009/02/13(金) 11:12:02
>>337
猿や犬、またはそれに類する人間には
どう頑張ったところで理解できません。

341 :デフォルトの名無しさん:2009/02/18(水) 01:25:42
476氏がすごいことになってます

〜はじまり〜
476 名前:デフォルトの名無しさん[] 投稿日:2009/02/16(月) 11:13:14
 2次元配列のキャストとかがわかんないです。
 ここでつまずく。

〜中略〜

643 名前:476[] 投稿日:2009/02/18(水) 00:33:00 (略あり)
 int a[10]:
 int *p;
 int p=a &aでもなくていいです a(名前)は先頭のアドレスをあらわします
 一次元までわかってるんです
>その例で&aと書いたら何になるか答えられるか?
649 名前:476[] 投稿日:2009/02/18(水) 00:37:14
 &aだとa[0]だと思います
 もう教えてください
 どうすれば(*p)[5]と(float *)までたどり着けるか教えてください
 脳みそ取り替えたいくらいです
 脳みそ取り替えてください本当に

342 :デフォルトの名無しさん:2009/02/18(水) 01:26:20
476氏 その2

654 名前:476[] 投稿日:2009/02/18(水) 00:42:47
 641さん
 よくある本の最初に書いてあるポインタくらいならわかります
 int x;
 printf("%p",&x);など 一次元配列のポインタなどわかります
 
 ですがある日突然 
 float balance[10][5];
 float *p;
 p=(float *) balance;
 *(p+(3+5)+1)という最悪のパターンにであいました
 独習Cですんなりいってたんですが165ページという最悪のページでモヤモヤが一気にでしました
 キャストは前のページにでてきて doubleをint型に変換する簡単なものでした
 double i=100.2;
 printf("%d",(int)i);みたいな簡単なキャスト
 ですがポインタのキャストという説明も無くそんなのがでました
 (float *)という意味深な物が とまどいました
 調べました よくわかりません
 float[n]とかいわれてもわかりません nっていうのはfloat[1]とかfloat[2]ですか?
 さっぱりわかりません脳みそとりかえたいくらいです 助けてください


343 :デフォルトの名無しさん:2009/02/18(水) 01:27:29

660 名前:デフォルトの名無しさん[] 投稿日:2009/02/18(水) 00:57:33
>>656
この問題分かるか?ポインタがきちんと理解できていれば分かるだろう。

long x;
short y[5] = {1,2,3,4,5};
x = (long) y;
x++;
printf("%d\n",*((int*)x));

このコードを実行した際に表示される数値は何か予想せよ。
(理由とともに。なお、longは8バイト、intは4バイト、shortは2バイトとする)

661 名前:476[] 投稿日:2009/02/18(水) 00:57:39
何故皆さんそんなわかるんですか?
おかしすぎです
なにやってたんですか
私はもう寝ます
明日もまた質問するのでよろしくお願いします
この問題が解消されないとむかついてストレスたまります


662 名前:デフォルトの名無しさん[sage] 投稿日:2009/02/18(水) 00:59:37
>>660
javaに毒されすぎじゃないか?

663 名前:デフォルトの名無しさん[sage] 投稿日:2009/02/18(水) 00:59:47
>>654の文章がひどいと思ったが、
>>661は、もう寝たか?

344 :デフォルトの名無しさん:2009/02/18(水) 02:00:58
コピペにマジレスしてみるが、

ポインタをきちんと分かってる人は、こんな不可解なポインタの使い方はしないな。

345 :デフォルトの名無しさん:2009/02/20(金) 01:47:12
しなくてもいいけど読めないならやり直せ
そういう人がC使うと危ない

346 :デフォルトの名無しさん:2009/02/20(金) 02:07:32
エンディアン、ウソつかない

347 :デフォルトの名無しさん:2009/02/20(金) 22:34:09
LLP64環境でやったらマジ脂肪だな

348 :デフォルトの名無しさん:2009/02/22(日) 12:39:43
longは8バイトって但し書きがあるじゃん

79 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)