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バイトって但し書きがあるじゃん

349 :デフォルトの名無しさん:2009/04/11(土) 17:28:18
こやつめw

350 :デフォルトの名無しさん:2009/07/02(木) 06:59:02
>>343まったくわからない

351 :デフォルトの名無しさん:2009/07/02(木) 10:13:40
>>350
まあ、規格上はそれが正解。

352 :デフォルトの名無しさん:2009/07/02(木) 15:50:52
質問内容は「予想」なんだけどな

353 :デフォルトの名無しさん:2009/07/03(金) 00:48:58
ミドルエンディアンの場合も想定してはじめて満点とか

354 :デフォルトの名無しさん:2009/07/11(土) 19:10:35
>>352
だから「この設問の条件では予測不可能」という回答なんだろ

355 :デフォルトの名無しさん:2009/07/12(日) 14:19:04
>>354
キミは0点

356 :デフォルトの名無しさん:2009/07/13(月) 09:49:40
寧ろこっちから「この問題はデキが悪い。0点」と言い放つ。

357 :デフォルトの名無しさん:2009/07/13(月) 15:40:13
そうやって逃げてばかりいるから、そんななんだよ

358 :デフォルトの名無しさん:2009/07/13(月) 17:40:34
どんなだw

359 :デフォルトの名無しさん:2009/07/13(月) 18:33:36
>>346って答えておけばいいんだろ。
これ言われてピンとこなかったら出題者がアホ

360 :デフォルトの名無しさん:2009/07/14(火) 11:28:38
「予想せよ」だから、ありそうな順にいくつか答えるって手もあるのかな?


361 :デフォルトの名無しさん:2009/08/26(水) 03:09:13
ポインタなんてbrainf*ck使えばわかるよ

362 :デフォルトの名無しさん:2009/09/01(火) 02:43:45
超初心者の質問ですが、いいですか?

int v,*po;

po=&v;

*po=300;

のように、ポインタ変数poが指す内容は変数vのアドレスである、ということですが、

char *jk;

jk="jyosikousei";


のように、ポインタの中に文字列を直接入れられるのはどうしてですか?

この場合、ポインタ変数jkは'j'の文字が格納されているアドレスを指しているということでしょうが、なぜそこに文字列"jyosikousei"を直接代入できるんですか?




363 :デフォルトの名無しさん:2009/09/01(火) 02:45:34
'j'の文字が格納されているアドレスの先頭、でした

364 :デフォルトの名無しさん:2009/09/01(火) 06:50:59
>>362
文字列は代入されてない
"jyosikousei"がchar*型だからcharポインタが代入されてる


365 :デフォルトの名無しさん:2009/09/01(火) 07:09:03
>>364

つまり、
jk="jyosikousei";
という文によって、jkに'j'の先頭アドレスが代入されているということでしょうか?

とすると、'j'の先頭1バイトが格納されている変数が宣言されていないのに、jkにアドレスが代入されるというのはおかしくないですか?

int *i;

i=100;

だと、iがどの変数のアドレスを指しているか決定されていないからNGでしょう。

どうしてchar型のポインタ変数にかぎり、直接文字列を代入する文を書けるのでしょうか?

366 :デフォルトの名無しさん:2009/09/01(火) 09:07:49
"hogehoge" と書くと、プログラムファイルのどこかにその文字列をコンパイラが置いてくれるので
その先頭のアドレスが帰ってくると思えばよい
100 とかの場合はそうならない(アドレスが存在しない)のでダメ

あと "jyo" というローマ字はヘボン式としても訓令式としても正しくない

367 :デフォルトの名無しさん:2009/09/01(火) 11:18:32
>あと "jyo" というローマ字はヘボン式としても訓令式としても正しくない
しかし、一般に流布している。

368 :デフォルトの名無しさん:2009/09/01(火) 11:21:02
スレタイに沿うなら、>>362 に対しては
「なんでそんなことも判らんのか判らん」
で終わりなのに、なんて親切な奴だ。惚れそう。

369 :デフォルトの名無しさん:2009/09/01(火) 11:21:15
>>367
言い訳すんな無能

370 :デフォルトの名無しさん:2009/09/01(火) 12:21:45
>>369
私は突っ込みを入れただけだ。>362なんかと一緒にするな。

371 :デフォルトの名無しさん:2009/09/01(火) 15:25:18
Cのポインタの難しい(かつ便利)なところは、こんなふうに1個のオブジェクトへのポインタなのか、
オブジェクトの配列へのポインタなのか、区別がつかないところなのだなあ。詠嘆調。


372 :デフォルトの名無しさん:2009/09/01(火) 19:05:30
char (*a)[2] ; /* 配列へのポインタ とかいってみる いや、言ってることは解ってるけど*/

373 :デフォルトの名無しさん:2009/09/02(水) 00:21:58
>>365
>int *i;
>i=100;
>だと、iがどの変数のアドレスを指しているか決定されていないからNGでしょう

いいえ
どの変数のアドレスを指しているか決定されていないからNGなのは
*i = 〜; であって i = 〜; ではありません
同様に *jk = 〜; はダメですが jk = 〜; は問題ない

374 :デフォルトの名無しさん:2009/09/02(水) 09:30:52
int *i;
i=100;
これはポインタ指定だからオK。

int *i;
*i=100;
これは実数指定だが、どこのポインタに? って事でアウト。

って事だぁね

375 :デフォルトの名無しさん:2009/09/02(水) 10:41:18
i = (int*)100;
と書いて欲しい


376 :デフォルトの名無しさん:2009/09/04(金) 01:04:04
>>371
区別がつく必要ある?

377 :デフォルトの名無しさん:2009/09/04(金) 11:10:01
区別がないから初心者には難しいんだよなって言ってるのがわからんのかマヌケ

378 :デフォルトの名無しさん:2009/09/06(日) 13:33:14
マヌケはお前だ。

質問は
「区別がつく?」
ではなく
「区別がつく必要ある?」
だろ。

必要性と可能性の違いもわからんのか。

379 :デフォルトの名無しさん:2009/09/06(日) 13:58:12
二日も考えてその程度のレスしか出来んとは気の毒なアタマだな(プ

380 :デフォルトの名無しさん:2009/09/06(日) 16:10:58
区別をしないというのがC言語の(設計者の)選択。

381 :デフォルトの名無しさん:2009/09/06(日) 22:28:32
煽りはともかくとして、結局どういう風に難しいのか一言も言えてないじゃん。

382 :デフォルトの名無しさん:2009/09/07(月) 14:58:57
難しいと思うのは本人のセンスのせいで、
ポインタのせいでは無い。

383 :デフォルトの名無しさん:2009/09/07(月) 17:40:52
配列名の値がアドレスになるのがわかりにくいというか、誤解の元になってるとは思う。
それが難しいかどうかは知らん。何でそうなるのかぐらいわかれとも思うが。

384 :デフォルトの名無しさん:2009/09/08(火) 10:57:11
○記号の問題
 *, &, などの変てこな記号が入り乱れ、学習者にとっては「うかつに近づくな」気配がぷんぷんする。
○配列の問題
 int* p; としたpが1個のオブジェクトを指しているのか、配列のアドレスを指しているのか区別が無い。
 その「区別が無い」という概念を理解することが重要なのに、大抵の教科書には
 表面的な「アドレスである」という表記しかないので混乱の元になっている。
○バグりやすい問題
 ポインタはオブジェクトを指してこそ意味があるのだが、cでは文法上オブジェクトの範囲外でも
 平気でアクセス出来てしまう。例えばchar buf[256];としたbufをサブルーチンに渡し、buf[800] = 'x';
 とか出来ちゃう。そしてバグる。こういう「他の(高級)言語では有り得ないバグ」が難しいと思わせる原因。

385 :デフォルトの名無しさん:2009/09/08(火) 11:06:01
プログラミングや計算機の初心者には、
うかつに近づかないでほしい。

386 :デフォルトの名無しさん:2009/09/08(火) 13:04:50
オブジェクトじゃなくて、メソッドを指してるんじゃね?


387 :デフォルトの名無しさん:2009/09/08(火) 14:50:07
誤爆?

388 :デフォルトの名無しさん:2009/09/08(火) 15:26:57
記号の問題に関しては、初心者は見よう見まねでperlいじったりするみたいだが。

389 :デフォルトの名無しさん:2009/09/08(火) 15:27:27
あー、perl自体じゃないよ。スクリプトね

390 :デフォルトの名無しさん:2009/09/08(火) 20:36:10
>>384
2項目目の意味がよくわからないな。
ポインタはアドレスを指すだけだろ。
なんだよ「区別」って。

391 :デフォルトの名無しさん:2009/09/09(水) 10:59:59
>アドレスを指す

392 :デフォルトの名無しさん:2009/09/11(金) 16:47:33
とりあえず動かしたくないポインタは*constにすりゃいいんじゃね

393 :デフォルトの名無しさん:2010/01/07(木) 19:05:12
どうしてポインタは*を選んだのだろうか
$でも良かったでしょ

394 :デフォルトの名無しさん:2010/01/07(木) 19:31:33
ポインタに1足したら、2byteとか4byteとか進む?
ポインタってアドレスなんだろ?
そんなもん1進むに決まってるんじゃないのか?

395 :デフォルトの名無しさん:2010/01/07(木) 20:05:12
ポインタには、どこを指してるかと指してるものの型の2つの情報がある。
後者を説明してない解説は結構多い。

396 :デフォルトの名無しさん:2010/01/08(金) 06:38:25
>>394
ポインタはアドレスではないかも知れない。
特に、アドレスがバイト単位にふられてない場合は確実に。
今時あるのかどうか知らんが。

397 :デフォルトの名無しさん:2010/01/08(金) 14:10:51
>>55
禿しく同意。
ここまでアナルが出てないってどういうことだよな


398 :デフォルトの名無しさん:2010/01/16(土) 02:47:52


   *

399 :デフォルトの名無しさん:2010/01/16(土) 22:17:44
>>394
たとえば、32bit整数型は1byte(8byte)では収まらない。4byte(32bit)必要だよな?だから4byteずつ進むのは間違いではないよ。
あとはハードウェアの都合という面もある。「アドレス パディング」や「アドレス アライメント」で調べるとヒントが得られるかと思うよ。

それでも解らないならオープンソースのコンパイラを解析するしかないんじゃないかと。

400 :デフォルトの名無しさん:2010/01/17(日) 12:39:40
もしかして8bit

401 :デフォルトの名無しさん:2010/01/17(日) 13:55:11
ポインタがそういう仕様だ、ってだけだろ。

402 :デフォルトの名無しさん:2010/01/17(日) 15:51:54
ポインタが指しているのは、アドレスじゃなくオブジェクト


403 :デフォルトの名無しさん:2010/01/17(日) 21:03:52
>>399
>たとえば、32bit整数型は1byte(8byte)では収まらない。4byte(32bit)必要だよな?だから4byteずつ進むのは間違いではないよ
うそはいかん。ポインタへのポインタだったら4バイトずつ進むが、型のサイズ分のバイト数がすすむ。
つまり、sizeof 型 だけ進む。 なぜかって?そのほうが都合がいいから。

404 :デフォルトの名無しさん:2010/01/22(金) 14:23:05
だから、ポインタが指しているのは、アドレスじゃなくオブジェクト
ポインタを1つ進めるということは、次のオブジェクトを指すというだけの話

アドレスが○○バイト進むというのは、ポインタが次のオブジェクトを指したという結果であって、ポインタの理解としては正しくないと思うよ


405 :デフォルトの名無しさん:2010/01/23(土) 09:04:53
>>404
なるほど。たしかにそう考えるとわかりやすいかも。

406 :デフォルトの名無しさん:2010/01/24(日) 17:31:42
そもそも配列概念の実装がポインタ演算なんだから

407 :デフォルトの名無しさん:2010/01/24(日) 18:23:13
>>406
その言い方だと、Cにとって関数の実装だってポインタじゃん


408 :デフォルトの名無しさん:2010/01/24(日) 22:20:39
>>407
お前が何を言っているのかわからねー

409 :デフォルトの名無しさん:2010/01/24(日) 22:26:45
古い情報だけど、ちょとここに置いときますね。
http://www.kouno.jp/home/c_faq/c6.html

410 :デフォルトの名無しさん:2010/01/24(日) 23:23:38
>>408
HRESULT (WINAPI *func)(HTHEME);
func = (HRESULT (WINAPI *)(HTHEME))::GetProcAddress(m_hLibMod, "CloseThemeData");
if (func) return func(m_hTheme);
return NULL;

って例もあるってことだろ


411 :デフォルトの名無しさん:2010/01/25(月) 01:00:03
>>410
そりゃ関数ポインタであって
// 外部リンケージの実装上、間接呼び出しになるものを除いて
通常の関数のどの辺がポインタなのかと問うているんだが。

412 :デフォルトの名無しさん:2010/01/25(月) 19:02:00
>>411
配列をポインタだと言うなら、関数も単にアドレスをコールしてるだけの代物だろう
配列概念がポインタだとか言う乱暴な話をすんなってこった


413 :デフォルトの名無しさん:2010/02/08(月) 09:05:06
ポインタが難しいというより文法が混乱の元。
ひとつの変数でアドレスと示す値の2つが出てくるからいけない。

int *sex;
static cinco = 072;
sex = &cinco;
cinco = (int)sex;//アドレス
cinco = (int)&sex;//ポインタのポインタ
cinco = *sex;//ポイッタが示す値

414 :デフォルトの名無しさん:2010/02/08(月) 09:26:55
ひどいコードだ

415 :デフォルトの名無しさん:2010/02/09(火) 10:09:34
それじゃただのオナニーだ

416 :デフォルトの名無しさん:2010/02/09(火) 14:28:02
いやー、なんだ、その

僕は初めてマックのプログラムを作った時、
ポインタのポインタ、というのがあまりにも便利すぎて衝撃を受けたけどな。

417 :デフォルトの名無しさん:2010/02/09(火) 14:31:04
ハンドルか

418 :デフォルトの名無しさん:2010/02/09(火) 14:48:34
>>417
WinNT.h(344)
typedef void *HANDLE;

無知哀れ

419 :デフォルトの名無しさん:2010/02/09(火) 14:53:40
ハンドルなんて、ポインタの配列のインデックスだったり色々。

420 :デフォルトの名無しさん:2010/02/09(火) 15:16:15
>>418
マックだと書いてるだろ、アホ

421 :デフォルトの名無しさん:2010/02/09(火) 15:21:50
実際、昔のMacとか16bitWindowsの頃は、メモリ配置がしょっちゅう動いてたから
ポインタのポインタを使わざるを得なかったな。
x386でCPUがサポートしたからこの概念も意味が薄れたが

422 :デフォルトの名無しさん:2010/02/09(火) 15:50:18
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。

これ、なんか違わなかったけ

423 :デフォルトの名無しさん:2010/02/09(火) 16:24:58
>>3以降しばらくその話なのにおまいときたら

424 :デフォルトの名無しさん:2010/02/09(火) 18:58:46
>>422
用途によるだろ
ただ表示させるだけならどっちでもいいし

425 :デフォルトの名無しさん:2010/02/09(火) 19:59:11
なんか違うじゃなく、全然違う

上は、文字列のポインター
下は、文字列定数のポインター

読めるから書けるわけではない...


426 :デフォルトの名無しさん:2010/02/09(火) 23:12:17
初心者には配列とポインタが明示的に区別されるDelphiを使わせるべき

427 :デフォルトの名無しさん:2010/02/10(水) 04:28:26
char str1[] = "abcde";
char * str2 = "abcde";

printf("%d,%d\n",sizeof(str1),sizeof(str2));  // 6,4

str1[0]='x';
printf(str1);  // xbcde

str2[0]='x'; // 以下、エラー
printf(str2);

428 :デフォルトの名無しさん:2010/02/10(水) 06:16:18
>>427
以下エラー、の部分は、処理系によってはエラーにならない。
こっちの方がいい。

str2 = "bcdef";
printf(str2); // bcdef

str1 = "bcdef"; //エラー
printf(str1);

429 :デフォルトの名無しさん:2010/02/10(水) 06:40:59
>>428
>以下エラー、の部分は、処理系によってはエラーにならない。
警告ならまだしも、エラーになるような標準から外れた処理系は嫌だな。

430 :デフォルトの名無しさん:2010/02/10(水) 08:14:02
>>429
コンパイルエラーじゃなくて実行時エラーのことだろ。
わざわざ以下、エラーって変な言葉で書いてるんだし。

431 :デフォルトの名無しさん:2010/02/11(木) 10:06:25
コンパイラー通って実行でエラーって 最悪じゃん

432 :デフォルトの名無しさん:2010/02/11(木) 10:42:31
str2は、定数へのポインターになっているが、ポインターの定義は定数になっていないからコンパイルエラーは出ねぇよ

だからと言って、プログラマは、str2の示すメモリ領域が自由に読み書きできると期待してはいけない


433 :デフォルトの名無しさん:2010/02/11(木) 10:59:54
const char * const str

434 :デフォルトの名無しさん:2010/02/11(木) 11:44:56
実行時に例外なりプロセス異常終了なりするのは
あんまり「エラー」とは言わないと思うんだが。まあいいや。

>>431
阿呆ですか?

435 :デフォルトの名無しさん:2010/02/11(木) 19:08:39
>>413
そういう文字通りのポインタという意味では難しいところは何もないよ
たとえばわざわざ&でアドレス書いて*で参照するだけなら誰でもわかる

問題は、領域が何指してるのかわからなくなるとか
上に出てた文字定数へのポインタなんか序の口だが
表記的にわかりにくいとかそういう副次的な面

436 :デフォルトの名無しさん:2010/02/13(土) 10:21:14
結局C言語の仕様が悪い。



437 :デフォルトの名無しさん:2010/02/13(土) 10:38:00
ポインタが難しいというより
ポインタを難しいと脅かしたり、有用な使い道を教えない(教えられない)
クソ本、クソサイトが跋扈していることが理解できない

438 :デフォルトの名無しさん:2010/02/13(土) 13:07:44
実際難しいだろ。
newしたポインタをうっかりコピーして、両方でdeleteしたり、
配列の先頭アドレスを渡すと渡した先ではポインタになって、
配列のサイズがわからないからサイズを超えてアクセスしたり、
1個のオブジェクトへのポインタなのか配列へのポインタなのか
区別がつかないからバグの元になったり。
ポインタでなく参照にすれば、いくつかの難しさは取り除けたはずだが、
70年代の言語にそれを求めるのは酷というものだ。
(当時のCPUでの)現実的なコンパイル時間という制約もあるし。

439 :デフォルトの名無しさん:2010/02/13(土) 13:26:24
ポインタを理解するためにはオブジェクト指向を理解しないとね
でも、C++を始めるなら、Cでポインタ位は覚えてないと難しいよねwwwwww


440 :デフォルトの名無しさん:2010/02/13(土) 23:35:19
>ポインタを理解するためにはオブジェクト指向を理解しないとね
どうして?


441 :デフォルトの名無しさん:2010/02/14(日) 09:53:55
簡単なので良いからアセンブラやるのが
遠回りかもしれないけど良いと思うよ。

442 :デフォルトの名無しさん:2010/02/14(日) 10:02:41
C。C++でええやん。
なんでわざわざポインタのためだけに他の言語に手をだすのか・

>>441
Brainfuck

443 :デフォルトの名無しさん:2010/02/14(日) 10:11:12
>>440
ポインタが指しているものが、アドレスではなくオブジェクトだから

で、オブジェクトって何ぞやってのは、オブジェクト指向を覚えれば分かるよ

444 :デフォルトの名無しさん:2010/02/14(日) 10:14:24
オブジェクト指向のオブジェクトと、Cとかでいうオブジェクトを同一視するの?

445 :デフォルトの名無しさん:2010/02/14(日) 10:24:07
>>444
どっか、違うの?
違うと言うなら詳細に説明してほしいねぇ

446 :デフォルトの名無しさん:2010/02/14(日) 10:28:01
オブジェクト指向のオブジェクトは概念、仕様、実装という3つのレイヤーを含むけど
Cとかでいうオブジェクトは実装レベルのオブジェクトだけを挿す

参考:
デザインパターンとともに学ぶオブジェクト指向のこころ (Software patterns series): アラン・シャロウェイ, ジェームズ・R・トロット, 村上 雅章:

447 :デフォルトの名無しさん:2010/02/14(日) 10:36:48
バカがバカに答えるからこうなる。。。
Cのオブジェクトとは、名前付きのメモリ領域のこと。

448 :デフォルトの名無しさん:2010/02/14(日) 10:40:06
その定義のソースキボンヌ

449 :デフォルトの名無しさん:2010/02/14(日) 10:43:05
>>448
K&R 2nd

450 :デフォルトの名無しさん:2010/02/14(日) 10:47:49
thx

451 :デフォルトの名無しさん:2010/02/14(日) 10:47:54
ANSI Cの定義(Definitions of terms)を読めば書いてある。

452 :デフォルトの名無しさん:2010/02/14(日) 10:52:24
thx

453 :デフォルトの名無しさん:2010/02/14(日) 10:54:26
ちょっwwwww
> Cのオブジェクトとは、名前付きのメモリ領域のこと。
って、C++のオブジェクトは?

オブジェクト指向だろうが、そうでなかろうが、オブジェクトってのは
「コンピューター内で有意なデータの集まり」だろ
そのオブジェクトをいかに合理的に使うかという方法論が、構造化プログラミングであり、オブジェクト指向じゃん


454 :デフォルトの名無しさん:2010/02/14(日) 11:08:30
>>446 が書いてるけどレイヤが違うんだって。
仕様書は高いからDraftだけど、
The C++ object modelには
> An object is a region of storage

455 :デフォルトの名無しさん:2010/02/14(日) 11:23:02
で、ポインタを理解するためにはオブジェクト指向を理解しないといけない理由は?

456 :デフォルトの名無しさん:2010/02/14(日) 11:38:31
ポインタが指すものがオブジェクトだから

457 :デフォルトの名無しさん:2010/02/14(日) 16:18:57
>>456
                  .ノ′    } 〕    ,ノ           .゙'┬′   .,ノ
                  ノ      } ゙l、   」′           .,/′   .,ノ _,,y
    .,v─ーv_         〕      〕 .|  .il゙            《 ._   .,,l(ノ^ノ
   ,i(厂  _,,,从vy      .,i「      .》;ト-v,|l′          _,ノ゙|.ミ,.゙'=,/┴y/
   l  ,zll^゙″  ゙ミ    .ノ       .il|′アll!           .>‐〕 \ _><
   《 il|′     フーv,_ .,i″       ||}ーvrリ、             ¨'‐.`   {
    \《 ヽ     .゙li ._¨''ーv,,_     .》′  ゙゙ミ| ,r′                }
      \ ,゙r_    lア'    .゙⌒>-vzト    .ミノ′                 〕
       .゙'=ミ:┐  .「      ./ .^〃     :、_ リ                   .}
         ゙\ア'   .--  ,,ノ|    、    ゙ミ}                   :ト
           ゙^ー、,,,¨ -   ''¨.─   :!.,   リ                   ノ
              〔^ー-v、,,,_,:     i゙「   }                  .,l゙
              l!     .´゙フ'ーv .,y    ]                  '゙ミ
              |     ,/゙ .ミ;.´.‐    .]                   ミ,
              |     ノ′ ヽ      〔                   ミ
              }    }     ′    }                   {
              .|    .ミ     .<     〔                    〕
              .{     \,_   _》、    .{                    .}
              {      ¨^^¨′¨'ー-v-r《                    〔

458 :デフォルトの名無しさん:2010/02/14(日) 23:52:01
>>455
以下、莫迦を弄るの禁止。

459 :デフォルトの名無しさん:2010/02/15(月) 04:42:26
ポインタが指してるのはデータだぞ。

460 :デフォルトの名無しさん:2010/02/15(月) 14:57:10
ポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタ

461 :デフォルトの名無しさん:2010/02/15(月) 15:22:16
いわゆるひとつのNullable Reader Comonad

462 :デフォルトの名無しさん:2010/02/17(水) 14:18:25
ポインタ嫌いになる原因は
*dst++=*src++;
こんなのやるから
それかsignal()のポロトタイプで挫折。

463 :デフォルトの名無しさん:2010/02/17(水) 15:31:25
>>462
68030のコンパクトで美しいコードを出力する良いプログラムじゃねえか。
move.l (src)+,(dst)+

464 :デフォルトの名無しさん:2010/02/18(木) 01:47:43
C言語が糞だからポインタを難解にしていると何度言えばわかるのかね?

465 :デフォルトの名無しさん:2010/02/18(木) 08:07:45
>>464
その理由を相手が納得しない限り
何どいってもわかるわけがないだろ?
馬鹿ですか?

466 :デフォルトの名無しさん:2010/02/18(木) 19:56:01
void( *signal( int signum, void ( *handler )(int) ) )(int);

■関数:signal
 引数1:int signum
 引数2:intを引数とするvoidを返す関数ポインタ handler
 戻り値:intを引数とするvoidを返す関数ポインタ

先頭の'void( *' と 末尾の')(int)' で戻り値 :(;゙゚'ω゚')…

467 :デフォルトの名無しさん:2010/02/18(木) 20:14:35
>>466
#define OPEN (
#define CLOSE )
typedef int Integar;
typedef void (*TYPE_)(Integar);
TYPE_ signal OPEN Integar, TYPE_ CLOSE;

468 :デフォルトの名無しさん:2010/02/19(金) 05:27:01
void( *signal( int signum, void ( *handler )(int) ) )(int){ return handler; }


469 :デフォルトの名無しさん:2010/02/19(金) 19:40:36
77BE4FD4: 6A 0C push 0Ch
77BE4FD6: 68 80 28 BC 77 push 77BC2880h
77BE4FDB: E8 40 24 00 00 call 77BE7420
77BE4FE0: 8B 5D 0C mov ebx,dword ptr [ebp+0Ch]
77BE4FE3: 83 FB 04 cmp ebx,4
77BE4FE6: 0F 84 41 01 00 00 je 77BE512D
77BE4FEC: 83 FB 03 cmp ebx,3
77BE4FEF: 0F 84 38 01 00 00 je 77BE512D
77BE4FF5: 8B 75 08 mov esi,dword ptr [ebp+8]
77BE4FF8: 83 FE 02 cmp esi,2
77BE4FFB: 0F 84 B0 00 00 00 je 77BE50B1
77BE5001: 83 FE 15 cmp esi,15h
77BE5004: 0F 84 A7 00 00 00 je 77BE50B1
77BE500A: 83 FE 16 cmp esi,16h
77BE500D: 0F 84 9E 00 00 00 je 77BE50B1
77BE5013: 83 FE 0F cmp esi,0Fh
77BE5016: 0F 84 95 00 00 00 je 77BE50B1
77BE501C: 83 FE 08 cmp esi,8
77BE501F: 74 0E je 77BE502F
77BE5021: 83 FE 04 cmp esi,4
77BE5024: 74 09 je 77BE502F
77BE5026: 83 FE 0B cmp esi,0Bh
77BE5029: 0F 85 FE 00 00 00 jne 77BE512D
77BE502F: E8 F1 4E 00 00 call 77BE9F25
77BE5034: 8B D8 mov ebx,eax
77BE5036: BF 10 F7 C0 77 mov edi,77C0F710h
77BE503B: 39 7B 54 cmp dword ptr [ebx+54h],edi
77BE503E: 75 32 jne 77BE5072
77BE5040: FF 35 90 F7 C0 77 push dword ptr ds:[77C0F790h]
77BE5046: E8 BC 73 FF FF call 77BDC407
77BE504B: 59 pop ecx
77BE504C: 89 43 54 mov dword ptr [ebx+54h],eax

470 :デフォルトの名無しさん:2010/02/19(金) 19:41:16
77BE504F: 85 C0 test eax,eax
77BE5051: 0F 84 D6 00 00 00 je 77BE512D
77BE5057: 8B 0D 90 F7 C0 77 mov ecx,dword ptr ds:[77C0F790h]
77BE505D: 8B F7 mov esi,edi
77BE505F: 8B F8 mov edi,eax
77BE5061: 8B C1 mov eax,ecx
77BE5063: C1 E9 02 shr ecx,2
77BE5066: F3 A5 rep movs dword ptr [edi],dword ptr [esi]
77BE5068: 8B C8 mov ecx,eax
77BE506A: 83 E1 03 and ecx,3
77BE506D: F3 A4 rep movs byte ptr [edi],byte ptr [esi]
77BE506F: 8B 75 08 mov esi,dword ptr [ebp+8]
77BE5072: 8B 53 54 mov edx,dword ptr [ebx+54h]
77BE5075: E8 0B FF FF FF call 77BE4F85
77BE507A: 85 C0 test eax,eax
77BE507C: 0F 84 AB 00 00 00 je 77BE512D
77BE5082: 8B 50 08 mov edx,dword ptr [eax+8]
77BE5085: EB 20 jmp 77BE50A7
77BE5087: 8B 4D 0C mov ecx,dword ptr [ebp+0Ch]
77BE508A: 89 48 08 mov dword ptr [eax+8],ecx
77BE508D: 83 C0 0C add eax,0Ch
77BE5090: 8B 0D 94 F7 C0 77 mov ecx,dword ptr ds:[77C0F794h]
77BE5096: 8D 0C 49 lea ecx,[ecx+ecx*2]
77BE5099: 8B 7B 54 mov edi,dword ptr [ebx+54h]
77BE509C: 8D 0C 8F lea ecx,[edi+ecx*4]
77BE509F: 3B C1 cmp eax,ecx
77BE50A1: 0F 83 D4 00 00 00 jae 77BE517B
77BE50A7: 39 70 04 cmp dword ptr [eax+4],esi
77BE50AA: 74 DB je 77BE5087
77BE50AC: E9 CA 00 00 00 jmp 77BE517B
77BE50B1: 33 FF xor edi,edi
77BE50B3: 57 push edi

471 :デフォルトの名無しさん:2010/02/19(金) 19:53:25
84 デフォルトの名無しさん [sage] 2010/02/17(水) 01:43:38 ID: Be:
あ〜、「バグっぽいの見つけたけど、報告はここでいいんですかね?」みたいな

いいわけないだろと心の中で突っ込んだが

85 デフォルトの名無しさん [sage] 2010/02/17(水) 01:46:52 ID: Be:
普遍的にバグであるかどうかを確認するためにスレで話題を振る、というのはアリではあるが

ライセンス上、パッチを2chに投稿したら取り込めないのでそこだけは注意

86 デフォルトの名無しさん [sage] 2010/02/17(水) 02:29:47 ID: Be:
ああ、著作権が2chに移っちゃうって話か。確かにそうだわな。

87 デフォルトの名無しさん [sage] 2010/02/17(水) 02:45:42 ID: Be:
まあそのまま取り込まなきゃ回避策はいくらでもある。
オープンソースなんて、どこかのをパクりまくり出し。

著作権は権利が認められれば、その作者が持ってるので放棄出来ないけどな。
著作権法よく読もうぜ。

88 デフォルトの名無しさん [sage] 2010/02/17(水) 02:51:51 ID: Be:
>>87
2chの書き込み規約よく読め

472 :デフォルトの名無しさん:2010/02/27(土) 19:25:21
bsearchの戻り値って、その要素へのポインタを返すってあるんだけど。
int *p;
int a[100];
p=(int *)bsearch(....
ポインタを返すっていうよりメモリアドレスを返してない?
nで見つかったとしたら &a[n]のアドレス

ポインタを返すと書いてあるけど メモリアドレスを返すって意味でいいの?

ポインタとメモリアドレスの違いを教えてください。

473 :デフォルトの名無しさん:2010/02/27(土) 20:05:11
右辺値だし良いんじゃね?

474 :デフォルトの名無しさん:2010/02/27(土) 20:54:18
>>472
『ポインタ』の意味は文脈によって変わる。
ポインタ型変数のことを指す場合もあれば、ポインタ値(=アドレス)を指すこともある。


475 :デフォルトの名無しさん:2010/02/28(日) 00:07:22
>>472
ポインタ=オブジェクトの存在するメモリ空間の先頭アドレス
ポインタ変数=値としてポインタを保持する変数
int *pはint型のオブジェクトに対するポインタを保持する変数
としてpを宣言するという意味になる。
>>474
変わるわけ無いだろ、お前が混同してるだけちゃうんかと小一時間(ry

476 :デフォルトの名無しさん:2010/02/28(日) 11:27:19
俺は数学科だから事情をよく知らんのだが、
情報科学の分野では用語の整備が出来てないのか?
情報科学の分野における「ポインタ」という言葉の
標準的な定義は何なの?

日本語版&英語版のWikipediaでは、「ポインタ」という言葉は
"アドレス"ではなく"変数"の方で定義してあるようだが、
これが標準的な意味なのか?

477 :デフォルトの名無しさん:2010/02/28(日) 12:05:23
明確に分けたければ、ポインタ変数と言えばいい

478 :デフォルトの名無しさん:2010/02/28(日) 15:38:35
ポインタ定数(リテラル文字列とかメモリマップトI/Oのアドレス)
というものもあるのでポインタ=変数というのは明確な間違い。
あくまでオブジェクトのタイプとして整数、共用体、クラスなどと
同列の存在として存在する。
int i,j;を定義して整数i,jと表現するのと同様にvoid *p;を定義して
ポインタpと表現することはあるが、あくまでポインタは変数pの
保持するオブジェクトのタイプであり変数そのものではない。
混同するのは概念が理解できてないだけ。

479 :デフォルトの名無しさん:2010/03/01(月) 00:34:17
値がアドレスか、アドレス自体かの違い

480 :デフォルトの名無しさん:2010/03/01(月) 08:18:33
>>476
>情報科学の分野における「ポインタ」という言葉
一般用語としての「ポインタ」なんてもんはない。
各言語の規格をあたれ。

481 :デフォルトの名無しさん:2010/03/20(土) 07:58:32
JavaHouseでポインタの出自が議論になってたのを思い出した

482 :デフォルトの名無しさん:2010/03/21(日) 20:05:20
Javaの参照はポインタ

483 :デフォルトの名無しさん:2010/03/21(日) 22:34:27
わかってます

( <●><●>)
(U   )つ
  u u

484 :デフォルトの名無しさん:2010/03/22(月) 18:26:17
> 一般用語としての「ポインタ」

あれだろ、猟犬で獲物の方向を見て動かない犬種。
あれが確か「ポインター」

485 :デフォルトの名無しさん:2010/03/23(火) 12:49:09
C/C++で、*や&以外で空いている記号は、 @と$くらいか。

char$ argv;
int@ test;

微妙…

486 :デフォルトの名無しさん:2010/03/25(木) 22:54:34
***** おおっと *****

487 :デフォルトの名無しさん:2010/03/26(金) 01:05:31
ポインタのポインタを引数に取ってポインタの値を変える関数を見かけますが
普通にポインタに代入するだけで済むような気がするのですが……

488 :デフォルトの名無しさん:2010/03/26(金) 02:16:20
マックのツールボックスの事か?

489 :デフォルトの名無しさん:2010/03/26(金) 17:13:17
>>487
値渡しをちゃんと理解しよう。

引数が値渡しだから
「引数に与えられた変数の値を書き換えるにはその変数のポインタが必要」
なのが理解できていたら
書き換えようとする変数がポインタの場合は、
「引数に与えられたポインタの値を書き換えるにはそのポインタのポインタが必要」
になるのも理解できるはずだ。


490 :デフォルトの名無しさん:2010/03/26(金) 21:04:42
>>489
ありがとうございました
目からうろこがおちました
ポインタを取って逆参照に代入が基礎ですね
勉強になりました

491 :デフォルトの名無しさん:2010/03/26(金) 23:56:57
>>485
C++/CLIだと(ポインタの意味ではないけど)^や%が出てくるぞ。int^とかchar%とか。

492 :デフォルトの名無しさん:2010/03/27(土) 06:36:58
C++/CLIの変態さは標準化に失敗したレベルだからな

493 :デフォルトの名無しさん:2010/03/27(土) 21:57:32
char str[] = "abcde";

char * str = "abcde";
が同じなら、上の方がしっくりくるなぁ。

JavaScriptなら
var str = [];(もしくは、var str = new Array();)
str[0] = "abcde";
と同じ事?

Perlだったら、
@str
$str[0] = "abcde";
になるのかな?

多次元配列の一種だと思ってたけど、どう違うん?

494 :デフォルトの名無しさん:2010/03/27(土) 23:49:33
char str[] = "abcde"; は配列
char * str = "abcde"; はどこかにある配列を参照するポインタ
全く違う

495 :デフォルトの名無しさん:2010/03/27(土) 23:52:34
下は、const static char*なポインタ変数だよね。

496 :デフォルトの名無しさん:2010/03/28(日) 00:05:24
どっからconst staticが出てきたんだよ

497 :デフォルトの名無しさん:2010/03/28(日) 08:48:41
>>494
C FAQ 6.2嫁

498 :497:2010/03/28(日) 08:52:14
× 474
○ 473

499 :デフォルトの名無しさん:2010/04/07(水) 17:39:58
じゃあ、JavaScriptなんかでポインタを表現するとどうなる?
PerlやPHPでも可。

500 :デフォルトの名無しさん:2010/04/07(水) 18:34:11
その辺は参照(リファレンス)が一番近い概念じゃないのか?

501 :デフォルトの名無しさん:2010/04/11(日) 17:38:06
ポインタはCPUが使うポインタ
リファレンスはコンパイラが使うポインタ?


502 :デフォルトの名無しさん:2010/04/12(月) 01:33:18
コンパイラというか、処理系?

503 :デフォルトの名無しさん:2010/04/12(月) 13:29:00
いいえ。

504 :デフォルトの名無しさん:2010/05/28(金) 19:21:06
ポインタや参照の値渡しを参照渡しと呼ぶ奴は素人

505 :デフォルトの名無しさん:2010/06/09(水) 15:13:32
ポインタはポインタだし
参照の値渡し?は参照渡しだろ

506 :デフォルトの名無しさん:2010/06/10(木) 10:56:54
ポインタの参照渡しはあっても
参照のポインタ渡しはない

507 :デフォルトの名無しさん:2010/06/11(金) 14:00:17
ポインタという言葉を適切な日本語に意訳したほうがいい。

508 :デフォルトの名無しさん:2010/06/11(金) 18:54:24
>>505
JavaScriptで言うと

function hoge(obj) { obj = {foo:2} }
var tako = {foo:1};
hoge(tako);
alert(tako.foo);

参照渡しなら2と表示されるはずだが実際には1になる

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

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

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