- 締切済み
C言語 エラトステネスのふるい ポインタ
C言語のプログラミングなのですがどなたか教えて頂けませんか。(説明も) エラトステネスのふるいを用いて,10000 までの自然数に素数がいくつあるかを表示するプログラムを作れ。 ただし , 配列は用いず, ポインタを用いること メモリの確保には malloを使うこと よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- asciiz
- ベストアンサー率70% (6849/9742)
「ポインタを使ってみよう!」っていう練習問題ですね。 練習問題は自分で組まなきゃ力になりません。 まあまずは、配列使ってでも「エラトステネスのふるい」プログラムを組んじゃいましょう。 それが出来たら、配列へのアクセス部分をポインタに置き換えるだけです。 C言語において、配列とポインタは同値ですので。 int p[10000]; #intの配列 p int *q; #intを指すポインタ q q = &p[0]; #qにp配列の先頭アドレスを代入する こうした時、 p[0] = 10; *q = 10; これはどちらも配列p[0]のメモリに10を入れるという効果があります。 p[1] = 20; *((int *)q + 1) = 20; これはどちらも配列p[1]のメモリに20を入れるという効果があります。 ご質問の問題なら、配列へのアクセス方法をポインタ化するだけで、いいでしょう。 ただ、ポインタと言うのはメモリ上の位置だけを指すものですから、そこは自分でメモリ確保した範囲で使わなければいけません。 メモリ確保するのが、malloc(Memory Allocation)関数、開放するのが free関数です。 q = (int *)malloc(sizeof(int) * 10000); これで、int変数10000個分のメモリを確保できます。 開放するときは free(q); これだけです。 でも、きちんと開放しなければ、mallocのたびにメモリを食っていき、しまいには「メモリ不足」でエラーになってしまいます。 まあ、単発のプログラムでは、プログラム終了時にそのプログラムから malloc()で確保したメモリは自動解放されてしまうので、ほとんど悪影響は無いんですけども。 ずっと動作させ続けるプログラムだと、メモリの管理は重要になってきます。