[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 19:54 / Filesize : 171 KB / Number-of Response : 914
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

ポインタはどうやって学ぶべきか



1 名前:デフォルトの名無しさん [2007/10/24(水) 04:07:56 ]
なんと!意外にもスレが無かったので立ててみました

先日のソフトウェア開発技術者試験午後UのB木のポインタ表現
近年の基本情報技術者試験の午後C言語問題の自己参照構造体
など物凄く出来が悪いです。

ゆとり?文系?自作減少?
ブラックボックス化されてメモリ管理やコンピュータの細かい知識が不要となった?

本当にポインターは必要なのか!?議論しましょう

237 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:17:15 ]
>>236
いろいろわかってなさ杉

238 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:29:44 ]
初心者だけど

>>233
のコードが実行できると
どっかのメモリに10が代入されるってことなのか?

239 名前:236 mailto:sage [2007/11/06(火) 15:34:16 ]
>>237
ポインタのサイズは指している型に関わらず同じ、なんてことは無かったような気がするんだけど
間違ってる?

240 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:34:21 ]
aに10が入る

241 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:37:47 ]
>>239
ポインタはint型のサイズと同じって記憶があるけど。

242 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:37:55 ]
>>239
ポインタのサイズが型によって違う処理系教えてくれ

243 名前:デフォルトの名無しさん [2007/11/06(火) 15:47:56 ]
>>238
doubleにintポインタのアドレスを入れるけど、
doubleの値をintポインタにキャストしてるから、
結局int aに値を入れてるのと同じ。

244 名前:デフォルトの名無しさん [2007/11/06(火) 15:48:44 ]
>>243
語弊があるな、intのアドレスをdoubleの値に入れる。かな

245 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:55:40 ]
>>243
なるほどね、読み返して見たら納得できた。



246 名前:236 mailto:sage [2007/11/06(火) 16:24:31 ]
どっかで見た気がしたんだが記憶違いだったか
しかし、void*とかmallocとか考えるとありえないなorz
スレ汚しすまんかった

247 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 16:48:26 ]
>>241
それはない

248 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 16:59:09 ]
>>241
そういう場合もある

249 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:25:36 ]
現状そういう処理系が実在しないにしても
規格上はint *とdouble *が安全に変換できるとは限らない
void *を介しても同じ事

250 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:37:14 ]
昔々、ポインタにはfarとnearがあっての…

251 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 19:33:07 ]
ポインタなんて今時覚える必要ないと思う。
C#とかポインタを気にせずプログラミングできる言語が主流になりゃいい。
今後PCはどんどん高性能化していって統合環境が整うんだからポインタみたいな
危険な構造、なくしてけばいいよ。
そういうのはコンパイラに任せとけ。

252 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 21:20:12 ]
例えば貴方の身の回りの家電や車の制御プログラムにC#を入れるとな?
こういうマイコンは限られたメモリをいかに容量的に効率的に高速に使うかが大事

253 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 21:24:25 ]
>>252
ただ現実にはそういう方向かもね。携帯とか Java 走ってる。

あと、C 使いこなすにはポインタ理解する必要はあるけど、
必要以上にポインタを使い回す事はない。パフォーマンスが
心配なら実際 profiling してから直すべき。

ついでに、あまり複雑なことをしなけりゃポインタも簡単。


254 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:10:34 ]
Javaとかにも、配列の途中からを指す方法があればなあ
配列そのものと、何番目かをあらわすIndexと。二つ渡すのが非常にかっこわるい

255 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:13:04 ]
SubList使えよ



256 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:36:26 ]
携帯Javaにはそんな便利なもんねえ

257 名前:デフォルトの名無しさん [2007/11/07(水) 06:26:59 ]
>>251
C#、Javaはむしろポインタだらけじゃないか?

258 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 06:56:56 ]
>>243
>doubleにintポインタのアドレスを入れるけど、
>doubleの値をintポインタにキャストしてるから、
>結局int aに値を入れてるのと同じ。

double*に入れるときは問題ないけど
doubleに入れるときはアドレス値がdouble値としてふさわしくないときに
正規化されて他の正しい浮動小数点数に変換されるだろうから
int*にキャストしたときには別の場所を指してる可能性があるね


259 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 07:39:19 ]
そんな環境実際にあんの?

260 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 08:32:42 ]
>>259
確かにその通り。正規化云々以前にポインタ値をdouble変数に入れられない。

261 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 08:39:01 ]
どうせ二進表現の数なんだから、ビット幅さえ合えば入れられるんじゃないの?
数値としては別な物になるだろうけど。

262 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 10:38:38 ]
>>261
つ[規格]

263 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 11:06:58 ]
アセンブラをやれ でFA?

264 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 14:24:27 ]
>>261
longに入れたりintに入れたりは幅だけ合ってれば出来るけど
doubleの場合は規格化された値しか入れられないよ

265 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 14:27:32 ]
>>261
union {
double d;
int *p;
} hoge;

hoge.p = (int *)-1;
printf("%f", hoge.d);

これやってみ




266 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 19:32:13 ]
なんていうか
無理に1000いくまで議論しなくてもいいと思うんだ・・・

267 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:15:55 ]
関数ポインタ

int func(int a) {
 return a*2;
}

main(){
 int (*p_func)(int);
 p_func = func;

 (*p_func)(2); //実行方法
}





268 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:25:14 ]
関数へのポインタだろ

269 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:25:29 ]
関数へのポインタへのダボーポインタだろ

270 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:42:55 ]
これは何ですか?関数配列へのポインタ?関数へのポインタの配列?

void (*p_funcs[])(void) = {funca, funcb};


271 名前:デフォルトの名無しさん [2007/11/07(水) 22:43:34 ]
ポインタの配列
int* ponta[10];

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



272 名前:デフォルトの名無しさん [2007/11/07(水) 22:45:56 ]
これだと関数の戻り値へのポインタなのか誰か関数とかまとめて

void *func(void);


273 名前:デフォルトの名無しさん [2007/11/07(水) 22:51:54 ]
関数って配列にできるんですか

274 名前:デフォルトの名無しさん [2007/11/07(水) 22:55:31 ]
関数配列の戻り値へのポンタ
int *ponta[10];


275 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:49:29 ]
// 関数ポンタ配列
#include <stdio.h>
typedef int (*pKANSUU)(int);
int pontax0(int ponta){
return ponta-ponta;
}
int pontax1( int ponta ){
return ponta;
}
int pontax2(int ponta ){
return 2*ponta;
}
int main(){
pKANSUU ponta[3]; //int (*ponta[3])(int);
ponta[0] = &pontax0;
ponta[1] = &pontax1;
ponta[2] = &pontax2;
printf("x0: %d, x1: %d, x2: %d\n", (ponta[0])(100), (ponta[1])(100), ponta[2](100) );
return 0;
}



276 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:55:36 ]
なんか変なレスが混ざってるんだが、わざとやってるのか?

277 名前:デフォルトの名無しさん [2007/11/08(木) 00:00:13 ]
なんか間違ってね?

278 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:05:54 ]
>>270の答えは何ポンタ?

279 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:06:44 ]
関数配列ってなに

280 名前:デフォルトの名無しさん [2007/11/08(木) 00:14:16 ]
>>279
つ kannsuuhairetsu[] = {kannsuu0, kannsuu1, kannsuu2,......};

281 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:27:05 ]
関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね?
もともとはどっちが正しいの?

282 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:06:42 ]
元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、
世間に受け入れられたなんて話を聞いたことがある。

283 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:17:09 ]
余計ややこしくなった気もしますね

284 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 06:10:44 ]
ジャンプテーブル

285 名前:デフォルトの名無しさん [2007/11/08(木) 06:50:19 ]
関数の戻り値へのポインタ
void *func(void);



286 名前:デフォルトの名無しさん [2007/11/08(木) 06:52:01 ]
関数の戻り値の型が不貞の時は
void func(void);
で宣言していいんですか?引数が不貞の突起も?

287 名前:デフォルトの名無しさん [2007/11/08(木) 07:05:56 ]
://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B

288 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 07:49:01 ]
>不貞の突起
なにやら面妖な……

関数の戻り値型は一致しないといけません。まぁ、呼び出し側で値を使わないなら何でも構いませんが。
引き数に関しては、プロトタイプ宣言するなら一致している必要が出てくるのでなしと宣言したらなしになるので、
宣言したくないならなし(void)書いてはいけません。

289 名前:デフォルトの名無しさん [2007/11/08(木) 17:33:36 ]
教えてください。
void swap_ptr(char **a, char **b)
{
char *temp;
temp = *a;
*a = *b;
*b = temp;
}

int main(void)
{
char *str_a = "ABC";
char *str_b = "123";
swap_ptr(&str_a, &str_b);
printf("str_a=%s str_b=%s\n", str_a, str_b);
return 0;
}

↑のは正常に文字列の入れ替えが出来ます。
ならば

void swap_ptr(char **a, char **b)
{
char *temp;
*temp = **a;
**a = **b;
**b = *temp;
}

にしたら先頭の一文字だけ交換されるのか・・・と思ったら、交換されない上Warningまで出ます。
何がおかしいのでしょうか?

290 名前:デフォルトの名無しさん [2007/11/08(木) 17:35:09 ]
さらに

void swap_ptr(char **a, char **b)
{
char *temp;
&temp = a;
a = b;
b = &temp;
}

にしたらコンパイルすらできません。この場合はaとbのスタック変数のメモリアドレスそのものを(物理的に)交換しようとしているからなのでしょうか?

291 名前:デフォルトの名無しさん [2007/11/08(木) 17:39:22 ]
あ、>>289はWarningは出ないけどコンパイル後実行させた時に
>『問題が発生したため、a.exe を終了します。 ご不便をおかけして申し訳ありません。』
という致命的なエラーで落ちます。


292 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:41:14 ]
>>289の後者は、
void swap_ptr(char ** a, char ** b) {char temp = ** a; ** a = ** b; ** b = temp;}
でないと辻褄が合わない。
そもそもchar * temp; だけではポインタは初期化されていないので、* temp = ...; とした場合不正アクセスになる。

293 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:41:18 ]
変数に入ってる具体的な数字をprintしてみればすぐわかる

294 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:42:52 ]
更に、>290のように&演算子を使った値は右辺値なので代入ができない。

295 名前:デフォルトの名無しさん [2007/11/08(木) 17:54:38 ]
printしたらAが出ました。
printf("%c\n",**a);



296 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:03:22 ]
アホかい。

297 名前:デフォルトの名無しさん [2007/11/08(木) 18:10:38 ]
&str_aを引数で受け取った場合、

char **a;

&a: ?
a: ?
*a: a配列全体を指すアドレス
**a: aの実体(1文字)

ローカル変数のスタックはどこにいった

298 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:13:38 ]
&a: 文字列のアドレスのアドレス
a: 文字列のアドレス
*a: 文字列(文字配列へのポインタ)
**a: 先頭文字

299 名前:デフォルトの名無しさん [2007/11/08(木) 18:14:52 ]
>>292
その通りにやってもエラで落ちます・・

300 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:16:03 ]
違った、
*a: 文字列(文字へのポインタ)

301 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:19:16 ]
&a: ローカル変数a自身のアドレス
a: aの指すアドレス
*a: aの指すアドレスの中身(文字配列全体)を指すアドレス?
**a: aの指すアドレスの・・・?


302 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:31:24 ]
まとめてみます
これでなんでエラーが出るんでしょう。


#include <stdio.h>

void swap_ptr(char **a, char **b)
{
char temp;
temp = **a;
**a = **b;
**b = temp;
}

int main(void)
{
char *str_a = "ABC";
char *str_b = "123";

swap_ptr(&str_a, &str_b);
printf("str_a=%s str_b=%s\n", str_a, str_b);
return 0;
}


予想される結果:str_a=1BC str_b=A23
現実:コンパイルは通るけど実行後何も表示されずに即エラー落ち


303 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:36:23 ]
>>299
>292を使うには、main()でchar str_a[] = "ABC"などとしないといけない。


304 名前:デフォルトの名無しさん [2007/11/08(木) 18:38:19 ]
str_a[0]='1';

305 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:51:37 ]
>>303
 char str_a[] = "ABC"; (引数&str_a)もしくは
 char **str_a = "ABC";(引数str_a)で宣言すると
無事に"文字列"全体が交換されたんですけど、先頭文字だけでは無いんですね。何故か



306 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:53:48 ]
いや、なんでもないです。>>305は無視してください

307 名前:デフォルトの名無しさん [2007/11/08(木) 19:56:18 ]
ポインタのポインタのポインタのポインタとか
ヘンタイじみたモノは使うのを辞めましょう

308 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 20:16:36 ]
文字列リテラルを書き換えてはいけない

309 名前:デフォルトの名無しさん [2007/11/08(木) 23:51:48 ]
>>305
どうでも良いけど、警告でねーか?
引数とわたす値の型が違ってるんだし
全体が交換されたからといって
こんな間違ったポインタの使い方
なんの役にもたたねぇぞ

310 名前:デフォルトの名無しさん [2007/11/09(金) 00:27:30 ]
void main()
{
  (*************printf)("hello\n");
}

これがコンパイルできるのはなぜですか?
気になって夜もろくに眠れません。
誰か教えて!!

311 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 00:31:10 ]
寝なくていいよ

312 名前:デフォルトの名無しさん [2007/11/09(金) 03:30:41 ]


313 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:13:25 ]
void main()
{
  (*************************************************************************************************************************************************************************printf)("hello\n");
}

これも出来たから大丈夫


314 名前:デフォルトの名無しさん [2007/11/09(金) 22:16:57 ]

local.joelonsoftware.com/mediawiki/index.php/Java%E3%82%B9%E3%82%AF%E3%83%BC%E3%83%AB%E3%81%AE%E5%8D%B1%E9%99%BA
あなたが再帰アルゴリズムを数秒で書け、連結リストを操作するポインタを使った関数をホワイトボードに書くのと同じくらい早く実装できる大学3年生なら、私たちのニューヨークでのサマーインターンプログラムをチェックしてほしい! 申し込みの締め切りは2月1日だ。

315 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 23:25:03 ]
つーかこれ通るんだから。
int main(void) {
1;
return 0;
}



316 名前:デフォルトの名無しさん [2007/11/10(土) 00:39:09 ]
main(){
('A')
}


317 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:41:07 ]
懐かしい!!ポインタは面白いね

char *s1, *s2;
while (*(unsigned long long *)s2 = *(unsigned long long *)s1);

この超ドSなコピーとかやってみ?ほんとハラハラさせてくれるよね

318 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:45:28 ]
s2++,s1++するの忘れた
ついポインタに目がいってしまいました

319 名前:デフォルトの名無しさん [2007/11/10(土) 01:52:25 ]
main(){
('A')マンドクセ
}

320 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:02:52 ]
ボインたん (;´Д`)ハァハァ

321 名前:デフォルトの名無しさん [2007/11/10(土) 02:21:33 ]
(ポインタをメンバに持つ構造体)をメンバに持つ構造体へのポインタ

あたりの自己参照構造体が難しいのですが・・・どうすりゃいいんだ〜〜〜〜


322 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:28:14 ]
struct Node
{
struct Node *pNext;
void *ptr;
};

自己参照構造体ってこんなんだっけ?

323 名前:デフォルトの名無しさん [2007/11/10(土) 02:31:10 ]
こんなやつ
自己参照構造体が苦手でよくソフ開受かったな俺

typedef struct _person {
 int number;
 char name[40];
 struct _person *prev;
 struct _person *next;
} person;

main() {
 prson *p;
}



324 名前:デフォルトの名無しさん [2007/11/10(土) 02:34:46 ]
メンバで「struct _person」を使う理由はまだ宣言されていないから

「struct _person」を「person」という省略名で宣言したいが、
メンバの定義段階では、「struct _person」は定義済みだが未だ「person」は定義されていないため
「struct _person」というダミーの名前を使わないとコンパイルエラーになるからって奴。

325 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:42:48 ]
typedefとか使わなくていいんじゃないかと思う今日この頃


C言語は今でも
struct _person {
 int number;
 char name[40];
 struct _person *prev;
 struct _person *next;
} ;
main() {
 _person *p;
}
こういう書き方はだめなんだっけ?



326 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:48:13 ]
>>325
だめ
そいつはC++でしかできない

327 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:57:55 ]
>>326
そうなんかd
最近「C言語で開発」とか言われても、開発環境がC++だから
どこまでがCの仕様なのかわからなくなることがある

328 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 02:59:49 ]
C++コンパイラ使ってベターCな開発するのはいいが、
その機能がCのものなのかC++のものなのかも理解して
いないような香具師らもウジャウジャいるから気をつけろ。

329 名前:デフォルトの名無しさん [2007/11/10(土) 03:18:38 ]
>>326
え??いいんじゃないの?

330 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 03:20:31 ]
>>328
俺の事だ/(^o^)\

331 名前:デフォルトの名無しさん [2007/11/10(土) 03:20:49 ]
>>326

あ、今試したらだめだった
なんでダメなんだっけ?

332 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 03:24:53 ]
structの部分も含めて「型」なんだって事じゃないの?

333 名前:デフォルトの名無しさん [2007/11/10(土) 03:26:19 ]
つまり、main() {
 struct _person *p;
}
にしたらOKってことか

334 名前:デフォルトの名無しさん [2007/11/10(土) 03:59:01 ]
ヌルポインター

335 名前:デフォルトの名無しさん [2007/11/10(土) 04:10:51 ]
以下のコードでコメントアウトをはずすとエラーが起こるのは何故ですか??

#include <stdio.h>

int main(void)
{
char *p = "ABCD";
char *q;
q = p;
// q[1] = 'D';
printf("p = %s\nq = %s\n", p, q);
return 0;
}




336 名前:デフォルトの名無しさん [2007/11/10(土) 04:12:55 ]
char p[] = "ABCD"; と宣言したら正常に動作した(ADCD)のですが、

なんでですか?

337 名前:デフォルトの名無しさん [2007/11/10(土) 04:13:26 ]
ポインタは配列で操作出来るのでは






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<171KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef