トップページ⇒tech
850コメント260KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/07/27(日) 10:47:14
int i = 10;
int * p = &i;//int型ポインタpにiのアドレスを代入する
簡単。
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。
0002デフォルトの名無しさん2008/07/27(日) 10:52:49
>>1
5ポイント
0003デフォルトの名無しさん2008/07/27(日) 10:52:54
str1 = "別の文字列"; //エラー
str2 = "別の文字列"; //OK

上と下どっちを使うか状況によって異なる。
同じとかいってしまっているお前は、結局何も理解出来ていない。
0004デフォルトの名無しさん2008/07/27(日) 11:03:14
if(sizeof(str1) == sizeof(str2))
  puts(">>1は天才");
else
  puts(">>1は愚か者");
0005デフォルトの名無しさん2008/07/27(日) 11:20:52
>>1
つ、釣られないぞ!
0006デフォルトの名無しさん2008/07/27(日) 11:25:57
* を両方から離して書くのは
かけ算と紛らわしいので嫌い
0007デフォルトの名無しさん2008/07/27(日) 11:28:07
その昔、ポインタの冒険と言うゲームがあってだな
0008デフォルトの名無しさん2008/07/27(日) 11:47:27
code、data、bssの何処に配置されるのかが重要
0009デフォルトの名無しさん2008/07/27(日) 11:54:39
>>1

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

は全部同じ意味だから当たり前だろ。
0010デフォルトの名無しさん2008/07/27(日) 11:59:12
↑はずれ
0011デフォルトの名無しさん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

他
0012デフォルトの名無しさん2008/07/27(日) 12:05:52
>>10
はずれはお前の頭だ
0013デフォルトの名無しさん2008/07/27(日) 12:08:34
* と []は同じ
0014デフォルトの名無しさん2008/07/27(日) 12:09:48
とは限らない
0015デフォルトの名無しさん2008/07/27(日) 12:13:01
char str1[] = "abcde";
char *const str2 = "abcde";

これならよかったのに
0016デフォルトの名無しさん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"); // こっちが出力される
}
0017デフォルトの名無しさん2008/07/27(日) 12:19:34
str1[0] = 'A'; // OK
str2[0] = 'A'; // 未定義動作

これもだな。
0018デフォルトの名無しさん2008/07/27(日) 12:24:26
str2はただのアドレスを格納するだけの変数(普通は4byte)
str1は実体を持つ(char*6 = 6byte)
"abcde"は定数でメモリのナンチャラ領域に密かに存在したまま。
0019デフォルトの名無しさん2008/07/27(日) 12:26:53
"abcde"はfree()が必須ですか?
0020デフォルトの名無しさん2008/07/27(日) 12:28:31
お前は一体何を言っているんだ?
0021デフォルトの名無しさん2008/07/27(日) 12:29:48
1.str1は定数で、str2は定数じゃない。(str1++とか出来ない。)
2.str1の指す領域は変更可能で、str2に関しては未定義。
って感じ?
0022デフォルトの名無しさん2008/07/27(日) 14:42:45
あ、いや、その・・・・
ポインタは理解できる。
がしかし、
ポインタのポインタが出てくるともう俺の頭はオーバーヒートしてしまう。
すんませんVBしか触ったことがないもので。
0023デフォルトの名無しさん2008/07/27(日) 15:05:01
こんなテキストベースのコミュニティで聞くより
>>11の本を買って視覚的に学んだほうが早い
0024デフォルトの名無しさん2008/07/27(日) 15:10:21
くだらない本を読んでいる暇があったら、アセンブラをかじればいいだけ。
0025デフォルトの名無しさん2008/07/27(日) 15:44:48
前スレかもしれない

ポインタはどうやって学ぶべきか
http://pc11.2ch.net/test/read.cgi/tech/1193166476/l50
0026デフォルトの名無しさん2008/07/27(日) 17:48:22
>>25
そうでもない

ポインタはどうやって学ぶべきか part2
http://pc11.2ch.net/test/read.cgi/tech/1217147291/
0027デフォルトの名無しさん2008/07/27(日) 20:26:10
ポインタのポインタを理解できないようでは
ポインタが理解できているという言葉も怪しいな。
0028デフォルトの名無しさん2008/07/27(日) 22:12:42
ポインタは理解できたけど、ポインタのポインタが理解できないってのは
大抵ポインタは配列の表現を変えた物と認識している
で、ポインタのポインタ=二次元の配列と考えてしまい混乱する
0029デフォルトの名無しさん2008/07/27(日) 22:47:46
ポインターが理解できないのは
mov eax,esi
と
mov eax,[esi]
の違いがわからないのと一緒。
この違いがわかればポインターが難しいはずがない。

0030デフォルトの名無しさん2008/07/27(日) 22:51:40
文法が曖昧で難しいのであって、ポインタが難しいのではない
0031デフォルトの名無しさん2008/07/27(日) 22:55:39
このスレタイみたいなことを職場でいう奴がいると本当に萎える
ポインタが分かる・分からないという話自体、ど素人が好む話題だから
0032デフォルトの名無しさん2008/07/27(日) 23:48:03
・なぜポインタを使う必要があるのか
・どういう場合にどういう風にポインタを使うべきなのか

この二点を誰も説明してくれないんだよなあ。
山ほど解説書を買ったけど、前者について解説している本は皆無。
後者については、関数の引数を参照渡しして直接更新して返す
サンプルくらいしかない。
これで理解して使えという方が無理だ。
0033デフォルトの名無しさん2008/07/28(月) 00:01:19
> 理解して使えという方が無理
そう、だから理解しないでなんとなくコード書いて、
そのうちなんとなくみんな分かってきた気になるというのが現状。
悩んでいる暇があったらとりあえず何か書いてみ。
0034デフォルトの名無しさん2008/07/28(月) 00:19:34
>>33
いや、俺は理論から入る人間だから
使う必要性を理解してからでないと使いたくないんだ。

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

「配列とポインタはやってることは同じだけどポインタの方が速い」
この一言だけでポインタを使う理由になるじゃないの。
0035デフォルトの名無しさん2008/07/28(月) 00:31:32
>>34
俺も理論から入る人間だからこそ言える。

たぶんそういう考えの俺らはPG/SE/PMには向いてないよ。
0036デフォルトの名無しさん2008/07/28(月) 00:33:24
この業界の出来る人というのは、常に最新の技術を追い続けている。
必要有か無か、流行るか流行らないか、の判断も付かないうちから、最新技術に興味を示す。
0037デフォルトの名無しさん2008/07/28(月) 00:34:15
実は大嘘
配列とポインタでは配列のほうが実行速度が速い
0038デフォルトの名無しさん2008/07/28(月) 00:37:12
>>34
プログラムなんてどんな言語で作られたモノであろうと結局はCPUがメモリのアドレスを行ったり来たりしている。
隠蔽されてないアセンブラ・Cが速いのは当たり前。

勿論、零細企業で小規模システムの開発しかしていない人にとってはJavaどころかVBでも十分
0039デフォルトの名無しさん2008/07/28(月) 00:38:13
速度と省メモリ
0040デフォルトの名無しさん2008/07/28(月) 01:04:18
結論:ポインタを考えた奴は馬鹿
0041デフォルトの名無しさん2008/07/28(月) 01:15:48
C言語の文法が糞
もっと紛れのない文法の高級アセンブラが普及すべきだった
0042デフォルトの名無しさん2008/07/28(月) 01:28:28
ポインタの必要性くらい書いてある本はある。
書いてないようなら捨ててしまえ。
0043デフォルトの名無しさん2008/07/28(月) 02:17:17
>>40
>>41もいってるが文法がクソなだけ。
先にポインタの概念を取得してからCに入れば
表現の違いでしかないんだけどな。
0044デフォルトの名無しさん2008/07/28(月) 02:25:06
>>32
やっぱプログラミングの入門書には
データ構造の話とかも書くべきだよな。




>>34
ちょwwwwwwwwwwそんな理由www
0045デフォルトの名無しさん2008/07/28(月) 04:56:20
>>34
それが事実じゃないからさ
ポインタと配列は別物であり、使える場所も変わってくる
例えば関数の引数として使えるのはポインタだけで
配列使ってるように見えるのは見せ掛けで実はポインタ使ってるとか
そういう細かい事実があるわけ
今の処理系じゃポインタの方が速いなんてことも別にないし
0046デフォルトの名無しさん2008/07/28(月) 07:36:31
>>37
ハァ?
メモリ上の配列とポインタの事言ってんだったら変わらねーよ。
例え配列がスタックで、ポインタの方をヒープのつもりで発言してても、
確保に時間が掛かるだけで、アクセス速度は変わらん。
0047デフォルトの名無しさん2008/07/28(月) 07:57:28
特定のコンパイラの実装・最適化の話とか?
まー配列の方が当たりをつけやすい場面が多いとはおもうけど
それをもって速いってのもなぁ。
0048デフォルトの名無しさん2008/07/28(月) 08:01:37
ポインタ判らないとかいってるやつはクローじゃ、ラムダ指揮、公開関数(なぜか変換できない)理解できるのか?
0049デフォルトの名無しさん2008/07/28(月) 08:02:33
訂正
→できないのかな?
0050デフォルトの名無しさん2008/07/28(月) 08:18:57
Cのポインタは参照・束縛の概念だけじゃなく
メモリアドレスを意識できなくちゃいけないしな。
ポインタ自体の演算や型キャストもできるわけだし
高級言語にくらべたら無法に近い。

>>48
一見関係ないように思えるけど……。
0051デフォルトの名無しさん2008/07/28(月) 08:21:03
Cでポインタを使わなくてはならないケースは
malloc関数で動的にメモリを確保して使う場合と
scanf関数の引数だろ。
これ以外でポインタを使う香具師はDQN。
0052デフォルトの名無しさん2008/07/28(月) 09:20:26
>>46-47
機械語レベルの話だから別にいいよ
説明する気もないし
0053デフォルトの名無しさん2008/07/28(月) 09:34:29
リンカのことを考えれば
>>29にたどり着く。
0054デフォルトの名無しさん2008/07/28(月) 10:04:59
>>51
  |   |  | |   |    |  | |   |   |   || | |
  |   |  | レ  |    |  | |   |  J   || | |
  |   |  |     J    |  | |  し     || | |
  |   レ |      |  レ|       || J |
 J      し         |     |       ||   J
             |    し         J|
             J                レ
     /V\
    /◎;;;,;,,,,ヽ
 _ ム::::(l|l゚Д゚)| …うわぁ
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
0055デフォルトの名無しさん2008/07/28(月) 10:17:48
後半は釣りだが、それまでmallocの話が出てこなかったのは異常。
0056デフォルトの名無しさん2008/07/28(月) 10:27:07
>>52
× 説明する気もないし
○ 説明する能力もないし
0057デフォルトの名無しさん2008/07/28(月) 10:32:51
1. 配列を関数に渡す際にどうしても必要
2. 構造体を関数にコピーレスで渡したい際にどうしても必要
3. 別関数内の変数の値を変更したい際にどうしても必要
4. メモリを動的に確保する際にどうしても必要
5. 特殊なデータ構造を実現する際にどうしても必要

ポインタがどうしても必要になるケースは、普通はこのくらいかね。
他にも使う状況はなくはないと思うが。
0058デフォルトの名無しさん2008/07/28(月) 11:07:44
>>56
煽っても何もでないよ
0059コピペ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と書かれた紙が表示されるのであっためでたしめでたし」
0060デフォルトの名無しさん2008/07/28(月) 11:27:13
void func(char *c){
c = 'z';
}
int main(){
char subarac = 'a';
func(subarac);
printf("%c",subarac);
}

この場合を教えてくれ


0061デフォルトの名無しさん2008/07/28(月) 11:29:54
>>60
ひと目で間違いに気づかないとか、もうね…
0062602008/07/28(月) 11:43:47
>>61
わざとやってるんだが
0063デフォルトの名無しさん2008/07/28(月) 11:48:37
ポインターはどこでもドア。
好きなところに移動してデータを置ける。
開けた先がお風呂だと大変なことになる。
0064デフォルトの名無しさん2008/07/28(月) 12:12:38
>>63
お風呂が溢れちゃいますね。
0065,,・´∀`・,,)っ2008/07/28(月) 12:20:57
>>60
コンパイルエラー
0066602008/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
0067デフォルトの名無しさん2008/07/28(月) 13:17:34
>>57
おお、いいね。
これを五つの章構成にして
実例とともに詳細解説を加えれば
画期的なポインタの解説書になるよ。
たぶん、今までこういう本はなかったよ。
本を出したら俺は印税の一割でいいよ。
0068デフォルトの名無しさん2008/07/28(月) 13:24:02
1. 配列を関数に渡す際にどうしても必要

可変個引数で渡せる
0069デフォルトの名無しさん2008/07/28(月) 13:33:44
そもそも、配列を使うためにはポインタ演算が必ず行なわれているわけだが。
p[i]というのは*(p+i)でしかないのだから。
# だからこそi[p]という書き方もできるわけで、3["abcd"]なんてこともできると。
0070デフォルトの名無しさん2008/07/28(月) 13:34:48
仮引数を [] で受けてたら、ポインタを使っていることに
気づかない奴もいるかも知れない。
0071デフォルトの名無しさん2008/07/28(月) 13:38:56
そこをきちんと説明しないから理解できないのではないかと思う。
0072デフォルトの名無しさん2008/07/28(月) 13:41:34
scanfを教えるときに&を{おまじない}として教えるのも良くないと思う
0073デフォルトの名無しさん2008/07/28(月) 13:49:32
ポインタの使いどころを書いてる本がないってことはないと思うんだが。
0074デフォルトの名無しさん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
0075デフォルトの名無しさん2008/07/28(月) 13:57:23
char str1[] = "abcde";
だと長さが5の配列の実体が出来ると思ってたんだけど違うのか?
char *str2 = "abcde";
だとリテラル"abcde"のアドレスをstr2に代入すると思ってたんだけど違うのか?
0076デフォルトの名無しさん2008/07/28(月) 13:58:47
>char str1[] = "abcde";
>だと長さが5の配列の実体が出来ると思ってたんだけど違うのか?
違う。長さは6。

>char *str2 = "abcde";
>だとリテラル"abcde"のアドレスをstr2に代入すると思ってたんだけど違うのか?
あってる。
0077,,・´∀`・,,)っ2008/07/28(月) 13:59:35
>>69
いいや
配列p[]を *(p+i)でアクセスするのは無理だろ
0078デフォルトの名無しさん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;
}
0079デフォルトの名無しさん2008/07/28(月) 14:12:55
>char str1[] = "abcde";
なんで長さが5なの?
0080デフォルトの名無しさん2008/07/28(月) 14:25:11
\0を忘れていました。
0081デフォルトの名無しさん2008/07/28(月) 14:30:49
char str1 = {'a','3','-','o','ω'};
0082デフォルトの名無しさん2008/07/28(月) 14:52:49
アドレス空間の概念が理解できてないとポインタが理解できないんじゃない?
あと、できればスタックとヒープの違いぐらいは理解して欲しいけど。

そもそもC言語の場合、スタックにたくさん積みたくない→ポインタの概念導入、っていう流れの気がする。
0083,,・´∀`・,,)っ2008/07/28(月) 15:11:47
>>78
すまぬ

だがこういうのよく使わないかな?
sizeof (a) /sizeof (a[0])
ポインタと配列混同すると痛い目にあう例だが
0084デフォルトの名無しさん2008/07/28(月) 15:24:41
だが

のつながりがよくわからないです
0085デフォルトの名無しさん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;
}
0086デフォルトの名無しさん2008/07/28(月) 15:44:43
きっと配列へのポインタも理解できてないんだろうなあ。

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

他の言語でも同じなんですか??
Java,VB,Ruby
0088デフォルトの名無しさん2008/07/28(月) 20:18:51
>>86
そんな危険な宣言すんなよ。
0089デフォルトの名無しさん2008/07/28(月) 20:20:33
>>87
仮想メモリとして扱う処理系もあるし、そのエラーと言うのは全部の処理系で確認した?
0090デフォルトの名無しさん2008/07/28(月) 20:21:29
>>87
>C言語でint[100000000000000]とかにしちゃうとエラーになるんですけど
sizeof(int) が4だとして、300テラバイトを超えるメモリを割り当てられる処理系が思いつかない。
0091デフォルトの名無しさん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配列の大きさを調べることはできないの?
0092デフォルトの名無しさん2008/07/28(月) 20:22:49
配列へのポインタ
と
ポインタの配列
の違いと宣言文法が分からない。
0093デフォルトの名無しさん2008/07/28(月) 20:24:31
訂正

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

aを使わずにpontaが指すshort配列の大きさを調べることはできないの?
0094デフォルトの名無しさん2008/07/28(月) 20:26:41
BCCでもGCCでも
int[200万]あたりでエラーになる。メモリは6GB積んでるのに
0095デフォルトの名無しさん2008/07/28(月) 20:28:44
>>86
アホか
それはポインタの配列だろ
0096デフォルトの名無しさん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から勉強し直せ。
0097デフォルトの名無しさん2008/07/28(月) 21:15:46
>>96
結局ポインタの配列ってのは?
0098デフォルトの名無しさん2008/07/28(月) 21:31:54
・ポインタの配列

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

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

・配列のアドレス

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

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

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

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

これが

(*p)[i];

だと思う。「配列のアドレス」を略して「配列」って呼ぶのはちょっとどうかなと思う。
わかりにくい。
0099デフォルトの名無しさん2008/07/28(月) 21:33:21
ちなみに俺は

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

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

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

って書くようにしてる。
理由は俺がアホで理解しにくいから、
0100デフォルトの名無しさん2008/07/28(月) 21:34:04
変数は配列を考えることができますね。たとえば、次の例ではchar型変数10個の配列を宣言しています。

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

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



2次元配列のことをポインタの配列だという人がたまにいますが、ちょっと違います。
ポインタの配列は2次元配列などではなくあくまでもポインタ変数の配列で、上のように宣言したものは1次元配列です。
メモリの確保のされ方からいって、2次元配列とポインタ配列は全く違うものです。
0101デフォルトの名無しさん2008/07/28(月) 21:35:58
別に、char型の2次元配列と思っていいんじゃないの?
0102デフォルトの名無しさん2008/07/28(月) 21:37:33
ポインタは完璧!だと思ってたのにこのスレ見たら自信なくなってきた
0103デフォルトの名無しさん2008/07/28(月) 21:41:12
お、おれも!
0104デフォルトの名無しさん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
0105デフォルトの名無しさん2008/07/28(月) 21:46:07
俺はアホばっか見てて自惚れそうで怖くなってきた。
0106デフォルトの名無しさん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
それはポインタの配列
0107デフォルトの名無しさん2008/07/28(月) 21:51:27
これでFA


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


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

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


??
int(* ponta);
0109デフォルトの名無しさん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) に自動変換が効くのは一般の配列の場合と同様。
0110デフォルトの名無しさん2008/07/28(月) 21:58:34
>>106
**argv は文字列配列の先頭アドレスが確保されている配列の先頭アドレスのポインタ。

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

"test"
"yaruo"
"bararaika"

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

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

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

要するに、

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

ってなってる。
0111デフォルトの名無しさん2008/07/28(月) 21:59:02
>>109
里佳石井素股
0112デフォルトの名無しさん2008/07/28(月) 22:14:16
>>110
>**argv は文字列配列の先頭アドレスが確保されている配列の先頭アドレスのポインタ。
文字列配列じゃなくて、文字列または文字配列じゃね?
「文字列群」が文字列配列であるかはどうかは**argvには関係ねぃし。
0113デフォルトの名無しさん2008/07/28(月) 22:21:44
**argvは、機能的にはどう見ても
ポインタの配列なのだが、
星が二つついてるのだからあくまで
ポインタのポインタと理解しなければならない。
0114デフォルトの名無しさん2008/07/28(月) 23:15:58
*argv[]
この書き方が好きだ
0115デフォルトの名無しさん2008/07/28(月) 23:25:43
要するに、c では「配列」の実体だけを書くことができないんだよ。(anonymous 配列を書くシンタクスがない)
書けるのは「配列の名前」で、それは配列の実体へのポインタをそう呼んでいるだけ。
char a[128]; というときの a 自体は配列ではない。a は「配列の名前」で、それは [128] という配列実体へのポインタ。
その a へのポインタは、char (*a)[128];
0116デフォルトの名無しさん2008/07/29(火) 01:27:34
日本語でおk
0117デフォルトの名無しさん2008/07/29(火) 01:56:11
[]演算子が混乱の元だ。
シンタクス・シュガーではなく、
シンタクス・ビターになっとる。
0118デフォルトの名無しさん2008/07/29(火) 01:59:28
うまくない
0119デフォルトの名無しさん2008/07/29(火) 01:59:30
わざと分かり辛く書いてんだろ。
[]も*も同じだと思えばいいんだよ。そのうち違いが分かってくるさ。
0120デフォルトの名無しさん2008/07/29(火) 06:53:10
>>105
俺は改めてコの業界の糞さを思い知らされた。

>>115
自慢げに適当な嘘並べるな。
オブジェクト「a」そのものは配列であり、その右辺値が「配列の先頭を指すポインタ」になるだけだ。
0121デフォルトの名無しさん2008/07/29(火) 07:17:11
>>120
2ちゃんに書き込む人間はみんな糞ですがなにか?
オレモナー
0122デフォルトの名無しさん2008/07/29(火) 12:06:30
>char * str2 = "abcde";
いまだにここが分からない
ポインタに何故文字列を代入できるの?
0123デフォルトの名無しさん2008/07/29(火) 12:09:35
>>122
"abcde"はconstな文字列(≒char配列)ですが、右辺値はconstな文字列へのポインタになります。従って、代入できるわけです。
char foo[] = "abcde"した後、char * p = fooと言うように代入できるのと同じことです。
0124デフォルトの名無しさん2008/07/29(火) 12:41:40
>>122

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

だからその後に str2 = NULL; なんてやったら、"abcde" のありかは永久に失われる。
0125デフォルトの名無しさん2008/07/29(火) 12:50:00
char * str2 = "abcde";
の"abcde"はstaticな感じって言えばいいのかな?
constな無名変数とでも言うか
0126デフォルトの名無しさん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だけど、配列の宣言と一緒にやった場合は例外
詳しくは、「文字列リテラルの変更」でググると解説が
0127デフォルトの名無しさん2008/07/29(火) 13:44:37
115は良くある間違いで、(わかってて書いてたらスマン)120の言うとおりCの配列とポインタは明確に別物
どちらで宣言するかで、動作が変わる
具体的に言うと、sizeof()の動作が、ポインタの場合はポインタのサイズ(通常は4)を返すが、
配列の場合は使用バイト数を返す

混乱のもとは、[]記号が、宣言、右辺値、左辺値、それぞれのケースで意味が微妙に違うところ
整理してないと、すぐわからなくなる
0128デフォルトの名無しさん2008/07/29(火) 13:50:45
>>126
一言で言い表せないよねなかなか
0129デフォルトの名無しさん2008/07/29(火) 16:30:04
>char (*a)[128];

こういう表現って普通に使います?
おいら使ったことないんだけど。
0130デフォルトの名無しさん2008/07/29(火) 16:33:52
泉源寺に()つけちゃって大丈夫なんだっけ
0131デフォルトの名無しさん2008/07/29(火) 16:37:36
配列へのポインタ(≠ポインタのポインタ)が必要なときはそうせざるを得ないね。
0132デフォルトの名無しさん2008/07/29(火) 16:39:59
そんな宣言はしない
使う時にキャストするから。
0133デフォルトの名無しさん2008/07/29(火) 17:47:59
>>129
横WIDTH個、縦HEIGHT個の長方形のchar配列を動的に確保したい時、
char (*tbl)[WIDTH] = malloc(sizeof(char)*WIDTH*HEIGHT);
とかやる。
tbl[y][x] = data;
とかいうふうにアクセスする。
>>130
論外
>>132
おまえだけ
0134デフォルトの名無しさん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と言う風にアクセスするかな。
0135デフォルトの名無しさん2008/07/29(火) 19:18:00
>>133
なるほどそういうことですか。ようやく意味がわかりました。
0136デフォルトの名無しさん2008/07/29(火) 19:19:31
サンプルのためのサンプルじゃなくて、実際的なシチュエーションが思いつかん。
まったく無責任な想像だが、メッセージ通信処理とかで使えそうかなぁ。
1個のチャンクが固定長でうんちゃらかんちゃらとか。まーよー知らんけど。
0137デフォルトの名無しさん2008/07/29(火) 19:30:18
メッセージ通信でポインタ使う奴の気が知れない。
0138デフォルトの名無しさん2008/07/29(火) 20:08:03
リストとツリーをC言語で自力で実装できるぐらいポインタを理解しておけば、
現実問題としてポインタ周りで困ることはあんまりないな。

0139デフォルトの名無しさん2008/07/29(火) 21:49:47
char (*p)[4];
って有ったとき、p++てやると、
pは4バイト移動するって考えると分かりやすいな。
0140デフォルトの名無しさん2008/07/30(水) 09:42:39
>>139
で、実際はそうはならないので混乱する、と。

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

使わない方がコード的に遅くて長くても安全って場合の方が多いよなぁ。
特に複数人でコードを書く場合は。
0142デフォルトの名無しさん2008/07/30(水) 13:05:37
ぱっと見で動きの想像しにくいポインタの使い方はちょっとなあ。
2次元以上だったら最大値規定して最初から配列取るわ。
0143デフォルトの名無しさん2008/07/30(水) 13:24:17
>>133
それC99じゃないとWIDTHを変数にできないから困る。
できればやりたいんだけどね。
0144デフォルトの名無しさん2008/07/30(水) 14:20:47
define
0145デフォルトの名無しさん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);
}
0146デフォルトの名無しさん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++ ){
0147デフォルトの名無しさん2008/08/01(金) 20:54:15
>>146
すいません。誤爆しました
0148デフォルトの名無しさん2008/08/01(金) 21:24:47

int *********************************a;
0149デフォルトの名無しさん2008/08/02(土) 03:41:14
a.next->next->prev->next->next->name = "shine>>148";
0150デフォルトの名無しさん2008/08/02(土) 03:59:13
輝け148
0151デフォルトの名無しさん2008/08/02(土) 09:25:34
昔、トリプルポインタを使っているコードを業務で見た。
それ自体はよくできているプログラムだし、公開されているインタフェースも
ちゃんとしていた。しかしまぁ、これを作った人(ベテランプログラマー)は
よく自分で理解できるもんだ、と素直に関心した。
0152デフォルトの名無しさん2008/08/02(土) 11:03:57
終始ビット演算を使われるよりまし
0153デフォルトの名無しさん2008/08/03(日) 00:55:51
むしろ何で理解できないかが理解できない
0154デフォルトの名無しさん2008/08/03(日) 06:29:00
そういうこと言う奴は理解してない
0155デフォルトの名無しさん2008/08/04(月) 12:13:42
5次元配列をいくつか使っているソースみて爆死した。
書いた本人はリタイアして該当コードは最初から書き直しになった。
0156デフォルトの名無しさん2008/08/04(月) 12:50:32
多次元配列を扱う部分だけLispのコードから生成するとかはやるよ
ルールが決まってて単純にそのルールを繰替えし適用するだけだから
機械にやらせた方が絶対安全
0157デフォルトの名無しさん2008/08/05(火) 01:41:35
配列なんて、マトリックス構成する要素が幾つにでもなるから
何次元だろうとどうでもいいじゃん。
0158デフォルトの名無しさん2008/08/05(火) 01:50:07
量子化学計算やるには5次元配列が普通に必要になるよ。
小原積分計算する時に。
0159デフォルトの名無しさん2008/08/05(火) 01:51:39
といいつつ、まあ実際には普通の配列にはしないんだけどな・・・。
0160デフォルトの名無しさん2008/08/05(火) 11:32:01
>>151
ポインタにダブルだとかトリプルだとか属性があるような解釈の仕方をするから理解できないんじゃないの?
アスタリスクが並ぶのがいやならtypedefすればいいだけの話だし、そうしてしまえばただのポインタと同じことじゃないか。
0161デフォルトの名無しさん2008/08/17(日) 11:40:50
関数ポインタを引数に取る関数ポインタの二次元配列とか
そういうのになってくると泣ける程複雑になる
こういうのってtypedef使ってもいいんだよね?
よくポインタの理解度を試すようなクイズで「typedefを使わずに」とかあるけど、
日常的に使っててもできる気がしないわ
0162デフォルトの名無しさん2008/08/17(日) 11:45:54
人間がコンパイラになる必要は無いんだから
そういうクイズは無視でおkだと思う
0163デフォルトの名無しさん2008/08/18(月) 10:52:16
void (*fnc[YLEN][XLEN])(int(*)(int));

Cエキスパート:出来るけど見にくいからtypedef
なんちゃってプログラマ:出来ないからtypedef、人間コンパイラになる必要はないと言い訳
0164デフォルトの名無しさん2008/08/18(月) 11:50:21
typedefは見やすくするためにあるんじゃなくて、
型を抽象化するために使うべきだと思う。
0165デフォルトの名無しさん2008/08/18(月) 23:01:11
関数ポインタは積極的に typedef しとけ。他は必要なし。
0166デフォルトの名無しさん2008/08/20(水) 12:54:58
そういうのが直ぐできるようになるにはどうすりゃいいんだろうな
規格からルールを理解すれば少しは楽になるんだろうかね?
0167デフォルトの名無しさん2008/08/20(水) 13:03:32
簡単にエキスパートになる方法を教えろと言ってるんですね、わかりません
0168デフォルトの名無しさん2008/08/20(水) 13:13:53
GCCのソース読むのが近道
読めなければそれが読めるようになるまで簡単な物から読んだり
パッチ作ったりしてオープンソースコミュニティに貢献してりゃ10年もすりゃ
今君が想像してる程度のエキスパートには楽になれる

って以前言われたことがある
0169デフォルトの名無しさん2008/08/20(水) 20:50:49
10年かあ・・・
確かに俺がブラインドタッチできるように
なったのは、毎日PCをさわるようになって
10年くらい経ってからのような気がする。
人間、何事も10年は精進が必要なんだね。
0170デフォルトの名無しさん2008/08/20(水) 20:51:55
GCCってそんないいソースか?
0171デフォルトの名無しさん2008/08/20(水) 21:00:02
ブラインドタッチに10年って・・・・身体障害者の方ですか
0172デフォルトの名無しさん2008/08/20(水) 21:09:59
>>171
いや、10年くらいかかっても不思議じゃないと思うぜ。
人さし指タイピングから始めた俺は、タッチタイピングに切替えるだけでかなりの年月を費したが。
それでもまだブラインドタッチにはたどり着けない。
英語キーボードと日本語キーボードを行ったり来たりした日にはもう大変。
0173デフォルトの名無しさん2008/08/20(水) 21:11:17
gaucheの作者も昔HPで
どんな言語でも10年は使わなきゃほげほげって書いてたからだいたいあってると思う
0174デフォルトの名無しさん2008/08/21(木) 15:14:41
タイピングなんて我流でいいよ
どうせ出力見ただけじゃ経過は見えないんだから
0175デフォルトの名無しさん2008/08/23(土) 03:19:03
出力だけ要求されるならそれでもいいが
運指が偏ってると年食ってからバネ指とか悪影響もあるから気をつけろ
0176デフォルトの名無しさん2008/08/23(土) 10:16:24
年とると管理業務になるので問題ないです
0177デフォルトの名無しさん2008/08/24(日) 02:44:08
>>166
無理に使わなくていいと思うぞ。それを必要と感じる時が来たらそうすればいいんじゃないか。
0178デフォルトの名無しさん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);

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

っていうセンパイの言葉でわかった
0180デフォルトの名無しさん2008/09/07(日) 10:13:02
たとえ話は、ポインタの理解の役には立たない。

これ定説。
0181デフォルトの名無しさん2008/09/07(日) 15:10:11
使って覚えろ
これが基本ですね、マクロしかりテンプレートしかり各種ライブラリしかり
0182デフォルトの名無しさん2008/09/07(日) 15:54:49
アドレスとデータの区別がつけば、あとは簡単。
0183デフォルトの名無しさん2008/09/07(日) 18:37:35
矢印と箱の差。
図を描いてみればアホでもわかるだろ。描こうともしないでわからないとかほざく無能は氏ね。
構造を把握したうえで、「たぐりよせる」操作と「矢印を作る」操作がわかればあとは簡単。
0184デフォルトの名無しさん2008/09/07(日) 20:09:49
たとえ話で説明するやつの理解はけっこアヤシイ。

ところで、ポインタには型がある事をお忘れなく。
0185デフォルトの名無しさん2008/09/08(月) 14:20:46
>>184
例えを用いずに話して相手が理解出来るなら最初っから躓いてないだろ。
0186デフォルトの名無しさん2008/09/08(月) 14:26:31
例えを用いずにうまく説明できないところがアヤシイw
0187デフォルトの名無しさん2008/09/08(月) 14:39:55
本当にわかっている人は例えなんか使わない。
実際にPGを組ませてビシビシしごく。
ついてこれない香具師は見捨てる。
0188デフォルトの名無しさん2008/09/08(月) 16:52:47
>>185-186
喩え話ってのはどーしたって誤謬があるわけで
「理解“した気に”させる」効果しかない。
0189デフォルトの名無しさん2008/09/08(月) 21:50:34
メモリ上にデータが配置されるイメージさえつかめば
ポインタ使ったプログラムの動きは見えてくるんだよな。

そんな低レベルなことまで意識しなきゃならないというのは、
教える側にするとちょっと面倒でもある。
0190デフォルトの名無しさん2008/09/08(月) 21:52:10
ポインタ自体が低レベルな操作のためにあるもんだし
0191デフォルトの名無しさん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から頂きますた。
0192デフォルトの名無しさん2008/09/08(月) 22:15:31
そしてスマポへ…
0193デフォルトの名無しさん2008/09/08(月) 22:18:25
それoperator=とかoperator*とかoperator->とか実装すると便利だよきっとたぶんおそらく
0194デフォルトの名無しさん2008/09/08(月) 22:22:03
C++使ってるとポインタ演算をしなくなるな
0195デフォルトの名無しさん2008/09/08(月) 22:23:43
STLは使わんの?

0196デフォルトの名無しさん2008/09/08(月) 22:25:11
アレは見た目が似てるだけか。スマソ。
0197デフォルトの名無しさん2008/09/08(月) 23:14:41
mplの
metafunc<type>もポインタっぽく思える
metafunc<type>::valueとかで参照できたりするし
0198デフォルトの名無しさん2008/09/08(月) 23:22:20
>>193
+とか-とかも定義しようぜ
0199デフォルトの名無しさん2008/09/08(月) 23:44:12
Cのポインタ演算子*が悪い。かけ算記号と同じなんだもの。
この点だけは、リッチー先生を殴る権利が俺たちにあると思うよ。
俺が言語設計者なら、Data_Pointed_by(ポインタ変数)にする。
あとポインタ変数の型をなくし、すべて1バイトを示すものとする。
ポインタ変数のインクリメント・デクリメントも1バイト単位。
0200デフォルトの名無しさん2008/09/08(月) 23:47:01
>>199
どうしてもポインタをモノにできなかった奴の定番台詞ですな
0201デフォルトの名無しさん2008/09/08(月) 23:57:39
>>199
それなんてCのご先祖様BCPL、特に後半。
0202デフォルトの名無しさん2008/09/08(月) 23:57:44
>>199
そんな糞設計の言語を誰が使うんだよw
0203デフォルトの名無しさん2008/09/08(月) 23:58:41
ポインタの概念を図で説明するときにアドレスの存在を明示しないやつがたまにいるんだよな。
四角から四角へ矢印を引いた図は書けるんだけど、アドレスの存在が意識されにくい図になってる。
つまりこんな図。

□→□

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

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


0204デフォルトの名無しさん2008/09/09(火) 02:04:43
初心者ですが教えてください。
ポインタ演算で型に応じてポインタが進むのは知っているのですが、
その「どの型ならいくつ進む」という情報は実行ファイル中にどういうふうに保存されているのでしょう?
0205デフォルトの名無しさん2008/09/09(火) 03:02:00
>>204
静的に決まる型を解釈して、そういう言うアセンブラコードに変換されてるんだよ
坊や。
0206デフォルトの名無しさん2008/09/09(火) 03:08:51
動的に決定する型はどうやって決定されるんだろうね。
ああ、CやC++じゃそんな芸当出来ないかw
0207デフォルトの名無しさん2008/09/09(火) 08:44:30
>>204
コンパイラが吐いたasm読めば分かるよ。
よく分からなかったら、型を変えて見比べてみる。
0208デフォルトの名無しさん2008/09/09(火) 09:41:45
>>203 ポインタの俺解釈いいかげんおなかいっぱい
0209デフォルトの名無しさん2008/09/09(火) 10:20:57
>>206
Cは兎も角、C++にはRTTIってもんがあるわけだが。
0210デフォルトの名無しさん2008/09/09(火) 10:53:06
C++のRTTIはデバッグ用途以外では要らない子
0211デフォルトの名無しさん2008/09/09(火) 23:25:55
>>210
いやいやdynamic_castはデバッグ用途ではないだろ。
しょっちゅう使うものでもないけれど。
0212デフォルトの名無しさん2008/09/10(水) 00:42:46
×dynamic_castでオブジェクトの型を判別し、そのオブジェクトのメンバ関数を呼び分ける
→わざわざ多態性のメリットを殺さずに、仮想関数で解決すべき。

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

0213デフォルトの名無しさん2008/09/10(水) 01:52:31
それは、動的に判定されるというより、
予め考えられる型を全部網羅してコーディングしてるだけだしなぁ。
新たに組み込んだhogehogeクラスのポインタとか実装が無いと動かんだろ?
あ、仮想関数で呼んでもらえば自前で用意しておくだけで追加が簡単か/
0214デフォルトの名無しさん2008/09/11(木) 00:05:54
JavaやC#でこういう感じのコードに時々出食わす。
setObject(new Hoge);
//別のところ
Hoge h = (Hoge)getObject(); //戻り値の型はObject型
帰ってくるオブジェクトは絶対さっきsetObjectしたときの引数という場合。
もしこれがC++だったらboost::polymorphic_downcastの出番だな。
0215デフォルトの名無しさん2008/09/11(木) 14:58:51
>>214
インターフェースを利用できない理由があるの?
0216デフォルトの名無しさん2008/09/11(木) 20:59:10
C言語には文字列がないので文字列ポインタ作っちゃいました的ナ
0217デフォルトの名無しさん2008/09/11(木) 23:36:59
>>215
setObjectやgetObjectは既存のライブラリで、しかも標準だったり有名だったりして
自分が手を加えられるような存在ではないんだ。
0218デフォルトの名無しさん2008/09/12(金) 01:27:35
Cの文字列型は廃止の方向で…
0219デフォルトの名無しさん2008/09/12(金) 03:01:53
メモリモデルよくわからない
0220デフォルトの名無しさん2008/09/12(金) 03:16:36
プログラマにメモリを意識させる言語は糞。
Javaが理想に近いが、記述が冗長すぎてこれも結局は糞。
これからはロジック書きのみに集中できてシンプルな
記述で済む言語がトレンドになる。
0221デフォルトの名無しさん2008/09/12(金) 08:40:39
スクリプト系?
0222デフォルトの名無しさん2008/09/12(金) 09:00:57
ML系やLispのようなLL言語ですね
ロジックといえばprologやマイナーですがCoq, ETIも見逃せません
0223デフォルトの名無しさん2008/09/12(金) 11:33:37
>>220
バターナイフ振り回して「包丁は危険だから糞」って言ってる訳ですね、わかります
0224デフォルトの名無しさん2008/09/12(金) 11:53:19
プロセス空間とかよくわかんない
0225デフォルトの名無しさん2008/09/12(金) 12:06:38
糞かどうかはともかく、誰にでも向くものではないのは確かだね。
まあJavaでも十分メモリを意識すると思うが。

>>219
メモリモデルはポインタとかより遙かに悩ましいね。
0226デフォルトの名無しさん2008/09/12(金) 12:32:18
>>218
「文字列」などという型はありません。
0227デフォルトの名無しさん2008/09/12(金) 12:33:06
>>220
つ[COBOL]
0228デフォルトの名無しさん2008/09/12(金) 13:02:56
>>220
Haskellをどうぞ
0229デフォルトの名無しさん2008/10/04(土) 11:47:17
あげ
0230デフォルトの名無しさん2008/10/04(土) 12:01:50
char str1[] = "abcde";
char * str2 = "abcde";
>上と下は同じでどっちを使ってもいい。

これは間違い。str1は書き込みできるが、str2は書き込みができないことがある。
0231デフォルトの名無しさん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));
やってみそ
0232デフォルトの名無しさん2008/10/04(土) 12:28:25
噛み付かれた>>230が不憫でならない
0233デフォルトの名無しさん2008/10/04(土) 12:28:59
要はアドレスという概念がわかっているかどうか。
あとは書式の問題でなれだな。

てすぐ結論をだそうとする漏れorz..
0234デフォルトの名無しさん2008/10/04(土) 12:44:58
>>231
配列に書き込めないコンパイラがあるの?
0235デフォルトの名無しさん2008/10/04(土) 12:50:49
オプション次第では、str1も書き込みできないようにできるものがあるかもしれないが、
そんなこと言ったらきりないだろ。

str1にconstがついているなら文句なしに書き込み不可だけど。
0236デフォルトの名無しさん2008/10/04(土) 12:51:43
>>234
多分、配列自体に代入する式が評価中に存在すれば固定領域ではなく揮発領域に設定されるんだろうな。
まあ、ポインタという代物はその操作をコンパイラには分からせなくするチカラもある訳で、
配列で指定した領域にポインタ参照で書き込もうとしたら落ちるとかはあるよ。
0237デフォルトの名無しさん2008/10/04(土) 12:59:42
>>236
すまんが何をいってるのかさっぱりだ
バッググラウンドを簡単に説明してくれないか
○○と言う本やコンパイラのマニュアルに書いてあった、でもいいから
0238デフォルトの名無しさん2008/10/04(土) 13:14:21
>>237
「世間には色んなコンパイラがある」ってこと。
0239デフォルトの名無しさん2008/10/04(土) 13:18:31
char s[] = "abcde";

ポインタ経由だと、これに書き込めない環境があるってこと?
ないだろ。
0240デフォルトの名無しさん2008/10/04(土) 13:21:27
>>239
最適化されてなければな。
だからおまいの脳内環境だけで結論出すなよw
0241デフォルトの名無しさん2008/10/04(土) 13:23:08
最適化されたからって、書き込めなくなるのはおかしいだろ。
0242デフォルトの名無しさん2008/10/04(土) 13:23:55
ないってのは言いすぎだな。
ウンコな処理系ってよくあるから。
0243デフォルトの名無しさん2008/10/04(土) 13:26:29
処理系じゃなくって、コンパイラの問題なの。
0244デフォルトの名無しさん2008/10/04(土) 13:37:36
「処理系」ってコンパイラも含んでるだろ。ふつー。
0245デフォルトの名無しさん2008/10/04(土) 13:39:58
ああ、分野が違うとこうも話が噛み合ないという見本だな。
0246デフォルトの名無しさん2008/10/04(土) 13:44:29
知ったかでしゃべってるのを「分野の違い」にすんなよ。
>>239 が、ポインタ経由だと書き込めないってどんな処理系だよ。
0247デフォルトの名無しさん2008/10/04(土) 13:50:24
>>246
だからさ、世の中には色んなコンパイラがあって、色んな環境で色んなCPUが色んな場所で動いてるわけよ。
その全部のローカルな俺様コンパイラ的な物では定数は全部固定データなワケよ。
特に初期化宣言以降どこに右辺に現れない変数も固定な訳よ。 わかる?
0248デフォルトの名無しさん2008/10/04(土) 13:51:26
>>247
ああ、適正だ。
どこにも左辺に現れない変数な。
0249デフォルトの名無しさん2008/10/04(土) 13:55:33
>>247
定数を書き込み禁止領域に置くコンパイラってこと?
それごく普通のコンパイラじゃん
文字列リテラルを書き換えようとして落ちるのはANSI仕様上も問題ない

知ったか乙
0250デフォルトの名無しさん2008/10/04(土) 13:55:43
どうやら今日は誤字が多いのでこの辺で消える。
0251デフォルトの名無しさん2008/10/04(土) 13:56:24
というか日本語の上手な人か
言わんとすることはわかったよ
0252デフォルトの名無しさん2008/10/04(土) 13:57:51
>>247
おたくの「分野」の、どのコンパイラでそういう最適化をするのか書けばいっぱつで終了する話題だろ。
0253デフォルトの名無しさん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";

とかすると、落ちるとか普通にある訳よ。
0254デフォルトの名無しさん2008/10/04(土) 14:02:56
まあ、コンパイラがANSIに沿ってないってオチなんてドコにでもあるわけで。
そんな事言ってちゃ、ここでマトモな議論が出来なくなるわけで。
0255デフォルトの名無しさん2008/10/04(土) 14:05:55
>>253
落ちるどころかコンパイルすら通らないだろうな
0256デフォルトの名無しさん2008/10/04(土) 14:06:21
>>253
ふつーにコンパイラのバグだよね。
0257デフォルトの名無しさん2008/10/04(土) 14:08:52
>>256
そだね。
0258デフォルトの名無しさん2008/10/04(土) 15:40:17
まぁ、組み込み系だろうな、そういうコンパイラがあるのは。
PICとかPICとか、あとはPICとか。
0259デフォルトの名無しさん2008/10/04(土) 16:33:17
>>231
> パソコン上ではどちらも書き込めるが、
> ROM化環境などではどちらも固定される事がある。
知ったか乙
汎用OS下でも処理系によって違うんだよ。
そもそもANSI読んだのか?
0260デフォルトの名無しさん2008/10/04(土) 16:37:03
>>258
PIC?あんなヘタレ石に組込みを代表されてたまるかいw
0261デフォルトの名無しさん2008/10/04(土) 16:38:32
>>259
処理系によって異なるのに、ANSI読んでも意味無いだろw
0262デフォルトの名無しさん2008/10/04(土) 16:47:22
>>261
規格で「パソコン上ではどちらも書き込める」ように定められてるかどうか、そうでないか確認するんだから、意味あるだろ。
0263デフォルトの名無しさん2008/10/04(土) 16:48:28
>>262
ANSIにそんな但し書きあるなら見てみるワ
0264デフォルトの名無しさん2008/10/04(土) 16:52:58
>>263
但し書きがないんなら「> パソコン上ではどちらも書き込めるが」ってのはウソってことか?
0265デフォルトの名無しさん2008/10/04(土) 16:55:31
>>264
それはWindows上のVCの実際の動きから書いてるから嘘じゃないだろ。
0266デフォルトの名無しさん2008/10/04(土) 17:05:00
>>265
べつに特定の環境の話はしてないだろ。
書き込める環境もあるし、書き込めないのもあるって話だから、>>231がウソってことになる。
0267デフォルトの名無しさん2008/10/04(土) 17:35:37
いつから汎用機がパソコンという名前になったんだろう? ? ?
0268デフォルトの名無しさん2008/10/04(土) 18:15:05
そもそもこの流れで「パソコン」って表現は意味が無いだろ。
0269デフォルトの名無しさん2008/10/05(日) 16:29:00
ポインタはヤバイぞ・・・
ポインタのポインタとか、
二次元配列のポインタを取る時に
= の右がconstだったりすると左が酷いことになる
まずそんなことはやらないとは思うけど
0270デフォルトの名無しさん2008/10/05(日) 17:05:49
そんなことやってもまあコンパイル時に警告かエラーだけどな。
0271デフォルトの名無しさん2008/10/05(日) 18:49:32
>>270
警告だったら無視する習慣があったら、実行時に死亡だね?
0272デフォルトの名無しさん2008/10/05(日) 22:45:27
警告って事は何かしら書き方間違えているわけで
無視しても問題ないものでもなるべく除去するよう心がけるべき
0273デフォルトの名無しさん2008/10/05(日) 22:46:27
main関数の引数を使ってませんよ的な警告も無視しちゃだめですか
0274デフォルトの名無しさん2008/10/05(日) 22:47:09
Visual C++で警告レベルW4にしてSTLを使ってみれば楽しいよ
0275デフォルトの名無しさん2008/10/05(日) 23:13:45
>>273
int main()でいいじゃない。
argvだけ使って、argcは使っていないというのなら、int main(int, char** argv)で。
0276デフォルトの名無しさん2008/10/10(金) 00:30:51
>>127
> 混乱のもとは、[]記号が、宣言、右辺値、左辺値、それぞれのケースで意味が微妙に違うところ
プリーズ詳しく
0277デフォルトの名無しさん2008/10/16(木) 15:38:48
>>253
誰か突っ込んでやれよ。。
0278デフォルトの名無しさん2008/10/16(木) 15:59:36
突っ込むのも面倒と思われるくらいに呆れられたんでしょ。
t[0] = "0"; とかありえないし。
0279デフォルトの名無しさん2008/10/17(金) 01:41:52
t[0] = '0'; じゃね?
0280デフォルトの名無しさん2008/10/17(金) 09:24:27
>>277
>>255 で既に。
0281デフォルトの名無しさん2008/10/19(日) 10:01:08
main(){
char *t[1];
t[0] = (char *)malloc(072);
t[0] = "0";
puts(t[0]);
}
0282デフォルトの名無しさん2008/10/19(日) 10:08:11
malloc いらんがな
0283デフォルトの名無しさん2008/10/19(日) 12:28:45
>>282
malloc無いとメモリリークしないだろ
0284デフォルトの名無しさん2008/10/20(月) 13:05:51
>>283
しないよ。直後にmain()から抜けているから。
それより、なんで58バイト確保するのかそっちが知りたい。
0285デフォルトの名無しさん2008/10/20(月) 13:58:56
三度の飯より072好きだからだろう。
0286デフォルトの名無しさん2008/10/20(月) 14:12:04
おまえらしってるか

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

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

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

これはどういうことだ?
神は我々に何を訴えようとしているんだ…
0287デフォルトの名無しさん2008/10/20(月) 14:19:28
わからないのことある。
0288デフォルトの名無しさん2008/10/20(月) 14:23:07
無理数なら、そんな数列はどれでも出現するわボケ
0289デフォルトの名無しさん2008/10/20(月) 16:21:49
どれでも? 無理数の定義からやり直せカス
0290デフォルトの名無しさん2008/10/20(月) 16:22:28
むりっす
0291デフォルトの名無しさん2008/10/21(火) 00:27:21
無理数だけに、むりっすうwww
0292デフォルトの名無しさん2008/10/21(火) 10:48:53
大事なことなので日をわけて2回言ったんですね。
0293デフォルトの名無しさん2008/11/03(月) 11:56:34
>>286
なに、オナニーで演習することが大事だといっているのです。簡単なことです。♂も♀も。
0294デフォルトの名無しさん2008/11/06(木) 02:43:45
ポインタで正整数しか指せない時代はもう終わり
そろそろ浮動小数アドレスとか複素数アドレスとか出てきてもいい頃
いやその前に負数アドレスが先か
0295デフォルトの名無しさん2008/11/06(木) 02:45:15
>>294
おまえはなにをいってるんだ?
0296デフォルトの名無しさん2008/11/06(木) 02:59:38
ネタが滑っただけ
0297デフォルトの名無しさん2008/11/06(木) 04:08:47
x64のアドレス空間なんか符号付き整数だといっても差支えないような構成に思える。
0298デフォルトの名無しさん2008/11/06(木) 11:32:02
その昔、8ビットCPUの時代にも最上位ビットでROM空間とRAM空間を区別するのはよくある手でしたが。
0299デフォルトの名無しさん2008/11/06(木) 12:42:45
>>298
それはROMとRAMを32KBずつ割り当ててるだけジャン
0000-7FFF : ROM
8000-FFFF : RAM

今見ると少ないメモリでよくやってたな
0300デフォルトの名無しさん2008/11/06(木) 13:31:51
ROMは下から使ってRAMは上から使うんだから、符号付整数として捉えてもいいじゃんw
0301デフォルトの名無しさん2008/11/06(木) 14:14:32
>>300
32KiB + 32KiB 以外の構成は思いつかないのかアホタレ。
0302デフォルトの名無しさん2008/11/06(木) 14:36:45
それ以外の構成でもスタックを最上位に配置する関係から、アドレス0から上下になるように配置するのが普通だと思うが。
アドレスバスをフルデコードしないでミラーイメージになっている場合もあるだろうけど。
0303デフォルトの名無しさん2008/11/06(木) 16:16:42
例えばRAM48Kだと0x0000〜0xBFFFなわけだが。
0304デフォルトの名無しさん2008/11/06(木) 17:01:51
>>303
素朴な疑問だけど、その環境で0c000h-0ffffhは何もない状態なの?
例えば8080やz80のようにリセット直後にはSPが0になるようなCPUだったら
SPを設定するまでスタックが使えなくて不便だと思うのだけど。

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

>素朴な疑問だけど、その環境で0c000h-0ffffhは何もない状態なの?
ROMがないなどとは一言も書いてないんだけど、何でそう思ったのか。
>8080やz80のようにリセット直後にはSPが0
PCも 0x0000。
0306デフォルトの名無しさん2008/11/12(水) 23:25:21
相対アドレスだって結局はどこかの物理メモリにマッピングされるだろ
0307デフォルトの名無しさん2008/11/13(木) 01:35:59
どうやっても、一意に区別出来る情報の形になるからデジタルなんですよ。
0308デフォルトの名無しさん2008/11/14(金) 19:05:44
かならずしも物理メモリにマッピングされてるとは限らないだろ。
I/Oだったり、スワップアウトされてたり。
0309デフォルトの名無しさん2008/11/15(土) 01:37:09
論理メモリーには物理メモリーにマッピングされていない闇の空間がある。
0310デフォルトの名無しさん2009/01/23(金) 12:26:31
ポインタってアドレス型とかいう名前にしとけばよかったのに
0311デフォルトの名無しさん2009/01/23(金) 14:21:34
アドレスという概念を抽象化したかったのでは?
0312デフォルトの名無しさん2009/01/23(金) 14:46:00
実際、アドレスひとつに1バイト割り当てられてたわけじゃないし。
0313デフォルトの名無しさん2009/01/23(金) 17:24:59
ポインタは別に難しくない。
ポインタが難しいと勘違いされているのは、Cでは「配列のサイズチェックをしない」というポリシーがある
ために、バグで配列の範囲外をポイントしてしまったとき、デバッグが難しくなるからだ。
また、1個のオブジェクトへのポインタも、オブジェクトの配列へのポインタも、同じに扱われることも
(これも、大きな意味では「サイズチェックをしない」ことの弊害だ)難しさを倍加している。
もしこれが、「オブジェクトへの参照」であり、更に、「確保されたオブジェクト範囲外をアクセスすると
アサーションが発生する」という仕様であれば、ポインタなんて全然難しくない。
結局ポインタのせいにしているだけで、ポインタが難しいと思っている人は、
Cの「出来る限り高速に、出来る限りチェックは省き、プログラマは完全無欠であるべき」
というポリシーに付いていけないだけだと思う。
0314デフォルトの名無しさん2009/01/23(金) 20:48:11
付いていけないから難しいと言うわけで
0315デフォルトの名無しさん2009/01/24(土) 00:09:38
ポインターってのは、Cが、アセンブラのへのラッパー言語だと割り切れる奴しか扱えないんだよ。
0316デフォルトの名無しさん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は変数、$をつけるとその値、とまあ参照レベルが統一されている。

と、ポインタわからんという人がなぜ出るのかを考えていたらそういうこともあるんじゃねーのかな、という結論に至った。
0317デフォルトの名無しさん2009/01/26(月) 11:28:07
>>316
それは、理解できる人間の理屈。理解できない人はそんなレベルで理解できていないわけではない。
ある意味、虫食い算は計算できるのに方程式が解けないと嘆く中学生のようなもんだ。
0318デフォルトの名無しさん2009/02/04(水) 11:04:42
ポインタの記号ってドルマークの方が良かったと思う
アスタリスクだと掛け算とごっちゃになるから嫌いなんだよ
0319デフォルトの名無しさん2009/02/04(水) 11:31:18
単項演算子が二項演算子とごっちゃになるとは
是如何に。
0320デフォルトの名無しさん2009/02/04(水) 14:20:23
a*=b と a=*b とか
a**b とかじゃないの?
0321デフォルトの名無しさん2009/02/04(水) 18:13:00
a+++++b ?
0322デフォルトの名無しさん2009/02/04(水) 21:24:04
*a*b
0323デフォルトの名無しさん2009/02/05(木) 08:40:05
>>318
>>6

>>320
大昔のHP-Cで =* という独自拡張された演算子
(*= と同じなんだけど、式の値は演算“前”の左辺) があって
a=*b なんて書くと「ambiguous だぜ。演算子の後ろに空白入れな。」
という警告をくらったのを思い出した。
bがポインタかどうかで判断つくだろうに。
つか、誰が得するんだあの拡張。
0324デフォルトの名無しさん2009/02/05(木) 11:58:49
>>323
無能なプログラマほど、空白を詰めて書きたがる。
で、そういう馬鹿なミスをやって人件費を無駄遣い。
それからな、=* の類は「独自拡張」じゃないぞ。
0325デフォルトの名無しさん2009/02/05(木) 12:33:45
>>324
>無能なプログラマほど、空白を詰めて書きたがる。
for 内部の代入は空白あけないぞスタイルだったもんで。

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

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

つか、>>325 程度で「上から目線」て
どんだけ繊細なんだ。
>>326 みたいな言われ方したら
ショックで死ぬんじゃないの?
ご自愛下さい。
03283272009/02/05(木) 14:05:22
×>>326 みたいな
○>>324 みたいな
0329デフォルトの名無しさん2009/02/05(木) 18:19:53
C++のイテレータってのはポインタ使って動いてるんだよな?
0330デフォルトの名無しさん2009/02/05(木) 18:26:01
特にvectorとかでそういう実装はあり得る。
でも、listなど中の実装もそうであるとは限らない。

もちろん、使う側の見かけはもちろんポインタの模倣だけど。
0331デフォルトの名無しさん2009/02/05(木) 20:35:39
ほうほう,ありがと
0332デフォルトの名無しさん2009/02/05(木) 22:35:51
vector は VC++6 あたりではポインタだったような気がする。
今はポインタで実装してる方が珍しいと思うが。
0333デフォルトの名無しさん2009/02/07(土) 12:47:03
if for 変数 なんかの説明と比べればポインタは難しいよ
一度、誰かに教えようとすれば説明のし辛さが解る
0334デフォルトの名無しさん2009/02/07(土) 13:46:19
文字と文字列の扱いの違いから説明してるけどな
まぁ配列の扱い方とポインタの扱いがちょっと似てるからだけど
入りとしてはやさしいとおもってやってる
0335デフォルトの名無しさん2009/02/12(木) 13:08:00
操作的意味論を使ってポインタを理解したい
0336デフォルトの名無しさん2009/02/12(木) 23:05:20
ポインタの理解度段階付け

0.javaマンセー
1.ポインタを使ったプログラムが読める
2.ポインタの使い方が解る。
3.ポインタを効果的に使える。
0337デフォルトの名無しさん2009/02/12(木) 23:08:15
ex.ポインタを誰でも分かるように説明できる
0338デフォルトの名無しさん2009/02/12(木) 23:13:48
間接参照のセマンティクス
0339デフォルトの名無しさん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;
}
0340デフォルトの名無しさん2009/02/13(金) 11:12:02
>>337
猿や犬、またはそれに類する人間には
どう頑張ったところで理解できません。
0341デフォルトの名無しさん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 *)までたどり着けるか教えてください
 脳みそ取り替えたいくらいです
 脳みそ取り替えてください本当に
0342デフォルトの名無しさん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]ですか?
 さっぱりわかりません脳みそとりかえたいくらいです 助けてください
0343デフォルトの名無しさん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は、もう寝たか?
0344デフォルトの名無しさん2009/02/18(水) 02:00:58
コピペにマジレスしてみるが、

ポインタをきちんと分かってる人は、こんな不可解なポインタの使い方はしないな。
0345デフォルトの名無しさん2009/02/20(金) 01:47:12
しなくてもいいけど読めないならやり直せ
そういう人がC使うと危ない
0346デフォルトの名無しさん2009/02/20(金) 02:07:32
エンディアン、ウソつかない
0347デフォルトの名無しさん2009/02/20(金) 22:34:09
LLP64環境でやったらマジ脂肪だな
0348デフォルトの名無しさん2009/02/22(日) 12:39:43
longは8バイトって但し書きがあるじゃん
0349デフォルトの名無しさん2009/04/11(土) 17:28:18
こやつめw
0350デフォルトの名無しさん2009/07/02(木) 06:59:02
>>343まったくわからない
0351デフォルトの名無しさん2009/07/02(木) 10:13:40
>>350
まあ、規格上はそれが正解。
0352デフォルトの名無しさん2009/07/02(木) 15:50:52
質問内容は「予想」なんだけどな
0353デフォルトの名無しさん2009/07/03(金) 00:48:58
ミドルエンディアンの場合も想定してはじめて満点とか
0354デフォルトの名無しさん2009/07/11(土) 19:10:35
>>352
だから「この設問の条件では予測不可能」という回答なんだろ
0355デフォルトの名無しさん2009/07/12(日) 14:19:04
>>354
キミは0点
0356デフォルトの名無しさん2009/07/13(月) 09:49:40
寧ろこっちから「この問題はデキが悪い。0点」と言い放つ。
0357デフォルトの名無しさん2009/07/13(月) 15:40:13
そうやって逃げてばかりいるから、そんななんだよ
0358デフォルトの名無しさん2009/07/13(月) 17:40:34
どんなだw
0359デフォルトの名無しさん2009/07/13(月) 18:33:36
>>346って答えておけばいいんだろ。
これ言われてピンとこなかったら出題者がアホ
0360デフォルトの名無しさん2009/07/14(火) 11:28:38
「予想せよ」だから、ありそうな順にいくつか答えるって手もあるのかな?
0361デフォルトの名無しさん2009/08/26(水) 03:09:13
ポインタなんてbrainf*ck使えばわかるよ
0362デフォルトの名無しさん2009/09/01(火) 02:43:45
超初心者の質問ですが、いいですか?

int v,*po;

po=&v;

*po=300;

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

char *jk;

jk="jyosikousei";


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

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


0363デフォルトの名無しさん2009/09/01(火) 02:45:34
'j'の文字が格納されているアドレスの先頭、でした
0364デフォルトの名無しさん2009/09/01(火) 06:50:59
>>362
文字列は代入されてない
"jyosikousei"がchar*型だからcharポインタが代入されてる
0365デフォルトの名無しさん2009/09/01(火) 07:09:03
>>364

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

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

int *i;

i=100;

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

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

あと "jyo" というローマ字はヘボン式としても訓令式としても正しくない
0367デフォルトの名無しさん2009/09/01(火) 11:18:32
>あと "jyo" というローマ字はヘボン式としても訓令式としても正しくない
しかし、一般に流布している。
0368デフォルトの名無しさん2009/09/01(火) 11:21:02
スレタイに沿うなら、>>362 に対しては
「なんでそんなことも判らんのか判らん」
で終わりなのに、なんて親切な奴だ。惚れそう。
0369デフォルトの名無しさん2009/09/01(火) 11:21:15
>>367
言い訳すんな無能
0370デフォルトの名無しさん2009/09/01(火) 12:21:45
>>369
私は突っ込みを入れただけだ。>362なんかと一緒にするな。
0371デフォルトの名無しさん2009/09/01(火) 15:25:18
Cのポインタの難しい(かつ便利)なところは、こんなふうに1個のオブジェクトへのポインタなのか、
オブジェクトの配列へのポインタなのか、区別がつかないところなのだなあ。詠嘆調。
0372デフォルトの名無しさん2009/09/01(火) 19:05:30
char (*a)[2] ; /* 配列へのポインタ とかいってみる いや、言ってることは解ってるけど*/
0373デフォルトの名無しさん2009/09/02(水) 00:21:58
>>365
>int *i;
>i=100;
>だと、iがどの変数のアドレスを指しているか決定されていないからNGでしょう

いいえ
どの変数のアドレスを指しているか決定されていないからNGなのは
*i = 〜; であって i = 〜; ではありません
同様に *jk = 〜; はダメですが jk = 〜; は問題ない
0374デフォルトの名無しさん2009/09/02(水) 09:30:52
int *i;
i=100;
これはポインタ指定だからオK。

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

って事だぁね
0375デフォルトの名無しさん2009/09/02(水) 10:41:18
i = (int*)100;
と書いて欲しい
0376デフォルトの名無しさん2009/09/04(金) 01:04:04
>>371
区別がつく必要ある?
0377デフォルトの名無しさん2009/09/04(金) 11:10:01
区別がないから初心者には難しいんだよなって言ってるのがわからんのかマヌケ
0378デフォルトの名無しさん2009/09/06(日) 13:33:14
マヌケはお前だ。

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

必要性と可能性の違いもわからんのか。
0379デフォルトの名無しさん2009/09/06(日) 13:58:12
二日も考えてその程度のレスしか出来んとは気の毒なアタマだな(プ
0380デフォルトの名無しさん2009/09/06(日) 16:10:58
区別をしないというのがC言語の(設計者の)選択。
0381デフォルトの名無しさん2009/09/06(日) 22:28:32
煽りはともかくとして、結局どういう風に難しいのか一言も言えてないじゃん。
0382デフォルトの名無しさん2009/09/07(月) 14:58:57
難しいと思うのは本人のセンスのせいで、
ポインタのせいでは無い。
0383デフォルトの名無しさん2009/09/07(月) 17:40:52
配列名の値がアドレスになるのがわかりにくいというか、誤解の元になってるとは思う。
それが難しいかどうかは知らん。何でそうなるのかぐらいわかれとも思うが。
0384デフォルトの名無しさん2009/09/08(火) 10:57:11
○記号の問題
 *, &, などの変てこな記号が入り乱れ、学習者にとっては「うかつに近づくな」気配がぷんぷんする。
○配列の問題
 int* p; としたpが1個のオブジェクトを指しているのか、配列のアドレスを指しているのか区別が無い。
 その「区別が無い」という概念を理解することが重要なのに、大抵の教科書には
 表面的な「アドレスである」という表記しかないので混乱の元になっている。
○バグりやすい問題
 ポインタはオブジェクトを指してこそ意味があるのだが、cでは文法上オブジェクトの範囲外でも
 平気でアクセス出来てしまう。例えばchar buf[256];としたbufをサブルーチンに渡し、buf[800] = 'x';
 とか出来ちゃう。そしてバグる。こういう「他の(高級)言語では有り得ないバグ」が難しいと思わせる原因。
0385デフォルトの名無しさん2009/09/08(火) 11:06:01
プログラミングや計算機の初心者には、
うかつに近づかないでほしい。
0386デフォルトの名無しさん2009/09/08(火) 13:04:50
オブジェクトじゃなくて、メソッドを指してるんじゃね?
0387デフォルトの名無しさん2009/09/08(火) 14:50:07
誤爆?
0388デフォルトの名無しさん2009/09/08(火) 15:26:57
記号の問題に関しては、初心者は見よう見まねでperlいじったりするみたいだが。
0389デフォルトの名無しさん2009/09/08(火) 15:27:27
あー、perl自体じゃないよ。スクリプトね
0390デフォルトの名無しさん2009/09/08(火) 20:36:10
>>384
2項目目の意味がよくわからないな。
ポインタはアドレスを指すだけだろ。
なんだよ「区別」って。
0391デフォルトの名無しさん2009/09/09(水) 10:59:59
>アドレスを指す
0392デフォルトの名無しさん2009/09/11(金) 16:47:33
とりあえず動かしたくないポインタは*constにすりゃいいんじゃね
0393デフォルトの名無しさん2010/01/07(木) 19:05:12
どうしてポインタは*を選んだのだろうか
$でも良かったでしょ
0394デフォルトの名無しさん2010/01/07(木) 19:31:33
ポインタに1足したら、2byteとか4byteとか進む?
ポインタってアドレスなんだろ?
そんなもん1進むに決まってるんじゃないのか?
0395デフォルトの名無しさん2010/01/07(木) 20:05:12
ポインタには、どこを指してるかと指してるものの型の2つの情報がある。
後者を説明してない解説は結構多い。
0396デフォルトの名無しさん2010/01/08(金) 06:38:25
>>394
ポインタはアドレスではないかも知れない。
特に、アドレスがバイト単位にふられてない場合は確実に。
今時あるのかどうか知らんが。
0397デフォルトの名無しさん2010/01/08(金) 14:10:51
>>55
禿しく同意。
ここまでアナルが出てないってどういうことだよな
0398デフォルトの名無しさん2010/01/16(土) 02:47:52


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

それでも解らないならオープンソースのコンパイラを解析するしかないんじゃないかと。
0400デフォルトの名無しさん2010/01/17(日) 12:39:40
もしかして8bit
0401デフォルトの名無しさん2010/01/17(日) 13:55:11
ポインタがそういう仕様だ、ってだけだろ。
0402デフォルトの名無しさん2010/01/17(日) 15:51:54
ポインタが指しているのは、アドレスじゃなくオブジェクト
0403デフォルトの名無しさん2010/01/17(日) 21:03:52
>>399
>たとえば、32bit整数型は1byte(8byte)では収まらない。4byte(32bit)必要だよな?だから4byteずつ進むのは間違いではないよ
うそはいかん。ポインタへのポインタだったら4バイトずつ進むが、型のサイズ分のバイト数がすすむ。
つまり、sizeof 型 だけ進む。 なぜかって?そのほうが都合がいいから。
0404デフォルトの名無しさん2010/01/22(金) 14:23:05
だから、ポインタが指しているのは、アドレスじゃなくオブジェクト
ポインタを1つ進めるということは、次のオブジェクトを指すというだけの話

アドレスが○○バイト進むというのは、ポインタが次のオブジェクトを指したという結果であって、ポインタの理解としては正しくないと思うよ
0405デフォルトの名無しさん2010/01/23(土) 09:04:53
>>404
なるほど。たしかにそう考えるとわかりやすいかも。
0406デフォルトの名無しさん2010/01/24(日) 17:31:42
そもそも配列概念の実装がポインタ演算なんだから
0407デフォルトの名無しさん2010/01/24(日) 18:23:13
>>406
その言い方だと、Cにとって関数の実装だってポインタじゃん
0408デフォルトの名無しさん2010/01/24(日) 22:20:39
>>407
お前が何を言っているのかわからねー
0409デフォルトの名無しさん2010/01/24(日) 22:26:45
古い情報だけど、ちょとここに置いときますね。
http://www.kouno.jp/home/c_faq/c6.html
0410デフォルトの名無しさん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;

って例もあるってことだろ
0411デフォルトの名無しさん2010/01/25(月) 01:00:03
>>410
そりゃ関数ポインタであって
// 外部リンケージの実装上、間接呼び出しになるものを除いて
通常の関数のどの辺がポインタなのかと問うているんだが。
0412デフォルトの名無しさん2010/01/25(月) 19:02:00
>>411
配列をポインタだと言うなら、関数も単にアドレスをコールしてるだけの代物だろう
配列概念がポインタだとか言う乱暴な話をすんなってこった
0413デフォルトの名無しさん2010/02/08(月) 09:05:06
ポインタが難しいというより文法が混乱の元。
ひとつの変数でアドレスと示す値の2つが出てくるからいけない。

int *sex;
static cinco = 072;
sex = &cinco;
cinco = (int)sex;//アドレス
cinco = (int)&sex;//ポインタのポインタ
cinco = *sex;//ポイッタが示す値
0414デフォルトの名無しさん2010/02/08(月) 09:26:55
ひどいコードだ
0415デフォルトの名無しさん2010/02/09(火) 10:09:34
それじゃただのオナニーだ
0416デフォルトの名無しさん2010/02/09(火) 14:28:02
いやー、なんだ、その

僕は初めてマックのプログラムを作った時、
ポインタのポインタ、というのがあまりにも便利すぎて衝撃を受けたけどな。
0417デフォルトの名無しさん2010/02/09(火) 14:31:04
ハンドルか
0418デフォルトの名無しさん2010/02/09(火) 14:48:34
>>417
WinNT.h(344)
typedef void *HANDLE;

無知哀れ
0419デフォルトの名無しさん2010/02/09(火) 14:53:40
ハンドルなんて、ポインタの配列のインデックスだったり色々。
0420デフォルトの名無しさん2010/02/09(火) 15:16:15
>>418
マックだと書いてるだろ、アホ
0421デフォルトの名無しさん2010/02/09(火) 15:21:50
実際、昔のMacとか16bitWindowsの頃は、メモリ配置がしょっちゅう動いてたから
ポインタのポインタを使わざるを得なかったな。
x386でCPUがサポートしたからこの概念も意味が薄れたが
0422デフォルトの名無しさん2010/02/09(火) 15:50:18
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。

これ、なんか違わなかったけ
0423デフォルトの名無しさん2010/02/09(火) 16:24:58
>>3以降しばらくその話なのにおまいときたら
0424デフォルトの名無しさん2010/02/09(火) 18:58:46
>>422
用途によるだろ
ただ表示させるだけならどっちでもいいし
0425デフォルトの名無しさん2010/02/09(火) 19:59:11
なんか違うじゃなく、全然違う

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

読めるから書けるわけではない...
0426デフォルトの名無しさん2010/02/09(火) 23:12:17
初心者には配列とポインタが明示的に区別されるDelphiを使わせるべき
0427デフォルトの名無しさん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);
0428デフォルトの名無しさん2010/02/10(水) 06:16:18
>>427
以下エラー、の部分は、処理系によってはエラーにならない。
こっちの方がいい。

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

str1 = "bcdef"; //エラー
printf(str1);
0429デフォルトの名無しさん2010/02/10(水) 06:40:59
>>428
>以下エラー、の部分は、処理系によってはエラーにならない。
警告ならまだしも、エラーになるような標準から外れた処理系は嫌だな。
0430デフォルトの名無しさん2010/02/10(水) 08:14:02
>>429
コンパイルエラーじゃなくて実行時エラーのことだろ。
わざわざ以下、エラーって変な言葉で書いてるんだし。
0431デフォルトの名無しさん2010/02/11(木) 10:06:25
コンパイラー通って実行でエラーって 最悪じゃん
0432デフォルトの名無しさん2010/02/11(木) 10:42:31
str2は、定数へのポインターになっているが、ポインターの定義は定数になっていないからコンパイルエラーは出ねぇよ

だからと言って、プログラマは、str2の示すメモリ領域が自由に読み書きできると期待してはいけない
0433デフォルトの名無しさん2010/02/11(木) 10:59:54
const char * const str
0434デフォルトの名無しさん2010/02/11(木) 11:44:56
実行時に例外なりプロセス異常終了なりするのは
あんまり「エラー」とは言わないと思うんだが。まあいいや。

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

問題は、領域が何指してるのかわからなくなるとか
上に出てた文字定数へのポインタなんか序の口だが
表記的にわかりにくいとかそういう副次的な面
0436デフォルトの名無しさん2010/02/13(土) 10:21:14
結局C言語の仕様が悪い。

0437デフォルトの名無しさん2010/02/13(土) 10:38:00
ポインタが難しいというより
ポインタを難しいと脅かしたり、有用な使い道を教えない(教えられない)
クソ本、クソサイトが跋扈していることが理解できない
0438デフォルトの名無しさん2010/02/13(土) 13:07:44
実際難しいだろ。
newしたポインタをうっかりコピーして、両方でdeleteしたり、
配列の先頭アドレスを渡すと渡した先ではポインタになって、
配列のサイズがわからないからサイズを超えてアクセスしたり、
1個のオブジェクトへのポインタなのか配列へのポインタなのか
区別がつかないからバグの元になったり。
ポインタでなく参照にすれば、いくつかの難しさは取り除けたはずだが、
70年代の言語にそれを求めるのは酷というものだ。
(当時のCPUでの)現実的なコンパイル時間という制約もあるし。
0439デフォルトの名無しさん2010/02/13(土) 13:26:24
ポインタを理解するためにはオブジェクト指向を理解しないとね
でも、C++を始めるなら、Cでポインタ位は覚えてないと難しいよねwwwwww
0440デフォルトの名無しさん2010/02/13(土) 23:35:19
>ポインタを理解するためにはオブジェクト指向を理解しないとね
どうして?
0441デフォルトの名無しさん2010/02/14(日) 09:53:55
簡単なので良いからアセンブラやるのが
遠回りかもしれないけど良いと思うよ。
0442デフォルトの名無しさん2010/02/14(日) 10:02:41
C。C++でええやん。
なんでわざわざポインタのためだけに他の言語に手をだすのか・

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

で、オブジェクトって何ぞやってのは、オブジェクト指向を覚えれば分かるよ
0444デフォルトの名無しさん2010/02/14(日) 10:14:24
オブジェクト指向のオブジェクトと、Cとかでいうオブジェクトを同一視するの?
0445デフォルトの名無しさん2010/02/14(日) 10:24:07
>>444
どっか、違うの?
違うと言うなら詳細に説明してほしいねぇ
0446デフォルトの名無しさん2010/02/14(日) 10:28:01
オブジェクト指向のオブジェクトは概念、仕様、実装という3つのレイヤーを含むけど
Cとかでいうオブジェクトは実装レベルのオブジェクトだけを挿す

参考:
デザインパターンとともに学ぶオブジェクト指向のこころ (Software patterns series): アラン・シャロウェイ, ジェームズ・R・トロット, 村上 雅章:
0447デフォルトの名無しさん2010/02/14(日) 10:36:48
バカがバカに答えるからこうなる。。。
Cのオブジェクトとは、名前付きのメモリ領域のこと。
0448デフォルトの名無しさん2010/02/14(日) 10:40:06
その定義のソースキボンヌ
0449デフォルトの名無しさん2010/02/14(日) 10:43:05
>>448
K&R 2nd
0450デフォルトの名無しさん2010/02/14(日) 10:47:49
thx
0451デフォルトの名無しさん2010/02/14(日) 10:47:54
ANSI Cの定義(Definitions of terms)を読めば書いてある。
0452デフォルトの名無しさん2010/02/14(日) 10:52:24
thx
0453デフォルトの名無しさん2010/02/14(日) 10:54:26
ちょっwwwww
> Cのオブジェクトとは、名前付きのメモリ領域のこと。
って、C++のオブジェクトは?

オブジェクト指向だろうが、そうでなかろうが、オブジェクトってのは
「コンピューター内で有意なデータの集まり」だろ
そのオブジェクトをいかに合理的に使うかという方法論が、構造化プログラミングであり、オブジェクト指向じゃん
0454デフォルトの名無しさん2010/02/14(日) 11:08:30
>>446 が書いてるけどレイヤが違うんだって。
仕様書は高いからDraftだけど、
The C++ object modelには
> An object is a region of storage
0455デフォルトの名無しさん2010/02/14(日) 11:23:02
で、ポインタを理解するためにはオブジェクト指向を理解しないといけない理由は?
0456デフォルトの名無しさん2010/02/14(日) 11:38:31
ポインタが指すものがオブジェクトだから
0457デフォルトの名無しさん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《                    〔
0458デフォルトの名無しさん2010/02/14(日) 23:52:01
>>455
以下、莫迦を弄るの禁止。
0459デフォルトの名無しさん2010/02/15(月) 04:42:26
ポインタが指してるのはデータだぞ。
0460デフォルトの名無しさん2010/02/15(月) 14:57:10
ポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタ
0461デフォルトの名無しさん2010/02/15(月) 15:22:16
いわゆるひとつのNullable Reader Comonad
0462デフォルトの名無しさん2010/02/17(水) 14:18:25
ポインタ嫌いになる原因は
*dst++=*src++;
こんなのやるから
それかsignal()のポロトタイプで挫折。
0463デフォルトの名無しさん2010/02/17(水) 15:31:25
>>462
68030のコンパクトで美しいコードを出力する良いプログラムじゃねえか。
move.l (src)+,(dst)+
0464デフォルトの名無しさん2010/02/18(木) 01:47:43
C言語が糞だからポインタを難解にしていると何度言えばわかるのかね?
0465デフォルトの名無しさん2010/02/18(木) 08:07:45
>>464
その理由を相手が納得しない限り
何どいってもわかるわけがないだろ?
馬鹿ですか?
0466デフォルトの名無しさん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)' で戻り値 :(;゙゚'ω゚')…
0467デフォルトの名無しさん2010/02/18(木) 20:14:35
>>466
#define OPEN (
#define CLOSE )
typedef int Integar;
typedef void (*TYPE_)(Integar);
TYPE_ signal OPEN Integar, TYPE_ CLOSE;
0468デフォルトの名無しさん2010/02/19(金) 05:27:01
void( *signal( int signum, void ( *handler )(int) ) )(int){ return handler; }
0469デフォルトの名無しさん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
0470デフォルトの名無しさん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
0471デフォルトの名無しさん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の書き込み規約よく読め
0472デフォルトの名無しさん2010/02/27(土) 19:25:21
bsearchの戻り値って、その要素へのポインタを返すってあるんだけど。
int *p;
int a[100];
p=(int *)bsearch(....
ポインタを返すっていうよりメモリアドレスを返してない?
nで見つかったとしたら &a[n]のアドレス

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

ポインタとメモリアドレスの違いを教えてください。
0473デフォルトの名無しさん2010/02/27(土) 20:05:11
右辺値だし良いんじゃね?
0474デフォルトの名無しさん2010/02/27(土) 20:54:18
>>472
『ポインタ』の意味は文脈によって変わる。
ポインタ型変数のことを指す場合もあれば、ポインタ値(=アドレス)を指すこともある。
0475デフォルトの名無しさん2010/02/28(日) 00:07:22
>>472
ポインタ=オブジェクトの存在するメモリ空間の先頭アドレス
ポインタ変数=値としてポインタを保持する変数
int *pはint型のオブジェクトに対するポインタを保持する変数
としてpを宣言するという意味になる。
>>474
変わるわけ無いだろ、お前が混同してるだけちゃうんかと小一時間(ry
0476デフォルトの名無しさん2010/02/28(日) 11:27:19
俺は数学科だから事情をよく知らんのだが、
情報科学の分野では用語の整備が出来てないのか?
情報科学の分野における「ポインタ」という言葉の
標準的な定義は何なの?

日本語版&英語版のWikipediaでは、「ポインタ」という言葉は
"アドレス"ではなく"変数"の方で定義してあるようだが、
これが標準的な意味なのか?
0477デフォルトの名無しさん2010/02/28(日) 12:05:23
明確に分けたければ、ポインタ変数と言えばいい
0478デフォルトの名無しさん2010/02/28(日) 15:38:35
ポインタ定数(リテラル文字列とかメモリマップトI/Oのアドレス)
というものもあるのでポインタ=変数というのは明確な間違い。
あくまでオブジェクトのタイプとして整数、共用体、クラスなどと
同列の存在として存在する。
int i,j;を定義して整数i,jと表現するのと同様にvoid *p;を定義して
ポインタpと表現することはあるが、あくまでポインタは変数pの
保持するオブジェクトのタイプであり変数そのものではない。
混同するのは概念が理解できてないだけ。
0479デフォルトの名無しさん2010/03/01(月) 00:34:17
値がアドレスか、アドレス自体かの違い
0480デフォルトの名無しさん2010/03/01(月) 08:18:33
>>476
>情報科学の分野における「ポインタ」という言葉
一般用語としての「ポインタ」なんてもんはない。
各言語の規格をあたれ。
0481デフォルトの名無しさん2010/03/20(土) 07:58:32
JavaHouseでポインタの出自が議論になってたのを思い出した
0482デフォルトの名無しさん2010/03/21(日) 20:05:20
Javaの参照はポインタ
0483デフォルトの名無しさん2010/03/21(日) 22:34:27
わかってます

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

あれだろ、猟犬で獲物の方向を見て動かない犬種。
あれが確か「ポインター」
0485デフォルトの名無しさん2010/03/23(火) 12:49:09
C/C++で、*や&以外で空いている記号は、 @と$くらいか。

char$ argv;
int@ test;

微妙…
0486デフォルトの名無しさん2010/03/25(木) 22:54:34
***** おおっと *****
0487デフォルトの名無しさん2010/03/26(金) 01:05:31
ポインタのポインタを引数に取ってポインタの値を変える関数を見かけますが
普通にポインタに代入するだけで済むような気がするのですが……
0488デフォルトの名無しさん2010/03/26(金) 02:16:20
マックのツールボックスの事か?
0489デフォルトの名無しさん2010/03/26(金) 17:13:17
>>487
値渡しをちゃんと理解しよう。

引数が値渡しだから
「引数に与えられた変数の値を書き換えるにはその変数のポインタが必要」
なのが理解できていたら
書き換えようとする変数がポインタの場合は、
「引数に与えられたポインタの値を書き換えるにはそのポインタのポインタが必要」
になるのも理解できるはずだ。
0490デフォルトの名無しさん2010/03/26(金) 21:04:42
>>489
ありがとうございました
目からうろこがおちました
ポインタを取って逆参照に代入が基礎ですね
勉強になりました
0491デフォルトの名無しさん2010/03/26(金) 23:56:57
>>485
C++/CLIだと(ポインタの意味ではないけど)^や%が出てくるぞ。int^とかchar%とか。
0492デフォルトの名無しさん2010/03/27(土) 06:36:58
C++/CLIの変態さは標準化に失敗したレベルだからな
0493デフォルトの名無しさん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";
になるのかな?

多次元配列の一種だと思ってたけど、どう違うん?
0494デフォルトの名無しさん2010/03/27(土) 23:49:33
char str[] = "abcde"; は配列
char * str = "abcde"; はどこかにある配列を参照するポインタ
全く違う
0495デフォルトの名無しさん2010/03/27(土) 23:52:34
下は、const static char*なポインタ変数だよね。
0496デフォルトの名無しさん2010/03/28(日) 00:05:24
どっからconst staticが出てきたんだよ
0497デフォルトの名無しさん2010/03/28(日) 08:48:41
>>494
C FAQ 6.2嫁
04984972010/03/28(日) 08:52:14
× 474
○ 473
0499デフォルトの名無しさん2010/04/07(水) 17:39:58
じゃあ、JavaScriptなんかでポインタを表現するとどうなる?
PerlやPHPでも可。
0500デフォルトの名無しさん2010/04/07(水) 18:34:11
その辺は参照(リファレンス)が一番近い概念じゃないのか?
0501デフォルトの名無しさん2010/04/11(日) 17:38:06
ポインタはCPUが使うポインタ
リファレンスはコンパイラが使うポインタ?
0502デフォルトの名無しさん2010/04/12(月) 01:33:18
コンパイラというか、処理系?
0503デフォルトの名無しさん2010/04/12(月) 13:29:00
いいえ。
0504デフォルトの名無しさん2010/05/28(金) 19:21:06
ポインタや参照の値渡しを参照渡しと呼ぶ奴は素人
0505デフォルトの名無しさん2010/06/09(水) 15:13:32
ポインタはポインタだし
参照の値渡し?は参照渡しだろ
0506デフォルトの名無しさん2010/06/10(木) 10:56:54
ポインタの参照渡しはあっても
参照のポインタ渡しはない
0507デフォルトの名無しさん2010/06/11(金) 14:00:17
ポインタという言葉を適切な日本語に意訳したほうがいい。
0508デフォルトの名無しさん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になる
0509デフォルトの名無しさん2011/05/05(木) 04:45:44.69
0510デフォルトの名無しさん2011/06/08(水) 20:26:32.43
ポインタがマジでわかりません。

int * const (*(*funcsMap[FUNCS])())(int * const (*)());

はがしたいのでしょうか?
0511デフォルトの名無しさん2011/06/08(水) 20:44:55.64
>>34
今さらで、かなりの遅レスなのは分かってるけどさ。

理論から入る?笑わせんな。この程度の動作を理解できない分際で、何が理論から入るだ。
「こういう動作をする」
そういうサンプルを見れば、本当に理論から入るやつは「こういうものに使えます」なんて
手を差し伸べられる必要もなく理解できるし、自分で使いどころを見つけられるわ。

自分で考える程度の、人間として最低限の能力も足りない分際が、よりによって「俺は理論から入るから、誰かに手とり足とり教授してもらわないと何もできないの。」って
ふざけてんのか?


うん、凄く汚い口調になってしまってすまない。
ただ、こういう「自分が出来ないのはこういう周りが悪い」っていう態度が凄く気に食わなかったんだ。
0512デフォルトの名無しさん2011/06/08(水) 20:47:16.28
宣言してるとこじゃなくて、使ってるとこ見ないと
0513デフォルトの名無しさん2011/06/08(水) 22:52:01.05
>>510
引数無しでintへのポインタを返す関数へのポインタを引数にintへのポインタを返す関数へのポインタを返す引数無しの関数へのポインタへのポインタの配列

だと思うが携帯からなんであんま自信ない。
さすがにそこまでいくとコンパイルして確かめたい。
0514デフォルトの名無しさん2011/06/09(木) 00:08:31.18
>>510
スレチ

スパゲッティなの出してきてgotoがわからないとか言ってるようなもの
0515デフォルトの名無しさん2011/06/09(木) 00:13:35.68
>>514
理解できないなら、素直にそういえよw
0516デフォルトの名無しさん2011/06/09(木) 06:44:43.17
>>514
いや、でも上の文は「ポインタが難しい」と言われる要因の1つを表してると思うよ。
要は「非常に読みにくい」のよ。特に関数ポインタは。
もうちょっと何とかならんかったんかな、あれ。
0517デフォルトの名無しさん2011/06/09(木) 10:47:22.68
自分で書いててもtypedefとかですっきりさせたくなるもんな
0518デフォルトの名無しさん2011/06/09(木) 20:04:35.85
>>510

こんなマゾ的なオカルトコード知ってても何の得にもならんよ。
周囲に害悪を垂れ流すのみ。
0519デフォルトの名無しさん2011/06/09(木) 22:38:33.37
難しさが理解できないって理解してないからだよ
0520デフォルトの名無しさん2011/06/09(木) 23:14:13.41
関数ポインタのテーブルの宣言みたいだけど
0521デフォルトの名無しさん2011/06/10(金) 01:53:53.53
結局、誰も分からないみたいですね
0522デフォルトの名無しさん2011/06/10(金) 02:24:03.39
関数ポインタなんて本来そこまで難しい概念じゃないんだぜ?
それが何故あそこまで読みにくいコードになるんだよと思う
0523デフォルトの名無しさん2011/06/10(金) 02:48:18.41
ゲームのチートをやっていたからポインタの概念はすぐ理解できた
でもCでの記法はすぐにマスターできなかった
0524デフォルトの名無しさん2011/06/10(金) 17:53:10.12
>>510
これが意味ある宣言かどうかはそのうち見てやる
時間が掛かる割りには得られるものが少ないので暇な時にな
0525デフォルトの名無しさん2011/06/10(金) 19:06:24.15
多分、記法さえまともなら時間掛けるまでもなく
「ただの長ったらしい宣言」で済んでると思うよ
0526デフォルトの名無しさん2011/06/10(金) 22:11:06.55
int *p;
p= (int*)malloc(80);

として、

pp[1][2] = 2;

とできるには、ppをどの様に宣言すればいいですか?
0527デフォルトの名無しさん2011/06/10(金) 22:44:00.28
>>526
int pp[10][10];
0528デフォルトの名無しさん2011/06/10(金) 22:47:49.27
>>527
ごめんなさい

書き方がおかしかった。

ppがpの領域を指すようにした後に
pp[1][2] = 2;
を行いたいです。
0529デフォルトの名無しさん2011/06/10(金) 22:50:05.47
p[1*N+2]=2;
0530デフォルトの名無しさん2011/06/10(金) 23:01:34.28
>>528

int (*pp)[2][3];

代入時にキャストする必要あり
0531デフォルトの名無しさん2011/06/11(土) 07:52:16.08
>>530
できました。

ありがとうございました。
0532デフォルトの名無しさん2011/06/11(土) 16:32:09.72
メモリに変数が確保されて、メモリには番地があるってイメージできればポインタなんて難しくない
コンピュータアーキテクチャの基礎みたいなのが足りないからポインタが分からない
それを分かってない講師や著者がいるから混乱をまねく
0533デフォルトの名無しさん2011/06/11(土) 16:53:56.45
ポインタやオブジェクト指向ってなんで難しいって言われるんだろう
0534デフォルトの名無しさん2011/06/11(土) 19:42:26.37
ポインタは文法の設計ミス
オブジェクト指向は難しくないが、C++は難しい
0535デフォルトの名無しさん2011/06/11(土) 20:57:14.17
int a = 10, b = 20;
int> p -> a:

p <= 20;
p <- b;
printf("%d %d", p, =>a);
0536デフォルトの名無しさん2011/06/11(土) 22:09:30.06
値と参照がわからないとJavaでも危険
0537デフォルトの名無しさん2011/06/11(土) 22:12:49.45
危険?
0538デフォルトの名無しさん2011/06/12(日) 00:56:26.18
>>536
でもJavaでそれが原因で混乱することってあんまり無いと思う
「基本型は値、オブジェクトは参照」と固定したお陰で
参照型の表現やデリファレンス専用の構文が要らなくなって
すっきりした、比較的読みやすい記法に纏まってると思うよ
0539デフォルトの名無しさん2011/06/12(日) 01:03:09.87
どこかの雑記帳に取り上げられそうだぜ
0540デフォルトの名無しさん2011/06/12(日) 17:20:17.67
intとIntegerなんてのがあるのは初学者には分かりやすいとは思えない
0541デフォルトの名無しさん2011/06/16(木) 03:15:31.57
ttp://kmaebashi.com/programmer/pointer.html
>K&Rによれば、Cの宣言は、「変数が現われ得る式の構文を真似た(P.114)」そうである。
>しかし、本質的に全く異なるものを無理に似せようとしたため、
>結局わけのわからない構文になってしまっている。

># Cの作者Dennis Ritchieが最近開発した新しい言語 Limboは、一見
># C like だが、宣言の構文はしっかりPascal風のものに直してある...
># ずるい(^^;
0542uy ◆yyC0rYWEq2 2011/06/21(火) 22:29:09.42
ポインタが難しいのではなく
ポインタを使ってバグなく作るのが難しい、と、はい
0543デフォルトの名無しさん2011/06/22(水) 15:33:14.83
ポインタを難しい
0544 ◆0uxK91AxII 2011/06/22(水) 15:57:33.47
難しいが難しいのではなく
難しいを使ってバグなく作るのが難しい、と、はい
0545uy ◆yyC0rYWEq2 2011/06/23(木) 22:28:58.34
結局、メモリ直アクセスのポインタはハード関係以外では使うなって話
Windowsが仮想アドレス持ってるのは、直アクセスさせちゃうとデバッグが事実上不可能だから、そうしてるわけで
だから、プログラミング上でも、Windowsの仮想アドレスにダイレクトにアクセスするのではなく
さらにプログラム内で仮想アドレスを作ってそこからWindowsの仮想アドレスへアクセスするようにしないと、
プログラムのデバッグは、プログラム内からは、事実上不可能
Windows上で動くデバッガを使って、追う事は可能だけど
そんな事するよりもプログラムソース内で、printして、正しいかどうかを見れたほうが良い
プログラム内仮想アドレスのポインタを駆使して、複雑な構造作る事は、ゴミグラマじゃなければ頻繁にあるはずだし
そこで作る構造は、メモリ直のポインタ触っていたら絶対にバグが取りきれないような複雑さになっているはず
ポインタを使わないわけではなく、デバッグ不可能な直アクセスのポインタがいらない
0546デフォルトの名無しさん2011/06/23(木) 22:41:41.63
ポインタをアドレスとか言っちゃううちはまだ使いこなせていない
0547uy2011/06/24(金) 03:25:27.98
言葉にこだわっちゃう奴はただのバカ、というか初心者
0548デフォルトの名無しさん2011/06/24(金) 12:29:05.21
言語の限界が理解できてないんですね
0549デフォルトの名無しさん2011/06/24(金) 13:31:17.31
言界
0550デフォルトの名無しさん2011/06/24(金) 16:56:41.16
幽遊白書なついな
0551uy ◆KOAgYBL/Xg 2011/06/24(金) 23:36:53.58
きも
0552uy ◆hi.ht/Isu2 2011/06/29(水) 03:38:48.29
きめえ
0553天使 ◆uL5esZLBSE 2011/07/02(土) 01:52:08.58
きもいから死ねよ
0554デフォルトの名無しさん2011/07/15(金) 09:17:30.08
>>510
funcsMapはFUNCS個の配列、要素はポインタA
ポインタAは関数Cを指す
関数Cは引数なし、戻り値はポインタB
ポインタBは関数Dを指す
関数Dは引数がポインタE、戻り値はintポインタ
ポインタEは関数Gを指す
関数Gは引数なし、戻り値はintポインタ

答えられなかった未熟者どもは切腹しろ
0555デフォルトの名無しさん2011/07/15(金) 20:31:56.63
今頃分かったのかよw
おそっ
0556デフォルトの名無しさん2011/07/15(金) 22:45:33.62
こういうコード書くヲタは雇いません(キリッ
0557デフォルトの名無しさん2011/07/15(金) 22:48:22.13
三項演算子と関数ポインタを組み合わせるバカはマジ死ぬべき
0558デフォルトの名無しさん2011/07/15(金) 22:57:59.19
答えられなかったのにw
0559デフォルトの名無しさん2011/07/15(金) 23:00:12.71
>>558
機械語読んでろ
0560デフォルトの名無しさん2011/07/15(金) 23:15:49.83
答えられなかったのにw
0561 忍法帖【Lv=7,xxxP】 2011/07/17(日) 10:19:52.41
仕事で現実にあった。
int hoge[NUM][XMAX][YMAX];
として書かれてるコードがあるが、メモリ不足のためhogeを動的に確保するように変更したい。
ただしhogeを使っているコードはあちこちにあるので、それらを無変更のまま動くようにしたい。
おまえらこれくらい出来るだろうな?
0562デフォルトの名無しさん2011/07/17(日) 22:06:37.38
int (*hoge)[NUM][XMAX][YMAX];
hoge = malloc(sizeof(*hoge));

でもメモリ不足で静的に確保できないなら動的に確保しても駄目だよね。
わからん。
0563 忍法帖【Lv=7,xxxP】 2011/07/17(日) 23:37:11.07
間違いだバカタレ。
それだと hoge[i][j][k]と書かれたコードを(*hoge)[i][j][k] と書き直さないと動かないだろうが。
あとメモリ不足てのはhogeが居座り続けると不足するから要らない時は解放する必要があるって意味だ。
0564 忍法帖【Lv=27,xxxPT】 2011/07/18(月) 00:24:40.15
ttp://ideone.com/2GUl0
0565デフォルトの名無しさん2011/07/18(月) 00:28:51.53
おっと失礼

int (*hoge)[3][5];
hoge = malloc(sizeof(*hoge) * NUM);

だな。
05665642011/07/18(月) 00:31:13.35
これって遅くなるけどね。
尤も、仮想三次元としてアクセスできる様に
n * XMAX * YMAX + x * YMAX + y
を計算する関数を用意しておけばわりかし移行も楽でいいね。
# つーか、これの二次元版なら実務でやったw
0567 忍法帖【Lv=8,xxxP】 2011/07/18(月) 07:59:20.18
>>564
効率が悪すぎる。不合格。
>>565
OK。
05685642011/07/18(月) 08:04:40.31
あぁ、元が固定長なんだから可変長にすることなかったか。
0569デフォルトの名無しさん2011/07/18(月) 10:36:52.30
どう考えてもC/C++の文法がポインタの理解を妨げてる最大要因。
0570デフォルトの名無しさん2011/07/24(日) 12:32:41.17
Intel記法のアセンブラのほうがわかりやすいな
0571デフォルトの名無しさん2011/07/24(日) 12:34:38.21
>>569
では、どうやれば理解を妨げなかった?
パスカルみたいにする? 代わらないと思うが。
0572デフォルトの名無しさん2011/07/24(日) 14:45:56.24
PASCALはポインタと配列を別物として扱う分マシかも
0573デフォルトの名無しさん2011/07/24(日) 20:46:04.23
Cでもポインタと配列は別物だが・・・

恐ろしい勘違いをしてるのでは?
0574デフォルトの名無しさん2011/07/25(月) 09:38:55.58
初期化メモリ確保以外に違いあるんだっけ?
0575デフォルトの名無しさん2011/07/25(月) 10:27:44.24
配列は代入出来ない
0576デフォルトの名無しさん2011/07/25(月) 11:23:33.94
配列からポインタへの暗黙変換が無ければ一部の誤解は消えたんだろうがそれはそれで書きづらくなっただろうな
0577デフォルトの名無しさん2011/07/26(火) 12:04:05.84
>>576
そうでもないっしょ。
char buf[100];
fgets(& buf[0], sizeof(buf), stdin);
とかになるだけだろうから。
0578デフォルトの名無しさん2011/07/26(火) 18:34:23.81
ポインターって コレクションとOOPの為にあるんだよ 知ってた?
0579デフォルトの名無しさん2011/07/26(火) 19:14:47.02
ポインタは間接参照の為にあるんだよ?知ってた?
0580デフォルトの名無しさん2011/07/26(火) 20:17:14.00
>>578
うん
>>579
うん
>>580
うそだよーん
0581デフォルトの名無しさん2011/08/11(木) 10:26:30.99
ttp://blogs.wankuma.com/nagise/archive/2008/04/01/131141.aspx

今はJavaでもアンセーフポインタ使えるんだな
0582デフォルトの名無しさん2011/08/28(日) 13:06:04.38
大体何でぇ、変数の名前で指定すれば事足りる物をわざわざアドレスを取り出して
それを指定するのか、そこが分らん。

確かに世の中氏名と出席番号有るのは分かるんだが、それがプログラムの世界で
なんで必要なのかがわからんのよ
0583デフォルトの名無しさん2011/08/28(日) 17:35:45.56
はいはい
0584デフォルトの名無しさん2011/08/30(火) 01:36:50.88
ポインタのスレでアドレスがどうこう言われてもなぁ
0585デフォルトの名無しさん2011/08/30(火) 19:44:51.10
>>510
こういうのは可読性考えてない質の悪いfoobar言語 → C言語なソーストランスレータを使うと、
ボコボコ出てくるんだよなあ。逆に言えば、そういうのが吐いたコードを理解できるようになると、
Cのポインタ怖くなくなるかもな(だが、こんなのは書きたくはない)。
0586デフォルトの名無しさん2011/08/31(水) 00:06:11.93
Cの書法がもう少し何とかなればそこまで無茶な内容でもなさそうな感じがするんだが
0587デフォルトの名無しさん2011/08/31(水) 10:31:12.12
int *p = 0;
*p = 0;

この違いを理解できずに打ちのめされる初心者カワイソス
0588デフォルトの名無しさん2011/08/31(水) 15:42:01.54
Cの文法が悪いわけじゃない、使うやつの頭が悪いだけ
0589デフォルトの名無しさん2011/08/31(水) 19:49:59.77
単純なことだ。前置と後置の演算子が入り乱れれば、
どんな言語でもクソ文法になる。それだけの話。

後置の演算子は、右へ右へと書き足していくから、後置の演算子は右方向へ読むことになる。
前置の演算子は、左へ左へと書き足していくから、前置の演算子は左方向へ読むことになる。

従って、

・"前置だけ" あるいは "後置だけ" で書かれた文は、単方向に読み進めれば終わる。
・前置と後置が入り乱れている文は、右へ左へ行ったり来たりしなければ読めない。
 さらに、演算の結合順位を決定するために、余計なカッコが必要になって奇怪な文になる。
0590デフォルトの名無しさん2011/08/31(水) 19:59:10.95
foo((T*)p)
foo(t*p)

この違いを理解できずに打ちのめされる初心者カワイソス
0591デフォルトの名無しさん2011/09/03(土) 09:14:28.39
>>582
超でかい領域になんらかの変換をかける処理を考えたときに

ここまでやった!

みたいなのが必要じゃない?
前から何バイト目って覚えておくんでもいいけど
0592デフォルトの名無しさん2011/09/06(火) 13:56:49.29
>>582
たとえ話でテキストエディタ作るときウィンドウ間や別のアプリケーション(プラグイン)や
プロセスでデータを共有したいってとき、変数名では共有できやしない。それに、いちいちAPI作って
データをコピーしていたら遅いしメモリの無駄。ポインタなら指すだけ。

Cの暗黒面嫌いなら hoge言語 → Cトランスレーター使って、必要な部分だけCで書くといいよ。
0593デフォルトの名無しさん2011/09/16(金) 20:35:47.73
>>581
C#の真似か
まあいいか
お互いに切磋琢磨する事は悪くない
0594デフォルトの名無しさん2011/09/18(日) 08:32:04.03
>>591-592
ポインタが難しいのはそんな部分じゃねーよ初心者は黙っとけ
コピーコストを発生させないために先頭アドレスで指し示す手法自体は大して難しくない、どの言語にもある
問題は「Cではポインタの示す先のオブジェクトは1個なのか配列なのか区別されない」ということ
例えば func(int*); に対して
int i;
int array[100];
を
func(&i);
func(array);
func(&array[50]);
のようにどうとでも渡せるという仕様が問題なんだよ
0595デフォルトの名無しさん2011/09/18(日) 22:34:10.20
>>594
その代わり速いんだよ
0596デフォルトの名無しさん2011/09/18(日) 22:46:05.11
func(array);は無効にして
func(&array);と強制すべきだった
0597デフォルトの名無しさん2011/10/15(土) 05:26:44.03
ポインタって可読性悪化させてセキュリティ強化してるんでしょ?
わざわざアドレス指さなくても変数名で指定すりゃいいし、
関数隔てるなら引数と戻り値使えばいい。
高級言語じゃ隠蔽された仕様。
最悪OSに危害加えるしな。
0598デフォルトの名無しさん2011/10/15(土) 07:36:58.85
あのおかげで高級アセンブラとして使えるんだよな
可読性や安全性やすべて無視して自由を取ってる
0599デフォルトの名無しさん2011/11/11(金) 10:05:15.25
>>594
同意。

でもアセンブラの置き換えとしてはそれで良い。
高級言語やりたいなら他行くしかない。

言語仕様がいい加減だった昔は
2バイト型でポインタの値貰ってキャストして使ったりしてたw
それまでアセンブラでやってた手法を元に
作り手の力量でどうにでも出来るのがCの魅力だった。

組込的な事をやらなければ、ポインタの利用は最小限で済むはず。
出来れば使わないに越した事は無い、今時の強力なコンパイラなら最適化されて
ポインタだから動作が速いとか無いと思うけど。
0600デフォルトの名無しさん2011/11/11(金) 23:20:40.40
配列のポインタを得るときでも
ポインタ演算子の使用を強制されるとしたら
どんなデメリットがありますかね?
0601デフォルトの名無しさん2011/11/11(金) 23:28:03.15
ポインタはガチな数値計算とかだと最適化の邪魔
0602デフォルトの名無しさん2012/01/26(木) 15:21:19.58
c++の参照&なら邪魔されないんじゃねーの?
0603デフォルトの名無しさん2012/01/27(金) 15:05:49.04
参照のコンテナみたいなのは小細工がいるし
その小細工が最適化を妨げないという保証はない
0604デフォルトの名無しさん2012/01/31(火) 05:53:39.96
C99では restrict という予約語が出来て VCでも __restrict という修飾語が使えて
FORTRANと同等の最適化を期待出来るようになった

気を付けて使わないと危ないけど
0605デフォルトの名無しさん2012/02/02(木) 07:42:45.40
C#でint型変数のアドレスを覚えておいて値を出し入れしたいんだけど
マジでどうすればいいの?
0606デフォルトの名無しさん2012/02/02(木) 09:02:24.09
そんなアホなことはしなくても動くプログラムは作れる
0607デフォルトの名無しさん2012/02/02(木) 19:41:33.85
>>605
なんでそんな必要があるのか知らんが unsafe でggれ。
MSがなんで.NETにポインタ残したのかも知らんが。
0608デフォルトの名無しさん2012/02/02(木) 22:21:07.52
GCが勝手にオブジェクトを移動させるから、
fixedブロックで一時的に固定した配列かローカル変数以外のアドレスは基本的に取れないし
固定されてる期間を超えて保持してるとアクセス違反で逝く
0609デフォルトの名無しさん2012/02/02(木) 22:54:17.15
>>607
あるクラスのインスタンスをdatagrideviewにいれて変更とか表示とかしたいんだ
メンバ変数がたくさんあるからお手軽な方法がないかと思って
0610デフォルトの名無しさん2012/02/02(木) 22:58:43.91
スレ違いだがプロパティ定義してバインドすれば全自動でやってくれるぞ
0611デフォルトの名無しさん2012/02/03(金) 00:30:06.25
>>610
表示したいクラスはたくさんあって
そのメンバ変数のint bool stringについてやりたかったんだけど
C#だとできないんだよね

カラムはクラス名 変数名 値の3つにしたくて

C++ならポインタとクラス名、型、変数名だけ覚えておけば
ポインタ通して値の出し入れまでできたんだけど
C#はわからなくて辛い

どうやってインスタンスを特定するんだろう・・・
0612デフォルトの名無しさん2012/02/03(金) 00:32:28.33
リフレクションを使え
インスタンスから全部取ってこれる
0613デフォルトの名無しさん2012/02/03(金) 10:31:09.08
どう見ても GetType().GetProperties() の出番。
0614デフォルトの名無しさん2012/02/03(金) 12:04:06.54
たまたま出てきたむか〜しの8bitCPUのマニュアルを眺めてみた

あの頃はスタックもヒープも自分でアドレスにラベルつけて管理したなあ
配列もリストもキューも自分で管理したなあ
アドレスをレジスタで計算してPCに転送してジャンプとかやってたなあ

それを思えばポインタなんて簡単もいいとこだ C偉い

…とあらためておもいました。 おわり。
0615デフォルトの名無しさん2012/02/03(金) 12:47:28.37
>>613
get field ができませんでした
配列だと勝手が違うのでしょうか?
0616デフォルトの名無しさん2012/02/03(金) 17:07:15.53
ポインタ駆使して Hello, world はどうやって表示するんだYO
0617デフォルトの名無しさん2012/02/03(金) 22:51:36.11
>>615
いいかげんC#スレに行け
0618デフォルトの名無しさん2012/02/03(金) 23:33:33.80
>>617
もうしわけございませんでした
0619デフォルトの名無しさん2012/02/04(土) 04:19:24.16
>>587
そのとうり。理解を混乱させてる原因はその文法。


int*
と書けば
int* a = 0;
a = 0;
同じことしてるのが一目瞭然。


int *
などと書くから
int *a = 0;
a = 0;
同じ事してるのに、同じ事してるように見えない。


int* a, b, c
int *a, *b, *c
の問題はその後に知ればいい。
0620デフォルトの名無しさん2012/02/04(土) 05:21:55.54
>>619
単に初期化についてちゃんと理解させればいいだけだ
じゃなきゃC++で完全に詰む
0621デフォルトの名無しさん2012/02/04(土) 05:22:00.47
とおりを、とうりと書くような痛い人につっこんでも仕方ないのだが
ポインタが理解できない人は抽象的に考える力がないのだろう
端的にいえば数学や国語の得意な人はすぐに理解できるが苦手な人には理解できない
int *p = 0; が紛らわしいとかそういうの次元の問題はではないだろうよ
0622デフォルトの名無しさん2012/02/04(土) 08:13:15.79
抽象的ねぇw
0623デフォルトの名無しさん2012/02/04(土) 12:34:07.89
もっと端的にいえば「頭が悪いから」ポインタが理解できないんだよ
「説明が悪いから」だと主張してる人は教えたことがないのだろう…
0624デフォルトの名無しさん2012/02/04(土) 14:19:53.00
>>616
こんなヤツらに訊くな
0625デフォルトの名無しさん2012/02/05(日) 00:01:04.00
>>623
そうそうポインタ理解するふつうの脳ミソ持ってないやつってたまにいるんだよな
でバカだから自分がプログラミングにどれくらい適性があるかも自己判断できないのな
最初から無理なのがわかんないバカ
0626デフォルトの名無しさん2012/02/05(日) 00:46:14.41
では、良サイトを挙げよ。
0627デフォルトの名無しさん2012/02/05(日) 02:29:51.78
良サイトっていうか普通に読んでわからなかったらどこ見てもダメだろ
ただ俺はいきなりわかるわからないの話じゃなくて経験だと思うんだよねー
最初は*つけて動いたやwアハハーwでいいと思うよ
そのうち色んな場面をみるたびにそういうの細かく知るようになって
2年もたつ頃にはほぼ完璧になってるって

なんていうのかなぁ
本のしおりみたいな概念と似てるんだけど
厳密に表現するにはちと違うしでまあ表現はしにくいけど
どっかで使ってあるよく機能のうちの一つに過ぎないと思う
0628デフォルトの名無しさん2012/02/05(日) 03:46:43.95
アドレッシング
0629デフォルトの名無しさん2012/02/05(日) 10:08:48.40
*list→[1,2,3,4,5,NULL]

こういう表現を理解できない子には無理。
矢印が分からないんじゃしょうがない。
0630デフォルトの名無しさん2012/02/05(日) 11:10:31.06
まずそろばんを見せて直接参照・間接参照を説明して、
次に配列・多次元配列の扱い方、
Cでの文字列の表現、
関数の引数での参照渡し、
auto 変数への参照が関数を抜けるときに無効になることの説明、

なんだ簡単じゃん
0631デフォルトの名無しさん2012/02/05(日) 14:13:22.66
>>625
ポインタ程度でプログラミングの適性語っちゃう奴がいる事のが呆れる
0632デフォルトの名無しさん2012/02/05(日) 17:04:34.36
そんなに簡単に教えられるなら
悪書凡書が溢れかえってるわけないだろと
0633デフォルトの名無しさん2012/02/06(月) 06:05:27.03
アセンブラやれよ 一発で分かる
>>628が正しい
0634デフォルトの名無しさん2012/02/06(月) 11:31:18.82
Cの言語としての機能不足を
ポインタがいかに補っているかを
あわせて説明できないとダメ
0635デフォルトの名無しさん2012/02/06(月) 11:38:38.94
ポインタで祭り
ttp://builder.japan.zdnet.com/script/sp_c-programming-language/20370255/
0636デフォルトの名無しさん2012/02/06(月) 11:59:38.02
抽象概念が理解できないとポインタも理解できないというのは同意。
ベン図を理解できない人間が多いから集合を算数から外したことでも判るように、
抽象概念が苦手な人間にそれを理解させるのは容易じゃない。
0637デフォルトの名無しさん2012/02/06(月) 12:39:28.83
>>635
Open Article Writing ってか
新しいな
0638デフォルトの名無しさん2012/02/06(月) 13:11:56.73
>>619
> 同じ事してるのに、同じ事してるように見えない。 

おなじ事してないんだけどなw
初期化と代入について勉強してからまたおいで。
0639デフォルトの名無しさん2012/02/06(月) 17:09:05.55
char a, b,
*s = 0;

まあどうってことないよな
0640デフォルトの名無しさん2012/02/07(火) 11:16:37.34
間接キス
0641デフォルトの名無しさん2012/02/07(火) 17:46:24.07
>>629
中西正和さんは「LISP入門」の中で二進木を説明するのに10ページを
要している。listですぐピンとくる人なんているのかね。
0642デフォルトの名無しさん2012/02/07(火) 18:30:01.88
ポインタ完全にふに落ちるためには、
やっぱり一度アセンブラ経由するのが必須なのかもしれん。
0643デフォルトの名無しさん2012/02/08(水) 01:36:59.17
>>642
というよりメモリ内でのデータ構造だな
アセンブラを経由するとローダとかの回り道があってあばばばば
0644デフォルトの名無しさん2012/02/08(水) 02:34:45.53
アセンブラと OSの仕組みと コンパイラ・リンカ・プリプロセッサの連携
この3つおさえてやっとCが理解できたわ
0645デフォルトの名無しさん2012/02/12(日) 11:54:59.41
K&R前からの歴史もいるな
そういう色んな事を知って初めてCの仕様や長い間続いてるプロジェクトのコードが理不尽なものでないと受け入れられるのだ・・・
0646デフォルトの名無しさん2012/02/12(日) 21:47:20.50
>>1
ポインタがわからないと言ってるのはそのレベルじゃないと思うよ

ファンクタが絡んだポインタ使った定義見たら死にそうになるぞw
0647デフォルトの名無しさん2012/02/12(日) 21:49:56.86
むしろC#とかポインタがない言語でポインタがある言語と同じことしようとするとハマる
0648デフォルトの名無しさん2012/02/12(日) 21:56:25.98
昔泣かされたUNIXのシグナルのプロトタイプ

void (*signal(int signum, void (*handler)(int)))(int);
0649デフォルトの名無しさん2012/02/12(日) 21:58:23.22
これをアセンブラレベルで理解できる奴はえらいわ
0650デフォルトの名無しさん2012/02/13(月) 00:30:41.87
アセンブラレベルでなら型気にしないからな
0651デフォルトの名無しさん2012/02/16(木) 10:18:51.75
>>648
こんな程度で泣いてる奴はC出来ますとか二度と口にするな。
未熟者はjavaかc#でもやってろ。
cはプロ用のプログラミング言語だ。unixのカーネルはjavaでもc#でもc++でもなくcで書かれているだろう。
0652デフォルトの名無しさん2012/02/16(木) 14:37:49.58
>>651
javaでもカーネルもどきは書けるだろ↓
http://upload.naritaka.jp/uploda/javacode.png
0653デフォルトの名無しさん2012/02/16(木) 14:51:39.94
>>1
簡単な事しかやってないから簡単なんだよ。
100万行のプログラムを書いてみろ。
ポインタほど煩わしいものは無いと感じるから。
0654デフォルトの名無しさん2012/02/16(木) 18:07:53.10
そもそも社会に出てポインタの話するやつなんかいねえよw
分かってて当然だから
0655デフォルトの名無しさん2012/02/16(木) 18:16:31.69
「JavaやC#にはポインタが無い」(※JNIやunsafe除く)
って言葉だけだとちゃんと分かってるのか判断出来ないよな

「参照はあるけどCのようなポインタは無い」とか
「ポインタ演算は無い」のような表現なら分かるけど
0656デフォルトの名無しさん2012/02/16(木) 19:48:27.25
>>655
>「参照はあるけどCのようなポインタは無い」
言語ごとに「ポインタ」の定義が違うことを
ちゃんと分かってるのか判断出来ないよな 
0657デフォルトの名無しさん2012/02/16(木) 20:46:30.17
>>656
>「ポインタ」の定義が違う
Javaやunsafeを除いたC#にポインタの定義というものは無いんだ
ポインタの代替をあえてreferenceという別の言葉で定義していて
説明内のpointerは「Cのようなポインタ」を指している

「Javaの中でのポインタ」というように再定義しなかったのは
言語の設計思想の中で割りと重要な点だったりする

http://java.sun.com/docs/overviews/java/java-overview-1.html
> there are no pointers in Java

C#も同様でreferenceとしている
unsafeでのポインタはポインタ演算も可能な、まんまCのようなポインタ
0658デフォルトの名無しさん2012/02/16(木) 20:50:13.72
>>657は一体何を考えてこのレスをこのスレに今更書き込んだんだろうか…。
0659デフォルトの名無しさん2012/02/16(木) 21:02:04.23
>>658
>>655は>>647見て書いたから遅レスと言えるかもしれないけど
>>657は1時間前のレス宛てなのに何が「今更」なんだ?
0660デフォルトの名無しさん2012/02/17(金) 00:09:40.45
紛らわしいからJavaやC#でいう参照はオブジェクトハンドルとでも呼べばよかったのに
実体はGCに管理されたハンドルだから単なる演算ができないポインタとも違う
0661デフォルトの名無しさん2012/02/17(金) 00:17:52.77
ひとりだけレベルの低い奴おるで。
「コーラを飲んだらね、なんとゲップがでるんだよ!」と大人に教える幼稚園児。
0662デフォルトの名無しさん2012/02/17(金) 06:54:08.77
困ったときのレッテル貼り
0663デフォルトの名無しさん2012/02/17(金) 08:34:25.87
<原発技術者>東電人材流出やまず 韓国が引き抜き攻勢
毎日新聞 2月16日(木)8時28分配信

 東日本大震災からほぼ半年後の昨年夏、東京電力の原子力部門に勤める幹部技術者が、韓国の政府関係者から食事
に招かれた。「給与はどの程度カットされましたか?」「今の待遇に満足ですか?」。幹部技術者と親しい東電幹部
によると、会食の目的は転職の誘いだった。打診された移籍先は国営の韓国企業だったという。

 同じころ、東電の別の男性社員も、韓国政府関係者から面会を求められた。待ち合わせ場所に行くと、「力を貸し
てもらえないか」と転職を持ち掛けられた。韓国側からどのような処遇を提示されたかは明らかではない。

 関係者によると、2人とも転職の誘いを拒否し「今も原子力部門で働いている」(幹部)というが、東芝や日立製
作所など世界最先端の原発を扱う東電の運用技術を狙った「ヘッドハンティング」の一端が浮かび上がった。

 韓国では90年代以降、当時は規模が大きくなかったサムスン電子がソニーやパナソニックなど日本の花形企業の
技術者を「リクルート」して技術力を高め、日本の電機メーカーを「駆逐」し、世界有数の電機メーカーにのし上
がった経緯がある。東電幹部は「今は東電が国内外からの『草刈り場』になっている」と危惧する。

 東電は原発事故による経営環境の悪化や民主党政権の「脱原発依存」「東電解体」の動きを受け、人材流出が止ま
らない。東電の内部資料によると、昨年3月の事故後の退職者(定年退職は除く)は約300人と例年の3倍以上の
ペースで増え、年度末を控えて「退職予備軍」も200〜300人にのぼるとみられている。
http://headlines.yahoo.co.jp/hl?a=20120216-00000017-mai-bus_all
0664デフォルトの名無しさん2012/02/17(金) 08:34:42.38
 退職者は「技術系の若手」や「中堅・若手の優秀層」が中心で、転職先は総合商社や食品大手、外資系金融機関な
ど。海外の原子力企業に転職した例は確認されていないというが、すべての転職先は把握しきれていない。

 「引き抜き」攻勢をかける韓国は総発電量の約3割を原子力で賄う。昨年12月には東部・蔚珍(ウルジン)で計
画する原発2基の建設が許可され、李明博(イ・ミョンバク)大統領は「我が国はエネルギー輸入国。原発建設は続
けていく」と原発推進の姿勢を鮮明にしている。李大統領は今月5日、訪問したトルコでエルドアン首相と会談し、
中断していた原発建設交渉の再開で合意。原発事故で交渉が停滞した日本メーカーを横目に韓国企業の逆転受注を
狙っている。

 福島原発事故後、ドイツ、イタリア、スイスが新規の原発を建設しない「脱原発」を宣言。一方、急増する電力需
要や地球温暖化対策で米国や中国、東南アジアの新興国などで原発新設が進む。「中国がドイツの原発技術者の獲得
に動いている」との独報道もあり、技術者の争奪戦は国境を超えて激化している。

 また、原発技術の流出は、核兵器の拡散防止を目指す核安全保障を揺るがしかねない。東電は原発の使用済み燃料
から取り出したプルトニウムをウランと混合したMOX燃料を再利用するプルサーマルを実施している。核兵器に使
われるプルトニウムを扱う東電の技術は「核兵器を造る能力」(資源エネルギー庁幹部)でもある。

 衆院安全保障委員会の理事の一人は「原発の推進国にとって東電の技術は垂涎(すいぜん)の的。安全保障のうえ
でも東電の人材や技術が流出すれば問題だ」と警戒感を強めている。【三沢耕平】

***
0665デフォルトの名無しさん2012/02/17(金) 08:39:50.68
概念が分かり辛いという奴はヤバイけど
構文が分かり辛いという奴は分からんでもない

int *p;
int a[];
int* p, v;

型 変数名 になってないのが罠すぎる
0666デフォルトの名無しさん2012/02/17(金) 08:49:18.39
ちょっとした*の位置の違いだけで意味が変わるの
0667デフォルトの名無しさん2012/02/17(金) 08:57:11.97
シンタックス上は同じでセマンティクス上は少し違う

セマンティクスを優先するとシンタックスが牙を剥く
int* p, v; = int* p; int v;
0668デフォルトの名無しさん2012/02/17(金) 15:38:06.05
関ポで詰んだ
0669デフォルトの名無しさん2012/02/17(金) 18:49:30.88
>>587 >>619 >>648 >>667
typedefは神

typedef int* int_p;

int_p a=0, b=0; // int_p a; int_p b=0; と同じ
a = 0;
*a = 0;
0670デフォルトの名無しさん2012/02/17(金) 19:17:45.01
この子はCを覚えたてなの?
0671デフォルトの名無しさん2012/02/17(金) 19:21:31.40
そしてこのマジレスである
0672デフォルトの名無しさん2012/02/17(金) 19:29:52.42
関ポのときに typedefにお世話になったな
いまだに素で見てもわからんw
0673デフォルトの名無しさん2012/02/17(金) 21:10:57.54
ここの動画見たら大体わかる

http://ocw.ouj.ac.jp/tv/1542109/
0674デフォルトの名無しさん2012/02/18(土) 11:44:25.30
なつかしい
0675デフォルトの名無しさん2012/02/18(土) 17:57:58.62
もうちょっと上位概念でいいような
0676デフォルトの名無しさん2012/02/24(金) 17:01:36.94
引数が関数ポインタって何がやりたいの?
多段呼び出し?
0677デフォルトの名無しさん2012/02/24(金) 20:57:31.94
こーるばっくとか、スレッドの起動とか、ナンボでもあるさ。
0678デフォルトの名無しさん2012/02/24(金) 21:00:39.88
virtualができるc++から入ったら意味不明だろうな
cの頃はそんなん無かったから関数ポインタは必須だったが
0679デフォルトの名無しさん2012/02/24(金) 21:07:31.96
viatual関係なくね?
引数に単にオブジェクトを渡せるんだから。
で、渡したオブジェクトのメソッドを呼ぶなんてこともまた当たり前すぎて、
コールバックだのなんだのイチイチ言う必要が無くなった。
0680デフォルトの名無しさん2012/02/24(金) 21:07:52.02
C++から入っても関数ポインタ取るAPIが普通にあるから関数ポインタ使うよ
0681デフォルトの名無しさん2012/02/25(土) 02:14:02.46
ポインタが分からない人は抽象的すぎる説明を信じられないだけ。
これは無条件に信じる(暗記)するかどうかの話にすぎない。
形式を全部暗記すれば理解する必要すらないからである。
暗記力の問題だから、簡単にポインタを受け入れた人は
アセンブラレベルの具体的な話になるとまったく理解できない、それは
アレンブラレベルの何かを暗記していないだけ。
0682デフォルトの名無しさん2012/02/25(土) 02:17:39.40
Cのポインタが分かりにくいのは、いろんな意味を一手に引き受けている
からではなかろうか。

0683デフォルトの名無しさん2012/02/25(土) 09:43:32.39
大昔、Cの入門書で読んだ記述。コメント内はその時の心境。
int a;
char *ptr; /*その*はなんだよ!*/
a = 10;
ptr = "Hello"; /*さっきの*はどこいったんだ!*/
printf("%d %s\n", a, ptr);
scanf("%d %s", &a, ptr); /*なんでptrだけprintfとscanfの表現が同じなんだよ!わけわかんね!*/
こんな感じで戸惑ったのを思い出した。
一ページ目がこれじゃ心折れるぞw
0684デフォルトの名無しさん2012/02/25(土) 09:54:38.05
>>681
暗記は役に立たないぞ

こういうこと書いてるやつに限って
他の言語に移ったらポインタの動作を記述できなくて迷う

ポインターがないのはクソ言語だとか言い出す奴がマジでいて困る
0685 ◆0uxK91AxII 2012/02/25(土) 12:18:57.24
>>683
>ptr = "Hello";
>scanf("%d %s", &a, ptr);
これはひどい。
0686デフォルトの名無しさん2012/02/25(土) 12:29:03.64
>>685
何十年も前の入門書だからよく覚えてない。ゆるせ。
もしかしたら間に
char buffer[1024];
ptr = buffer;
とか入ってたかも。
0687デフォルトの名無しさん2012/02/25(土) 12:49:27.76
int a = 1234
だとして、
&a とすれば、1234が記録されてるメモリー番地(たとえば4567等)が読み取れる。

&記号は 通常の変数に対して使えるのだから、*記号も同様に使えればシンプルで良かった。
*a とすれば、メモリー番地1234にアクセスできる。これで十分じゃないか?
しかし実際はエラーになる。
通常の変数に * は使えない。



ポインター変数である int* a も、結局、実体はただの4byte長の数字を格納してる変数にすぎない。
通常の変数との違いは
適用できる記号が &(記録に使われてるメモリー位置を得る) だけの通常変数と、
&以外に *(記録されてる数字の、メモリー位置から読み書きする)も使えるポインタ変数。この違いだけ。

通常変数も、ポインター変数も無関係で、何にでも & と * を使えるようにすればシンプルで良かった。アセンブラの場合はこれ。
「アセンブラから始めればポインタを理解しやすい」と言われる理由はここにある。
0688デフォルトの名無しさん2012/02/25(土) 13:13:09.54
この子はCのお勉強途中なの?
0689デフォルトの名無しさん2012/02/25(土) 14:16:08.68
そもそも通常変数とポインタ変数と言う区別をしているからいけない。
その、ポインタ変数と言う代物は只単にポインタ型の変数でしかない。
つまりそれは、通常変数と言う代物と型が違うだけの同じものだ。
0690デフォルトの名無しさん2012/02/25(土) 14:18:44.29
>>689
ポインタを実際に使ってない人のコメントにしか見えない
0691デフォルトの名無しさん2012/02/25(土) 14:20:56.38
>>690
そう思いたければ思えば。
そう言えば、ポインタ変数なんて風に特別視する奴に限って
ダブルポインタだとかトリプルポインタだとか言い出すよね。
0692デフォルトの名無しさん2012/02/25(土) 14:24:31.08
>>689,691
いや、俺はなんとなくその言わんとすることは分かるよ。
ダブルポインタとか聞かされたときに、大いにモヤッとする。
0693デフォルトの名無しさん2012/02/25(土) 14:26:03.40
いくつか並べてみても単に、
int型、int *型、int **型、という理解のほうがフラット。
0694デフォルトの名無しさん2012/02/25(土) 14:40:40.33
ポインタをちゃんと理解している奴ならダブルポインタとか絶対言わない
0695デフォルトの名無しさん2012/02/25(土) 14:47:11.33
リスト型ポインタ
0696デフォルトの名無しさん2012/02/25(土) 15:03:05.13
>>691
いや実際使ったことないだろ

>>687を見返せば?

>*a とすれば、メモリー番地1234にアクセスできる
a=a+1で1235

では
*(a+1)はどこを指すんだ?
*(++a)は?

妄想はチラシの裏へどうぞ
0697デフォルトの名無しさん2012/02/25(土) 15:06:23.38
まず>>687は半年ROMってから出直すべきだろうw
0698デフォルトの名無しさん2012/02/25(土) 15:19:19.30
>>696
固定観念に嵌まって抜けられなくなっているようだね。
変数の種類が違うんじゃなくて、その変数が扱う型の違いだってことに全く気付いていない。
0699デフォルトの名無しさん2012/02/25(土) 15:20:56.16
>>698
他人に難癖つけるならまず
論理的な回答出してから言えよ
0700デフォルトの名無しさん2012/02/25(土) 15:21:55.91
> ダブルポインタだとかトリプルポインタだとか言い出すよね。
この言い回しは、ム板に来てから知ったのだが、それぞれ2段、3段の
間接参照であることを簡潔に表現していて良いと思うのだが。

>>695
私が、最初にC言語を勉強したのは、Visual C++2.0 スーパーテキストという
本なのだが、ポインタ変数 + 1をアドレス値+1と誤解しているという代物だった。
0701デフォルトの名無しさん2012/02/25(土) 15:25:31.28
海外ではダブルポインタっていってるけどね
0702デフォルトの名無しさん2012/02/25(土) 16:34:13.36
いやぁ、そう表現すること自体は構わないんだが、面接で
「ダブルポインタは理解できていますがトリプルポインタはちょっと自身がありません。」
なんて言われちゃうとどうもね。
0703デフォルトの名無しさん2012/02/25(土) 16:40:17.74
シープラプラみたいなもんじゃないか
海外だと笑われる
0704デフォルトの名無しさん2012/02/25(土) 17:06:47.03
>>702
なつかしいな。そういうのあったな。ちょっとってなんだちょっとって。
0705デフォルトの名無しさん2012/02/25(土) 18:02:58.89
配列の配列の配列
0706デフォルトの名無しさん2012/02/25(土) 19:55:21.07
#include <stdio.h>

static void function(int a)
{
printf("my_function: %d\n", a);
}

static void caller(void (*new_function)(int a), int p)
{
(*new_function)(p);
}

int main(void)
{
caller(function, 10);
return 0;
}
0707 ◆0uxK91AxII 2012/02/25(土) 20:48:53.29
void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
0708デフォルトの名無しさん2012/02/25(土) 21:14:14.64
>>706
>static void caller(void (*new_function)(int a), int p)
これをプロトタイプ宣言すると
static void caller(void(*)(int), int);
となるわけで、初学者には恐怖感あるだろうな。
0709デフォルトの名無しさん2012/02/25(土) 23:00:59.90
Cの糞仕様が難解な物にしていると言わざるを得ない
0710デフォルトの名無しさん2012/02/25(土) 23:51:34.01
#include <stdio.h>

int main(void)
{
int i=0;

printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",i);

return 0;

}

0711デフォルトの名無しさん2012/02/29(水) 02:05:46.25
alias gcc='gcc -Wall'
となっているべきだと思うだがなぁ。
gcc 710.c
710.c:7: warning: too few arguments for format
0712デフォルトの名無しさん2012/02/29(水) 14:24:16.02
>>708
しちめんどくさい定義を、typedefもせず書く阿呆が
現場にいると困ります。
0713デフォルトの名無しさん2012/02/29(水) 15:18:57.61
static void caller( r_typ(*)(a_typ) , int);

static void caller( (r_typ(a_typ))* , int);

色々考えた上で現在の仕様(前者)になってると思うけど
後者のような宣言だと構文解析上の問題とかがあったのかな?
0714デフォルトの名無しさん2012/03/01(木) 01:44:08.61
>>712
http://upload.naritaka.jp/uploda/signifiant.png
07157122012/03/01(木) 03:24:06.48
>>714
だから何なの?バカなの?
0716デフォルトの名無しさん2012/03/01(木) 15:27:27.51
今だかつて、ポインタを完全に気にしないでプログラミングできる言語は無かった。
そして、これからも、無い。
どんな高級言語になろうと、if文のところで、ポインタを気にしなくてはならなくなる。
0717デフォルトの名無しさん2012/03/02(金) 05:16:06.57
>>716
ハァ( ゚Д゚)?
0718デフォルトの名無しさん2012/03/02(金) 05:28:49.65
比較するときに、アドレスの参照先か、アドレスの値そのものを比較するかの判断ぐらいはするでしょ。
0719デフォルトの名無しさん2012/03/02(金) 06:11:18.34
ていうかポインタわからない奴なんてホントに少数なのに言語製作者側が過剰に反応しすぎだろ
明らかにあったほうがいいものなのに下手になくしたもんだから余計複雑になってると思う
0720デフォルトの名無しさん2012/03/02(金) 06:20:44.46
なくなってはいないんじゃないかな。
Javaのように、暗黙のルールでソースを記述するか、
Cのように、演算子でソースを記述するかの違いだけで。
0721デフォルトの名無しさん2012/03/02(金) 08:03:57.64
>>720
おまえもわかってないな。
javaとかがやってるのは「参照」。これは危なさは無い。
cのポインタは「参照」とは違う。
参照は、「配列の途中から渡せない」かわりに「渡された先でも配列のサイズがわかる」。
ポインタはその真逆。だからバッファオーバーフローの危険がある。

まず表記につまづくので、「ポインタの問題=表記の難しさ」と勘違いする奴が後を絶たないが、
ポインタの本当の問題は「参照でない」ということ。
0722デフォルトの名無しさん2012/03/02(金) 08:29:39.02
既出だけど違いはポインタ演算の有無じゃね
0723デフォルトの名無しさん2012/03/02(金) 09:44:11.08
>>721みたいなヤツにふさわしい話題

C#ではC言語を直接C#中に埋め込むことができる
ttp://mag.autumn.org/Content.modf?id=20100826141717
0724デフォルトの名無しさん2012/03/02(金) 10:18:15.12
違いはGCに管理されているかどうか
GCのせいでアドレスは勝手にコロコロ変わる
0725デフォルトの名無しさん2012/03/02(金) 13:10:16.43
non-movingなGCに変更すれば…と思ったが解決になってない。
0726デフォルトの名無しさん2012/03/02(金) 13:35:35.84
>>724
それはGCの実装の問題じゃないの?
0727デフォルトの名無しさん2012/03/02(金) 13:51:13.49
C++11ではnon-movingなGCが実装しやすくなるような仕様が検討されてるね

安全でないキャスト、ポインタ演算、配列への直接(チェック無し)アクセスを
禁止したら参照みたいに扱えそうな気がする

delete済みのポインタの保持の問題があるけど
これはGCやスマートポインタじゃないと無理かな・・・
0728デフォルトの名無しさん2012/03/02(金) 13:53:37.49
以前見た、CからJavaへ乗り換える人用の本には、
「Javaのクラスは、全てポインタ型だ!」と書いてあった。
まぁ、参照という用語がC++からの単語だから、飽くまで分かりやすくだろうけど。
0729デフォルトの名無しさん2012/03/02(金) 20:29:08.71
>>726
そういう実装を前提にして設計した結果がJavaやC#の参照なんだから実装の問題というわけではないだろ
ポインタとは根本的に違っててGCにオブジェクトを問い合わせるときのハンドル
0730デフォルトの名無しさん2012/03/03(土) 22:46:08.38
ポインタはボーナス
0731デフォルトの名無しさん2012/03/05(月) 00:30:34.32
Javaの意味での参照では不十分で、Cの意味でのポインタが必要なのはどんなとき?
外部関数呼び出しインターフェースをつくるときくらいしか思いつかない。
0732デフォルトの名無しさん2012/03/05(月) 02:36:58.23
自分でリストをつくるとき、次のをさすポインタが必要
0733デフォルトの名無しさん2012/03/05(月) 02:51:27.76
/* namevalu.h */
#define BUFFER_SIZE 128
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct NameValue NameValue;
struct NameValue {
  char name[BUFFER_SIZE];
  int value;
  NameValue *before;/* リストにおいて、前の項目をさすポインタ */
};
NameValue *new_item(char *n, int v) {
  NameValue *p;
  p = (NameValue *)malloc( sizeof(NameValue) );
  if(p != NULL) {
    strcpy(p->name, n);
    p->value = v;
    p->before = NULL;/* 前の項目をさすポインタは、まだどこもさしていない */
  }
  return p;
}
void free_all(NameValue *p) {
  NameValue *before;
  while(p != NULL) {
    before = p->before;
    fputs(p->name, stdout);
    free(p);
    p = before;
  }
}
0734デフォルトの名無しさん2012/03/05(月) 02:53:03.37
#include "namevalu.h"
int main(void) {
  char c[BUFFER_SIZE];
  int i = 0;
  NameValue *last_item;
  NameValue *p;
  last_item = NULL;/* 最後の項目をさすポインタは、どこもさしていない */
  while( fgets(c, BUFFER_SIZE, stdin) != NULL ) {
    p = new_item(c, ++i);
    if(p == NULL) {
      exit(EXIT_FAILURE);
    }

    p->before = last_item;/* 前の項目をさすポインタ */
    last_item = p;/* 最後の項目をさすポインタ */
  }
  free_all(last_item);
  return EXIT_SUCCESS;
}
0735デフォルトの名無しさん2012/03/05(月) 02:56:46.52
D:\work>namevalu < namevalu.h
0736デフォルトの名無しさん2012/03/05(月) 08:32:00.93
それのどこがポインタならではなんだ?
GCハンドルでも当然できるしそれすらなしに配列とインデックスでも代用できるよ
0737デフォルトの名無しさん2012/03/05(月) 08:51:30.34
つかアクセス効率で言えばガバッと確保したノード配列の要素を
インデックス(もちろんポインタでもいいが)でつなぐほうがずっと良いはずだし
1ノードずつ動的に確保するにしても、GC言語の方がメモリ効率が良い分まだマシなんじゃないの
0738デフォルトの名無しさん2012/03/05(月) 08:55:40.16
>>731
多言語やらハードウェアやらに絡まない限り無いと思う
>>733
初心者は黙っとけ
0739デフォルトの名無しさん2012/03/05(月) 09:33:58.61
Cの救済にあたる弟子たち(プゲラッチョ)
0740デフォルトの名無しさん2012/03/05(月) 09:35:25.70
Cの救済にあたる弟子たち(プゲラッチョ)
0741デフォルトの名無しさん2012/03/05(月) 17:04:57.74
>>731
思いついたのは、配列(バッファ)内の特定位置を指すエントリが大量に必要で
配列自体も複数ある場合のメモリ効率の向上・・・とか
最高効率にするには必要、というくらいでしかないけど

ポインタが64bitの環境だとして

//java  1要素:(8+4+4)byte
class Et{byte[] trgAry; int trgIdx;}
List<Et> c;

//C#  1要素:(8+4)byte
struct Et{byte[] trgAry; int trgIdx;}
IList<Et> c;

//C++  1要素:8byte
std::vector<unsigned char*> c;
0742デフォルトの名無しさん2012/03/05(月) 17:06:22.14
訂正
//java  1要素:(8+4+8)byte
0743デフォルトの名無しさん2012/03/06(火) 00:34:09.97
>>741
そうか、Javaの参照はプリミティブタイプを指せないんだっけ?
まさか指すためにBoxingするわけにもいかないので、Etのようなものを
定義する必要があるわけですね。
ちなみに、Fortranのポインタは8byteで定義できるが、配列へのポインタ
は定義できても、ポインタの配列は定義できないので、やはり構造体にくるむ
必要がある。
integer, target :: a(200)
type Et
integer, pointer :: trgElmnt
end type
type (Et) :: c(512)
c(1)%trgElmnt => a(11)
区間を指したいときは、
type Rt
integer, pointer, dimension(:) :: trgAry
end type
type (Rt) :: b(23)
b(1)%trgAry => a(1:100:4) ! a(1),a(5),a(9),...
Fortranは裏では配列記述子(開始,終了,要素間隔)で配列を管理しているので、
Rtはすくなくとも8*3=24byteよりも大きく、実際には処理系に依存するいろいろ
な定義があるので通常これよりも長い。
0744デフォルトの名無しさん2012/03/06(火) 00:39:33.05
Fortranだったら全部スカラー配列でいいだろ
0745デフォルトの名無しさん2012/03/06(火) 10:59:25.56
for(;P("\n"),R-;P("|"))for(e=C;e-;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
07467412012/03/06(火) 16:01:07.25
自己ツッコミになるけど、配列をリスト化して
longの上位32bitと下位をそれぞれインデックスにしていまえば
javaとかでも1要素8byteで事足りた

http://ideone.com/CsWax

バッファ長が2G超えるケースは
javaの配列のサイズ限界がint_maxだから扱えないし
0747デフォルトの名無しさん2012/03/07(水) 00:50:02.10
ポインタを使えばインチキが出来る

たとえばある変数のバイトオーダーを入れ替える処理を
自分で書けと言われたら?
CとJava両方書いてみれ(別にカキコしなくていい)
0748デフォルトの名無しさん2012/03/07(水) 01:23:14.68
type punningすんな
0749デフォルトの名無しさん2012/03/07(水) 12:07:27.47
>>748
どういうこと?
0750 ◆0uxK91AxII 2012/03/07(水) 18:26:48.41
>>747
>たとえばある変数のバイトオーダーを入れ替える処理を
>自分で書けと言われたら?
書かない。
0751デフォルトの名無しさん2012/03/08(木) 03:39:11.39
>>747
>自分で書けと言われたら?
ライブラリ使わせろド阿呆、って言い返す。

てか、無理にポインタ使おうとすんな。
0752デフォルトの名無しさん2012/03/08(木) 05:59:12.20
DataGridViewでクラスのメンバ変数一覧みたいなのを作って
変数とセル内容を対応させるみたいなの作るときにポインタないと辛い
クラスは参照でいけんだけどint bool floatとか値型?のもんってポインタないから死ねる
0753デフォルトの名無しさん2012/03/08(木) 06:21:14.73
2012/03/06、ばぐ太のキャップが漏れ
在日韓国人、在日朝鮮人レイシストらによる組織的な書き込みで
ニュー速+が乗っ取られる。
  野球とサッカーの対立を煽り、
スポーツ分断、イメージダウン、弱体化工作をやっているのは、
在日韓国朝鮮系密入国者の子孫である。
ttp://long.2chan.tv/jlab-long/s/long1331124927127.gif
http://uni.2ch.net/newsplus/kako/
http://uni.2ch.net/newsplus/kako/o1331/ 過去ログ倉庫
http://uni.2ch.net/test/read.cgi/newsplus/1331020468/1 関連ニュース
0754デフォルトの名無しさん2012/03/08(木) 10:45:05.68
>>752
グリッドとかでメンバ変数への直接の参照を保持することって無くない?
http://ideone.com/hhkJX

それとも行エントリ自体が値型ってこと?
0755デフォルトの名無しさん2012/03/08(木) 12:12:36.09
上で出てきた人だよね? まだそんなことやってんの?
さすがにポインタ以前の理解力の問題なんじゃないか
上で言われてるようにリフレクション使えば何の苦もないし
値型もObjectに入るはずだけど何が問題なのかわからない
0756デフォルトの名無しさん2012/03/08(木) 12:18:38.54
もしかして*(cells[1,2])=4;みたいな感じでメンバ変数を更新したいってこと?
そんなことしなくても変数名分かってんだからリフレクションで書き換えればいいだろ
0757デフォルトの名無しさん2012/03/08(木) 23:37:08.86
>>755
>上で言われてるようにリフレクション使えば何の苦もないし
なんの苦もなくは嘘だろ
すげー大変だった
これだったら絶対ポインタあったほうがいいよ
配列かどうかまで判断しないといけないとこも死ねる
実行時型情報はあくまで型だけでインスタンスを特定できるもんじゃないんだよね
つまり、特定するにはどこどこのだれだれの〜って上からたどってこないと死ねる

>>756
ちげーよ
DataGridViewで特定の変数にアクセスしたいって言ってるのになんで別の例を出すんだ
変数名わかってもどこのインスタンスの(配列のN番目という可能性もあり)どのメンバのなかのこのメンバの12番目の要素
とかいうとこまでとってこないといけなくて面倒だろうが
ポインタだったら格納時にアドレスだけ保持って「ハイ、終了」だろが
0758デフォルトの名無しさん2012/03/09(金) 00:16:46.63
>>757
ポインタだったら簡単とか言ってるけど
そのポインタの型情報はどのように取得するの?
泥臭く手書きで網羅するの?
デバッグ情報として埋め込むの?
int*とか決め打ち?

リフレクションがどういうものなのか
理解出来ていないのでは?
0759デフォルトの名無しさん2012/03/09(金) 00:22:48.79
>>758
リストにこっそり入れときゃいいじゃん
Visible falseで

リフレクションだと俺がやった感じだとあくまで型しか取得できなくて
ポインタっぽいことはできない感じだったな
できる方法があったら教えてくれ
配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ
0760デフォルトの名無しさん2012/03/09(金) 00:38:07.85
>>759
>リストにこっそり入れときゃいいじゃん
めんどくせぇよw
てか、用途が分からん例えでイメージしづらい

> 配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ
ポインタでも同じでしょ
てか、配列をポインタで管理すると
型情報の他にもしくはNULL終端縛りかlengthまで必要になるよね
0761デフォルトの名無しさん2012/03/09(金) 01:20:35.81
>>760
同じじゃないって
リフレクションが持ってるのは型だけなんだって
馬鹿でもわかるように説明すると

void* p = &unko[12];

こういう情報をとれない

>てか、配列をポインタで管理すると
そんな話してない
DataGridViewのセル1つが変数1つに対応してる形だ
こっちが挙げてる例からなんで脱線するようなことをいうんだ
お前、ツカエネー奴だろ
会議でいっつも関係ないことを発言しだす不思議ちゃんだろ
正直、邪魔だからw
0762デフォルトの名無しさん2012/03/09(金) 01:30:42.43
頭凝り固まってんな
例えば
abstract class FieldRef {
public abstract object Value { get; set; }
}
とでもしておいてリフレクション使うなり配列の要素使うなり好きに実装したら多態で綺麗に扱えるぞ
ポインタよりずっと柔軟だろ
0763デフォルトの名無しさん2012/03/09(金) 02:30:10.89
口だけでうごくプログラムをかけない初心者はダマットレ
0764デフォルトの名無しさん2012/03/09(金) 02:31:06.14
>>761
> リフレクションが持ってるのは型だけなんだって
void*で受けたら型すら分からんですよ
型が分かれば十分じゃない?他に何が必要なの?

> void* p = &unko[12];
> こういう情報をとれない
即値な理由もunkoの型も使い所もpの寿命も…
何が言いたいのか分かんない

> >てか、配列をポインタで管理すると
> そんな話してない
>> 配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ
してるじゃん

> DataGridViewのセル1つが変数1つに対応してる形だ
言ってる意味は分かるよ
型が決め打ちってことはないだろうから
デバッガのGUIフロントエンドにありがちのtreelistではなく
tree + listのツーペインのlist部分みたいな位置づけでしょ?

で、リフレクションありとなしでは手間が違うって言ってるの
バインドや取得
どう考えてもめんどくさいよ
0765デフォルトの名無しさん2012/03/09(金) 05:50:57.22
非バインドのDataGridViewはまあ時々使うけども
カラム毎に別の変数てのはちょっと賢くないなあ。
0766デフォルトの名無しさん2012/03/09(金) 06:25:18.09
>>764
超馬鹿だなお前
わかりやすい例出してやったのに
型がわかってもunkoの12番目っていう12番目ってところを保存できねーだろが
本当にカスだなお前

ってか、お前がリフレクション使ってなんにもやったことがないのはわかった
0767デフォルトの名無しさん2012/03/09(金) 08:56:18.85
>>766
>>754のソースじゃ駄目なの?

あとこういうのは?
http://ideone.com/nrlQw
07687672012/03/09(金) 10:20:14.74
ちょっと改善
http://ideone.com/ThC5i

class Entry{
  public int n;
  public int[] na = new int[15];
}
public static void Main(){
  {
    Entry et = new Entry();
    ICell c = Bind(et.na, 12);
    c.Set("200");
    et.na[12] += 50;
    Console.WriteLine(et.na[12] + " " + c.Get() + " " + c.Type()); // "250 250 System.Int32"
  }
  {
    Entry et = new Entry();
    ICell c = Bind(et, "n");
    c.Set("500");
    et.n += 50;
    Console.WriteLine(et.n + " " + c.Get() + " " + c.Type()); // "550 550 System.Int32"
  }
}
0769デフォルトの名無しさん2012/03/09(金) 12:31:42.57
#include<stdio.h>

int main(void)
{
char a[][13]={"前田敦子","大島優子","渡辺麻友"};

int i;

for (i=0; i<3; i++)

printf("%s\n",*(a+i));

return 0;
}
0770デフォルトの名無しさん2012/03/09(金) 15:47:46.93
変数名に下品な名前を使っちゃう人間は
例外なくカリカリしており、例外なく喧嘩っ早く、
流暢に煽り文句を並べるのが得意である。

その書き込みから滲み出る雰囲気たるや、
工事現場のヤンキーなDQNと全く変わらない。

さすが、デジタル土方と言われるだけのことはある。
0771デフォルトの名無しさん2012/03/09(金) 23:14:04.23
malloc多用
0772デフォルトの名無しさん2012/03/10(土) 01:14:26.00
>>767-768
お前、人の話聞く気ないならわざわざクビ突っ込まないほうがいいぞ
0773デフォルトの名無しさん2012/03/10(土) 14:26:08.58
>>761 >>766 >>772
馬鹿丸出し
0774デフォルトの名無しさん2012/03/10(土) 15:17:37.74
>>773
え?話の内容理解してたの君?
0775デフォルトの名無しさん2012/03/10(土) 15:27:53.15
彼は理解してないよ
ゆとり世代はキーワードだけ拾って
思い込みで返答しちゃう奴多い
07767672012/03/10(土) 18:32:08.71
>>761
>リフレクションが持ってるのは型だけなんだって
型だけでなくどのクラスのどのメンバって情報持ってるよ

>void* p = &unko[12];
>こういう情報をとれない
ICell c = Bind(et.na, 12); で情報を保存出来てるよ
配列でないメンバも同様
ICell c = Bind(et, "n");
構文は関係無いよね?

>>764
>unkoの12番目っていう12番目ってところを保存できねーだろが
同上

>>772
認識は上に書いた通りなんだけど
出来れば具体的に指摘して欲しい
0777デフォルトの名無しさん2012/03/10(土) 19:16:42.40
>>776
え?そんな特定の型限定のソース出されて言われても困るんだけど
0778デフォルトの名無しさん2012/03/10(土) 19:53:13.02
>>776
出来ないって事でよくね?
もちろん、(unkoさんには)出来ないという意味だが。
0779デフォルトの名無しさん2012/03/10(土) 21:42:02.79
>>777
そんなレベルの話?
C/C++でもvoid*のままじゃ読み書き出来ないでしょ
UIとしてString、例としてintの実装だけ書いたけど何も限定されてないよ

それにDataGridView使うなら基本的な型用のUIは揃ってるから
Type渡すだけユーザーが入力した文字列を勝手に変換(int.Parseとか)してくれるよ
0780デフォルトの名無しさん2012/03/11(日) 04:26:54.84
ttp://toro.2ch.net/test/read.cgi/tech/1330881286/
ほれ行ってこい
0781デフォルトの名無しさん2012/03/11(日) 04:30:31.64
ttp://toro.2ch.net/test/read.cgi/tech/1323692486/
ああ違ったこっちか
0782デフォルトの名無しさん2012/03/11(日) 05:45:09.31
>>779
だから上から読めって
思い込みで話しすぎだろお前
0783デフォルトの名無しさん2012/03/11(日) 05:57:26.14
現状、日本語でのコミュニケーションは無理だから
unkoの人はcodepadなりideoneで
さっくりコードで示したらいいんじゃないかな?

察してもらう→諭される
この繰り返しは不毛だし
本人もそんな扱いされるのは苦痛じゃない?
0784デフォルトの名無しさん2012/03/11(日) 08:13:49.30
>>611 >>752 >>782
ああ分かったよ、あんたには無理だわw
まぁ頑張ってね
0785デフォルトの名無しさん2012/03/11(日) 14:13:22.31
>>783
いや、別に回答してくれなんて頼んでないけどw
こっちが知りたい内容はもうわかってるんだし
話題を続けようがないしw
0786デフォルトの名無しさん2012/03/11(日) 18:22:07.66
ハ〜イ 日本人たちよ、こんばんは。
あなたは既に、被爆されているんですか? え〜 ホントに怖いねえ。
もう直ぐ東京にも 大地震が発生して、もう死んでしまうのですか?(小笑) あ〜 それだと良かったです。

私は人を殺すことを想像し?、頻繁にすれば? その存在が日本人でした。
私は実際に 日本人を殺すことは ないと思った。自分で 自滅してくれるんだな、この?民族は。 あ〜気持ちいい。

それでは これから日本の復興をずっと見守りながら、楽しんでまいります。一瞬で?死んでください、日本人の皆さん。

ttp://www.youtube.com/watch?v=0X8Uo4rKoVk

前スレ
韓国の青年がYouTubeで「日本人の皆さん、地震で死んで下さい」とメッセージ 2
http://engawa.2ch.net/test/read.cgi/poverty/1331454768/
0787営利利用に関するLR審議中@詳細は自治スレへ2012/03/29(木) 17:15:36.87
ポインタのわからないところは、その仕組みを理解する「必要性」だ
forやifは条件を分岐させたり繰り返したりする、これは誰でも理解できるし必要性も分かる
配列や構造体も、それを利用する際に特別な宣言を用いて利用する、これも他と差別化しやすい

ただポインタに関しては「概念」や「内部構造」の話になっている
俺もポインタが全くわからんが、わざわざポインタを利用する「必要性」が無いという事は理解できる
もちろん優良なプログラムを組む上では欠かせない要素ではあるだろうが
昨日今日に、文字の出力や条件分岐を学んだ段階の人間には、まだまだ早すぎる知識

これが理系の悪いところ
物事の必要性や順序をうまく説明できない
説明するとなると、妙に入り組んだ話になったり
別の聞きなれない単語を持ち出したりしてと
話を聞けば聞くほど、こんがらがってくる

かと思えば、抽象的で漠然としたイメージの話をしだしたり
そのイメージも、人それぞれで違っているから更に分かりづらい
ひょっとしたら、どいつもこいつも「分かってるつもり」で「なんとなく使えてる」だけで
その真意には届いていないのではないか?とも思えてしまう

だから重要なのは
「必要性」「重要性」「利便性」
この3つを押さえて、ポインタを利用しなかった場合にどういう手間やデメリットが発生するのか
という具体例も持ち出してくれないと理解に苦しむ
制御文や配列のように、使い方が明確化されていればこんな苦労も無いのだが・・・
0788営利利用に関するLR審議中@詳細は自治スレへ2012/03/29(木) 17:46:26.00
変数を指す変数があれば便利な場合がある
そんだけ
配列とかと同じ
0789営利利用に関するLR審議中@詳細は自治スレへ2012/03/29(木) 17:50:24.84
必要性とかわりとすぐピンときたけどなw
関数に配列の先頭アドレス渡すのって合理的じゃね?
変数のサイズ、構造体のサイズってのを理解している段階であれば分かるはず。
0790営利利用に関するLR審議中@詳細は自治スレへ2012/03/29(木) 23:46:46.69
そんなことぐらい自分で判断しやがれ
ここで聞いても答えはでんだろ
他の人の意見を聞くならまだしも
お前が信じるかどうかなんて知ったことじゃねえ
0791営利利用に関するLR審議中@詳細は自治スレへ2012/03/29(木) 23:49:54.48
Cをつかうなら、高速を追求する。ムダをはぶくために、ポインタを活用
0792営利利用に関するLR審議中@詳細は自治スレへ2012/03/30(金) 00:53:28.26
BMPみたいな数MB単位の巨大配列とかいじるとき、ポインタなしだとやってられんでしょ
動画だったらこれをさらに数十枚分キャッシュとかが普通なわけで
まあ、せいぜい数KB程度の配列や構造体しか扱ったことのない者には、なかなかありがたみはわからんかもね
0793営利利用に関するLR審議中@詳細は自治スレへ2012/03/30(金) 01:11:00.92
つまり

コインロッカー=実際の変数
封筒=ポインタ変数
週刊少年ジャンプ=実際の変数の中身

ジャンプの号数と、ロッカーのナンバーは相互関係にある
(例 ジャンプ40号は40番のロッカーに入っている)

とした場合

封筒の中に、コインロッカーの番号を書いた紙が入っており
その紙に書いた番号を参照することで、目的の号数のジャンプを手に入れることが出来る
という解釈でいいんだろうか?
0794営利利用に関するLR審議中@詳細は自治スレへ2012/03/30(金) 01:32:08.74
コインロッカーだの箱だのといった変に具体的なものよりも、
方眼紙のマス一つが1バイトみたいな感じで抽象的に考えたほうがいいと思う
0795営利利用に関するLR審議中@詳細は自治スレへ2012/03/30(金) 05:40:48.13
>>787
必要性もクソも、ポインタを備えた言語は多くの場合
他の言語にあるような「参照」がないんだからさ…
0796営利利用に関するLR審議中@詳細は自治スレへ2012/03/30(金) 10:17:10.90
>>792
配列操作はポインタ無い方が最適化しやすいでしょ
0797営利利用に関するLR審議中@詳細は自治スレへ2012/03/31(土) 12:16:00.08
>>788
>>789
>>792
おまえらが言ってるのはただの「参照」。
そんなのはjavaやその他の言語にもある。
ていうか配列を丸ごとコピーする実装の言語なんてたぶん無いw
ポインタが難しいのはそこじゃないことを判りもしないで恥ずかしいレスすんな。
0798営利利用に関するLR審議中@詳細は自治スレへ2012/03/31(土) 20:11:03.67
>>797
難しいのがどこか言わずにそんなレスしても恥ずかしいだけだぞw
0799営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 08:24:48.19
教えて欲しいなら憎まれ口叩くより素直に教えてくださいって言った方が得だよ
0800営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 09:10:11.09
結論 プログラマーは大半が揚げ足取りで、そこで自分の優位性を誇示したがる人種
0801営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 11:27:12.98
揚げ足取りの達人なのは必須スキルなので優位性は存在しない
似非ぷろぐらまを排除する性質については認める
0802営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 15:22:23.81
揚げ足取りをはじめとした強弁や詭弁の技術を利用した責任回避が本当に食えるスキルというものだからな
0803営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 15:22:56.98
えー。C++ではともかく、Cではアドレスとサイズと型を格納する変数って言えばすむだけじゃーん^^
アドレスのn番地を指し、そこからmバイトを型xと看做す。そう教えてくれてるだけー^^
0804営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 15:53:58.42
↑すげーな初心者ってw
0805営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 16:04:22.04
すごいだろ^^
0806営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 16:08:50.79
ポインタを難しく感じるのは頭が悪いからだって結論でてるじゃん
>>797が「ポインタが難しい」って言ってるのは>>797の頭が悪いからで、
頭悪くない人にはポインタはどこも難しくない。つるっと入ってくる。
0807営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 18:28:51.75
>>803
アドレスの格納先は変数だけど、サイズや型情報が送られるのは構文解析器の方じゃね?

>>804
こんなもんだろ
0808営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 12:28:21.19
>>799
ポインタのどこが難しいのかどうか教えて下さい。お願いします

スレタイ同様、私には「ポインタを難しいと言う奴が理解できない」ので
0809営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 13:19:38.20
>>793
下手に例えるとよくないぞw
ポインタでそんなんだったら、
OOPにおいてはまたワンワンニャーニャーして遠回りしてしまうぞ。
0810営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 15:02:35.48
>>808
で、なんでそれを >>799 に訊こうと思った?
0811営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 08:48:18.31
>>808
断片的に何度か書いているが、もっかいまとめてみる。
まず参照だ。コードの例で示してみる。
void func_a() {
OBJ a = new OBJ[10000]; //でっかい配列
func_b(a); //関数内では参照している
//なんかの処理
//ここでaは不要になるので、コンパイラは自動的に解放処理を呼び出す
}
void func_b(OBJ b) {
//なんかの処理
//ここでbは不要になるので、コンパイラは自動的に解放処理を呼び出す
}
こんなコードがあったとする。func_bにはaの参照を渡している。
ここで大事なのはaとbの解放タイミングがわからない点だ。どちらかの処理が済んでないのに、もう片方を解放したら落ちてしまう。
さて、参照とポインタの違いは「参照ならポインタ以外のワークも共有できる」という点だ。この場合ならbに渡す時に、「この変数は2箇所で使われている」という情報を書き込むことが出来る。
それにより、aおよびbの解放時に、じかに解放するのでなく、「使われている回数を1引き、0になったら解放する」という処理に変えることで、安全に解放処理を呼び出すことができる。

ポインタではそうはいかない。func_bに渡されるのはaかもしれないし、&a[1]かもしれない。するとワークは渡せないので、もちろんfunc_bで解放することはできない。すると解放処理をプログラマにやらせるしかない。
だからfree関数が用意されている。しかし上記のケースでは、func_aがfunc_bより先に終わるかもしれないから、安易にfunc_aの末尾でfree(a)などとやったら落ちてしまう。これがポインタの難しいところだ。
0812営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 08:49:28.68
↑いけね。書き忘れた。func_bはfunc_aと非同期に動くと思ってくれ。
0813営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 11:35:18.84
>>811
それで何が言いたいのか知らんが、スマートポインタって聞いたことないの?
0814営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 11:52:58.21
>>811はExceptional C++でも読むべき
0815営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 12:18:44.16
>>810
アスペ乙
0816営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 12:40:13.80
>>811
そういうのはポインタどうこうより
ファイルハンドル等でも同様のリソース管理の話じゃないのか?
C++ではRAIIで扱えばいいだろう
0817営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 16:41:57.57
>>811
なるほど、「難しい」というだけあってまるで理解していない。
帰れ。
0818営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 17:16:40.82
>>811
参照参照つっといて、いわゆるC++の参照/ポインタという関係じゃないのなw
しかも非同期で排他処理の部分を持ち出して何がいいたいのやらw
0819営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 18:48:00.32
コメント欄に限りがあるから非同期処理を例に挙げただけなのに、
否定するために読んでる奴らの頭には何を言っても通じないようだな。
そうやって勝手に罵り合ってろよ。
0820営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 19:49:39.30
自身有り気に>>797のレスして>>811じゃあな・・・
何を言っても通じないのは>>813-818を否定の一言で片付けるお前さんの方かもしれんよ
0821営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 12:38:38.24
811の翻訳(エスパー)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

void* f(void* a) {
sleep(1);
printf("%d\n", *((int*)a));
}

g() {
int* a = malloc(sizeof(*a));
*a = 123;

pthread_attr_t pta;
pthread_attr_init(&pta);
pthread_attr_setdetachstate(&pta, PTHREAD_CREATE_DETACHED);

pthread_t pt;
pthread_create(&pt, &pta, f, (void*)a);

free(a);
}

main() {
g();
sleep(2);
}
08228212012/04/04(水) 12:43:36.76
たしかにこの場合f()で問題が起きる
(この手のバグは発見が難しいので重要)
0823営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 13:40:31.61
>>821の謎の努力の意図がわからないw
>>811にもかいてあるように、「非同期で」っていう説明で十分だよ。
それで分からないやつはここにはいないだろう。
0824営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 13:41:01.36
あ、かいてたのは>>812だった。
08258212012/04/04(水) 15:08:48.17
>>824
バカ乙
0826営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 18:45:10.46
このスレの住人に限らず、「ポインタが難しい」っていう人は
排他制御やリソース管理、例外安全、等々も難しく感じるかもしれない

スカラ的な頭の良さなのか、それとも向き不向きのようなものか分からないけど

メモリに関してはGCによって凌いだとしても
その先で壁に当たりそう
0827営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 18:46:12.27
あと>>787のレス見て思ったんだけど
>「必要性」「重要性」「利便性」
これを「自分で考えようとするかどうか」がひとつの境界なんじゃないかと
0828営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 18:48:56.20
排他とか再帰とかは、上から下というそれまでの法則が乱れるから混乱するんだよw
難しい、というよりは素直に表現すると、単に複雑さの問題だな。
0829デフォルトの名無しさん2012/04/14(土) 09:16:16.86
その複雑さを人間の扱える形にする為のプロセス代数や再帰理論です
同様にポインタに関しても分離論理とか使うやり方があるから感覚が無理ならそういう方向から攻めるのも手
0830デフォルトの名無しさん2012/04/14(土) 15:46:39.14
100位まで読んでここまで飛ばして書き込んでる馬鹿だけど、
一番単純なポインタは確保された実データが入ってるメモリの位置を示すアドレスが入ってる変数でいいんだよね?
配列なら先頭のアドレスが入ってる。
ポインタaへのポインタbとなると、ポインタbにはポインタaを指すアドレスが入っていて、
結局はポインタaが指すアドレスにあるデータが変わるってだけなのかな??
0831デフォルトの名無しさん2012/04/14(土) 16:47:36.91
馬鹿には無理
0832デフォルトの名無しさん2012/04/14(土) 17:03:53.00
#include<stdio.h>

int main(void)
{
int x;

  int *y = &x;

*y = 10;

printf("%d", x);

return 0;
}
0833デフォルトの名無しさん2012/04/14(土) 18:39:14.17
>>830
>一番単純なポインタは確保された実データが入ってるメモリの位置を示すアドレス
一番単純も何も、ただそれだけ。

>が入ってる変数でいいんだよね?
ポインタ変数は変数だけど、ポインタは変数じゃない。定数もありうる。
0834デフォルトの名無しさん2012/04/14(土) 22:02:06.09
>>832
初心者向けに良くある例文コードでだいたいを理解出来たら馬鹿だと思い知らずにすむのですが・・・。
>>833
>>32が解らない方で、>>57が、もしそのまま実践してくれるのなら凄く親切な講師。
そんな事を思いつつ、試しに聞いてみました。

参照型の一つの種類のようなものだと思うのですが、ポインタaへのポインタbみたいな、
>>832の int *y = &x; もxのアドレスをポインタyに入れて10を代入してそのままxに10が入る。
ショートカット、エイリアス、シンボリックリンクみたいなものとしてそればいいのかなんなのやら。
定数もポインタが示すアドレスにあるものを指す、と言う理解でいいのか・・・。
0835デフォルトの名無しさん2012/04/15(日) 12:16:04.52
コード実行結果
http://ideone.com/KoEwp
http://ideone.com/KkH5E

配列の基本が理解出来たら大体分かったと思っていい
車で言うとJavaとかはオートマ、C/C++とかはマニュアル

その後にポインタ演算、スタック、ヒープ
Javaの参照との違いとか色々知っていけばいい

(java)
class Main{
  static void f(int[] a){ a[0] += 5; }
  public static void main (String[] args) {
    int[] a = new int[1];
    a[0] = 10;
    f(a);
    System.out.println(a[0]); // 15
  }
}
(C++)
#include <iostream>
void f(int* a){ a[0] += 5; }
int main() {
  int a[1];
  a[0] = 10;
  f(a);
  std::cout<< a[0] << std::endl; // 15
  return 0;
}
0836デフォルトの名無しさん2012/04/15(日) 20:59:29.49
それだとJavaの参照と、ってとこがさっぱりわかんなくないか?
0837デフォルトの名無しさん2012/04/16(月) 16:34:45.69
ぬるぽ
0838デフォルトの名無しさん2012/04/16(月) 17:14:17.34
東電がっ
0839デフォルトの名無しさん2012/04/21(土) 23:41:40.87
          _
      ミ ∠_)
         /
         /   \\
 ウイーン  Γ/了     | |
  ウイーン  |.@|    | | ガッガッガッ
       | / | .     人
       |/ |    <  >_Λ∩
      _/  | //. V`Д´)/
      (_フ彡           /
0840デフォルトの名無しさん2012/05/14(月) 06:34:56.54
atexit()でつかう
0841デフォルトの名無しさん2012/05/27(日) 19:09:08.71
参照とのハッキリとした違いは、演算ができるってところだろうな
0842デフォルトの名無しさん2012/05/27(日) 19:48:36.75
そもそも山椒なんてポインタを理解出来ない落ちこぼれが作った後付概念だろ
0843デフォルトの名無しさん2012/05/27(日) 19:49:55.95
>>842
どっちかっつーとC言語の悪影響だと思う
単に表記が解りにくいだけだったのを、ポインタそのものの問題にすり替えちゃった
0844デフォルトの名無しさん2012/05/28(月) 14:38:06.66
C++の引数で、参照とポインタの使い分けどうしてる?
俺は全てをポインタにしてる。

引数に限らずそもそも参照は、戻り値の時ぐらいしか使わない。
0845デフォルトの名無しさん2012/05/28(月) 15:01:14.58
hoge & func(){
hoge *fuga = new Fuga();
fuga->hage();
return *fuga;
}
こうですか?
0846デフォルトの名無しさん2012/05/28(月) 15:06:19.53
んで、メンバ関数でもないのに参照を返すと。┐( ・〜・)┌
0847デフォルトの名無しさん2012/05/28(月) 18:29:28.77
>>844
NULLを許容しないとき
0848デフォルトの名無しさん2012/05/28(月) 19:57:01.40
>>844
・コピーコンストラクタ(C++11ならmoveコンストラクタも)、operator=は参照。
・swapも参照。
・API等既存のライブラリに合わせる必要があるならそれに合わす。
それ以外は
 ・void*は参照で代わりが効かないのでポインタ。
 ・read-onlyで参照が取れるならconst付き参照。
 ・書き込みがあるならポインタ。
ポインタはスマートポインタを含む。
0849デフォルトの名無しさん2012/05/28(月) 22:25:42.21
個人的にC++の参照は、あんまり好きになれないなぁ。
どう形容すべきか分からないんだが、なんかこう、気持ち悪い。
演算子オーバーロードとかにほぼ必須だってのは何となく解るんだけど。
0850デフォルトの名無しさん2012/05/29(火) 09:38:11.86
呼び出し側のコードだけでは値渡しか参照渡しか分からない所とか?
■ このスレッドは過去ログ倉庫に格納されています