- ベストアンサー
int型のポインタ
int型のようなメモリを大量に使用しないものでも、ポインタで変数宣言しているのをよく見かけますが、 なぜでしょうか? 私はCに慣れていないため、int型くらいのサイズだったら、なるべくならポインタを使わないで書いてもらった方が可読性が良いので、ポインタにするメリットがあまり感じられません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
redimと書いてあるのでVisualBasicに慣れているのだと思いますが、 C言語では配列の大きさを後から変更することはできません。 ですので、実行時まで必要なサイズがわからないデータについては、 最初はポインタだけを用意して、そこに後からmallocなりcallocなりreallocなりで 確保した領域のアドレスを入れておくしかないのです。
その他の回答 (4)
- kmee
- ベストアンサー率55% (1857/3366)
> ◆非ポインタ版 > l_arr = a[0]; > ... > show_msg(a[index]); 済みませんが、元と等価なコードでないと、比較する意味が無いのですが。 全然違うコードで「intの方がいい」と言われても、「そのコードにはintがいいですね。で?元のコードはどうなんですか?」ってことになります。 px = x ; /* a[x] の添字をpxとして記憶 */ ... a[px] +=7 ; /* 上で記憶した a[px]へアクセス */ と、ポインタ使わずに書く方法もあるかもしれません。 ただ、この場合は、整数pxがポインタの代りをしているからできることです。 また、元が ポインタ→実体 と1ステップだったものが 配列の先頭→ 添字の分の計算 →実体 とステップが増えます。省メモリのつもりが、コードが増える可能性があります。 (また、実装や最適化によって違ってきますが) 単純すぎてピンと来ないなら、こんな例ではどうでしょうか。 int x,y,z,mode ; int * p ; ... /* 状態によって、次のいずれかになる */ if( mode==3 ) { mode=1; p = & x ; } else if ( mode==4 ) { mode=2; p = & y ; } else { mode=2; p = & z ; } /* x,y,z,mode はここで使用する */ image_out(x,y,z,mode); /* 上で選ばれた変数を +7する */ *p += 7 ; これ、int *pを使わずに、同じ動作をするコードにできますか? そのコードは、これより「わかりやすい」ですか? > redim l_arr[x]; Cに無い命令を使われても、エラーになるだけですけど。
お礼
まちがって補足のところにお礼を書いてしまいました 改めましてありがとうございます
補足
ありがとうございます
- wormhole
- ベストアンサー率28% (1626/5665)
// ◆論点:int型くらいのサイズだったら、 // わかりやすさ > メモリの必要量の節約 ポインタ使うのは、メモリ必要量の節約のためではないと思いますが、どこからそのような話が出てきたんでしょう?
お礼
もっと調べてみます ありがとうございます
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 配列サイズが動的な場合でも、以下のようにした方が私は把握しやすいです。 > > l_arr = a[0]; > ... > x = SQLで取得した結果件数など > redim l_arr[x]; redim ってなんですか? Cにそんなのないんですけど。
お礼
ありがとうございます。 Vbで配列のサイズを変えるときに使います。
- kmee
- ベストアンサー率55% (1857/3366)
具体例があれば、説明しやすいのですが。 ・特定の変数、配列の要素等を別の名前で記憶させる p = &( a[x] ) ; /* a[x] をpとして記憶 */ ... *p +=7 ; /* 上で記憶した a[x]へアクセス */ ・malloc等で動的に確保した領域を記憶される int *p = malloc( length * sizeof(int) ) ; ・関数の引数としてポインタを使用する場合、他言語の「参照渡し」にあたる操作を行う 以下のプログラムの結果がどうなるか、理解していますか? #include <stdio.h> void swapA(int a, int b ) { int t =a ; a= b; b=t ; } void swapB(int * a, int * b ) { int t =*a ; *a= *b; *b=t ; } int main(){ int a=3; int b=5; printf("a:%d, b:%d\n", a,b) ; swapA(a,b); /* またはswapB */ printf("a:%d, b:%d\n", a,b) ; }
お礼
ありがとうございます
補足
//***************************************** // ◆論点:int型くらいのサイズだったら、 // わかりやすさ > メモリの必要量の節約 //***************************************** 上述の例では、 メモリの使用量が大きく変わらないと考えます。 ポインタを使わずに書いたとき、 1個のint のメモリ使用量に対して、約x倍になる認識ですが、 そもそも、intのメモリ量はたかがしれているため、 ポインタで変数宣言すべきではないと考えます。 大きなオブジェクトに対しては、ポインタを使うべきと考えますが、 intのようなメモリ使用量が小さいものは、 わかりやすさ > メモリの必要量の節約 と考えます。 //************************************ // メモリを大量に使用しないため、 // ポインタで変数宣言したくないケース //************************************ ◆ポインタ版 p = &( a[x] ) ; /* a[x] をpとして記憶 */ ... *p +=7 ; /* 上で記憶した a[x]へアクセス */ ◆非ポインタ版 l_arr = a[0]; ... show_msg(a[index]); わかりやすさ > メモリの必要量の節約 のため、後者にすべきと考えます。 //********************* // ◆補足 //********************* 配列サイズが動的な場合でも、以下のようにした方が私は把握しやすいです。 l_arr = a[0]; ... x = SQLで取得した結果件数など redim l_arr[x]; i = 0; show_msg(a[i]); i = i + 7; show_msg(a[i]); の方が断然わかりやすいです。 //******************************* // 大きなサイズのオブジェクト //******************************* ポインタを使うべきです。 メモリを大量に必要とさせたくないためです。
お礼
ありがとうございます。 都度、メモリを確保となるのですねー