2017-01-17 5 views
-4

関数を書くとします。 int read_file (char *filename, void *abc) ファイルを読み込んで数値を配列に入れます。abcが指しています。 voidポインタを使用する必要があります - int *abc voidの代わりにどうすればいいのですか?abcは構文的に配列のように扱い、abc[0]=1のようなことをしますが、ここではそれを行うことはできませんvoidポインタ無効ポインタを理解していない/キャストする方法? (Cプログラミング)

私はあまりvoidポインターに精通していませんし、これをどのように機能させるべきですか。助けてください!私はコードを掲示しないことを好みます。これは学校の割り当てのためのもので、ファイルの情報をabcで指し示されている配列にどのように置くか知りたがります。

int abcで指定されている場合は、ファイル情報を配列に格納することに既に精通しています。

+1

尋ねる内容が不明です。 [ask]を参照し、[mcve]を提供してください。 – Olaf

+0

@Olaf - 明確ではないことはありますか?この男には 'void *'パラメータ( 'int'配列へのポインタを含んでいることがわかっています)を渡す関数があり、' int'配列にどのようにアクセスするのか不思議です。宿題で、彼は明らかにCの基礎を学んでいます。 –

+0

なぜ関数引数リストで 'void *'を使わなければならないのですか?あなたは常にそれが指されている 'int'の配列であることを知っていますか?関数の引数リストで 'void *'を使う必要があるが、それが常に舞台裏で 'int *'であることがわかっているなら、 'int read_file(char * filename、void * vp_abc){int * abc = vp_abc; ...残りのコードを...} ' - 単純に無意味なvoidポインタをあなたが本当に望むタイプに強制します。 –

答えて

1

read_fileは常にabcパラメータのint配列で呼び出された場合、あなたはそれでintポインタと仕事にそれを単にコピーすることができます。ある型から別の型に変更するとき

int *p = abc; 

ほとんどの場合、あなたはしかしvoid *が自由に安全にキャストせずに、または任意の非関数ポインタからキャストすることができる、キャストする必要があります。

0

フードの下には、すべてのポインタが同じで、メモリアドレスを表す整数です。だから、あなたはそれをあらゆる方法でキャストすることができます。ただ、行く:

int *p = (int *)abc; 

出来上がり - あなたはすでに対処する方法を知っているあなたのint *を持っています。これは "キャスティング"なものです。あなたの表現の前にカッコで希望のタイプを書き込んでキャストします。それは同じビットを取って、別の方法でそれらを再解釈するでしょう。

実際には、Cは盲目的に同じビットを使用するのではなく、データを変換するほどスマートです。例えば:それはこの場合には切り捨てているため、この場合には

float f = 3.75; 
int i = (int)f; 

i3が含まれています。 intfloatとは異なる形でメモリに格納されているため、実際の変換がここで行われます。

それ以外の場合にはそれがあるため、それが作るどのようにほとんど意味の、すべてでキャストするあなたを禁止します:

char *c = "Hello, world!"; 
float f = (float)c; 

しかし、かなり頻繁にあなたがそれを離れて得ることができます。特にポインターでは、すべてが公正なゲームです。さて、大いなる力が大きな責任で来て、あなたに気をつけてください。 ですが、その結果が賢明であり、それを使用してもプログラムがクラッシュすることはありません。注意してください。

関連する問題