JavaでC言語のポインタ演算風な使い方は

このQ&Aのポイント
  • Javaにはポインタは存在せず、ポインタに対する演算はありません。
  • Javaでは、C言語のようなポインタ演算を行うことはできません。
  • Javaでポインタ演算と同様の処理を行いたい場合は、別の方法を探す必要があります。
回答を見る
  • ベストアンサー

JavaでC言語のポインタ演算風な使い方は

Java初心者です。ずっとC言語をやっていました。 Javaにはポインタは存在せず(実際は参照渡しなのでポインタその ものなのですが)、ポインタに対する演算はありませんよね。 C言語で、 int buf[2*10]; int *dst = buf; for(i=0;i<10;i++){ dst[0]=a; dst[1]=b; dst += 2; } のようなソースをJavaで書こうとすると、 for(i=0;i<10;i++){ buf[i*2+0]=a; buf[i*2+1]=b; } しか思いつきません。 コンパイルして最適化されれば問題ないと思いますが、 なんか配列中の演算が演算量をとりそうで、気になっています。 もっと高速に処理されるような書き方はないものでしょうか? アドバイスよろしくお願いします。

noname#99417
noname#99417
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ループ中の i*2 が共通なので for (i = 0, j = 0; i < 10; i++, j+=2) { buf[j] = a; buf[j+1] = b; } と書いたらもうちょっとは速くなるかもね, くらいか?

noname#99417
質問者

お礼

確かに、それぐらいしてあげれば、コンパイラで 最適化されそうですね。

関連するQ&A

  • C言語のポインタについて教えてください。

    C言語のポインタについて教えてください。 ・pointer1.c  int main(){   int a;   int *p;   p = &a;     a = 123;   printf("%d", *p);   return 0;  } ・pointer2.c   int main(){ int a[100]; int *p; p = &a[0]; int i; for(i = 0; i < 100; i++) a[i] = i; for(i = 0; i < 100; i++) printf("%d", *p++); return 0; } と二つのソースコードがあるとき、pointer2.cの「p = &a[0]」をpointer1.cのように「p = &a」と書けないのはなぜですか?  また、「&a」は動かすことのできなく、「aを指し示す*p」は動かすことができる変数のようなもの、という認識に誤りはないでしょうか?  宜しくお願いします。

  • C言語のポインターに関する警告

    line[100]で 「1」が格納されていたら「a」 「2」が格納されていたら「b」 「3」が格納されていたら「c」 とout[100]に代入する関数を作りたいのですが コンパイルすると関数の部分で warning: assignment makes integer from pointer without a cast という警告がでます。 ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。 どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。 解決法をおしえてください。お願いします。 /*宣言*/ int=i; /*main関数内のfor文で使用*/ char line[100], out[100]; void change(int); /*関数*/ void change(int i)   {    if(line[i]=='1'){     out[10]="a\0"    }if(line[i]=='2'){     out[10]="b\0";    }if(line[i]=='3'){     out[10]="c\0" } }

  • C言語からjavaを呼び出したい

    C言語からjavaを呼び出したいのでjniを使うことにしました。 各言語のソースはWebで見つけたサンプルを見ながら何とか作成し、各々コンパイルまで終わったのですが、javaのオブジェクト(?)をどこに置いたら良いのかさっぱりわかりません。 java使いの人達には常識の話だと思いますがjavaはサーブレットしか作ったことが無くどうしたものかと困っています。 分からないのは次の2点です。 1.classファイルのままでも良いのかjarにしないといけないのか? 2.どこに設置したら良いのか? これまでやったこと 1.javaのソースを作成しコンパイルしました(classファイルのままです) 2./etc/profileに次のコマンドを追加しました。 LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/java/jdk1.7.0_03/jre/lib/amd64/server export LD_LIBRARY_PATH 3.C言語のソースを次のコマンドでコンパイルしました。 % gcc -I/usr/java/jdk1.7.0_03/include/ -I/usr/java/jdk1.7.0_03/include/linux -L/usr/java/jdk1.7.0_03/jre/lib/amd64/server -ljvm -lpthread jnitest.c -o jnitest 4.javaモジュールの設置←これがわかりません 初歩的な質問で申し訳ありませんがご教示下さい。

    • ベストアンサー
    • Java
  • CでいうポインタみたいなことをJAVAでも・・・

    Cでいうポインタを使ったプログラム #include <stdio.h> void nibai (int *a , int *b) {   *a *= 2;   *b *= 2; } int main(void) {   int a=3 , b=5;   nibai(&a,&b);   printf("a=%d b=%d\n",a,b);   return 0; } nibai関数はint型のアドレスを貰ってそのアドレスが指す値を書き換えているためmain関数に戻った際に値が変化している。 このようなことをJAVAでやりたいんですけど方法が見当たりません。 グローバルで共有するしか方法はないのでしょうか? CかつJAVAを知っている方限定の質問になってしまいますが よろしくお願いします。

    • ベストアンサー
    • Java
  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • c言語で配列を返したい

    自分がc言語で書いているプログラムの関数で次のようなものがあるのですが、 int CTR(int data[], int* key, long long t){ int buf[sizeof(data)]; int tmp[16]; int bytesoft[128]; int i,j; KeyExpansion(key); for(i=0;i<sizeof(data);i+=16){ for(j=0;j<16;j++){ if(j<sizeof(bytesoft)) tmp[16-j-1]=bytesoft[sizeof(bytesoft)-j-1]; else tmp[16-j-1]=0; } Cipher(data); for(j=0;j<16;j++){ buf[i+j] ^= data[i+j]; } t=t+1; } return buf; } 配列bufを返すためには、ポインタを用いればいいということは調べて分かったのですが具体的にどのように書き換えればいいかよくわかりません。 どなたかご教授いただけないでしょうか?

  • C言語です。コレを使ってなにかプログラミングを組んでください

    C言語です。コレを使ってなにかプログラミングを組んでください よろしくお願いします 何でも構いません #include<stdio.h> void str_copy( char dst[], char src[] ) { int i; for (i =0; src[i] != '\0'; i++) { dst[i] = src[i]; } dst[i]= '\0'; }

  • C言語からJavaに書き換えの質問です。

    C言語で書かれた短いプログラムを、Javaならどう書くかということを考えることになり、かなりの時間を費やして、ググったりして、なんとかそれらしい形になったのですが、1か所だけエラーになり、途方にくれております。助言・こうすればよい的なこと、気付いたこと、などどんなことでもかまいませんので(趣旨のずれたものは、残念ながら相手にできません)ご教授願います。お願いいたします。 詳しくは後述します。 Cのプログラムと、Javaのプログラムと、エラーログを載せます。 Cのプログラムーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー bootpack.c void main(void) { int i; char *p; for (i = 0xa0000; i <= 0xaffff; i++) { (int)p = i; *p = i & 0x0f; } } Javaで書いたプログラムーーーーーーーーーーーーーーーーーーーーーーー bootpack.java public class bootpack { public static void main() { int i; String p; for (i = 0xa0000; i <= 0xaffff; i++) { (int)p=i; p = i & 0x0f; } } } エラーログーーーーーーーーーーーーーーーーーーーーーーーーー C:\tolset\java>make run C:\tolset\java>..\z_tools\make.exe run ../z_tools/make.exe -r img make.exe[1]: Entering directory `C:/tolset/java' ../z_tools/make.exe -r haribote.img make.exe[2]: Entering directory `C:/tolset/java' ../z_tools/gcj/bin/gcj.exe -c -Os -o bootpack.obj bootpack.java bootpack.java:9: error: Invalid expression statement. (int)p = i; ^ 1 error make.exe[2]: *** [bootpack.obj] Error 1 make.exe[2]: Leaving directory `C:/tolset/java' make.exe[1]: *** [img] Error 2 make.exe[1]: Leaving directory `C:/tolset/java' ..\z_tools\make.exe: *** [run] Error 2 C:\tolset\java> ここまでーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー エラーログを見れば、一目瞭然に、(int)p=i; がおかしいことはわかるのですが、何がおかしいのか散々修正してみたのですがわかりませんでした。調べられるものはほとんど調べたのですが、おかしい点に、気付かれましたら、ご教授願えれば幸いです。 あと補足ですが、CのプログラムをJavaのプログラムにしようとすること自体がおかしい。とかの質問自体を完全否定するようなことを言われた場合も無視しますがご理解ください。 よろしくおねがいいたします。

    • ベストアンサー
    • Java
  • C言語のポインタの考え方について

    ポインタについて理解ができていないのでお聞きしたいのですが 値を交換する関数のプログラミングでこの場合ポインタ で以下にしないといけないと思います。 #include<stdio.h> void swap(int *a int *b){ int c; c=*a; *a=*b; *b=c; } main(){ int x,y; x=123; y=456; swap(&x,&y); printf("x = %d, y = %d\n", x, y); } またポインタを使用せず以下のプログラムではなぜダメのでしょうか。 よろしくお願い致します。 #include<stdio.h> void swap(int a int b){ int c; c=a; a=b; b=c; } main(){ int x,y; x=123; y=456; swap(x,y); printf("x = %d, y = %d\n", x, y); }

  • ポインタ

    C言語のポインタの勉強をしています。//エラー と書いている行でエラーがでます。*(a++),*(b++),*(c++)をそれぞれ*(a+i),*(b+i),*(c+i)とすればエラーがなくなるのですが、違いがわかりません。 先頭アドレスをセットしてないからエラーが出たのかと思いましたが、それが原因なら*(a+i),*(b+i),*(c+i)でエラーがなくなるのはどうしてでしょうか? 違いを教えて下さい。よろしくお願いします。 #include<stdio.h> int main(void) { void p_add(int *a, int *b, int *n); int i; int a[10] = {3,7,1,2,8,9,0,4,6,5}; int b[10] = {7,3,9,8,2,1,10,6,4,5}; int c[10]; memset(c,0x00,sizeof(c)); p_add(a, b, c); for(i = 0; i < 10; i++){ printf("a[%d]=%d b[%d]=%d c[%d]=%d\n", i, *(a++), i, *(b++), i, *(c+ +));                                               // エラー } return 0; } void p_add(int *a, int *b, int *n){ int i; for(i = 0; i < 10; i++){ *(n++) = *(a++) + *(b++); } }

専門家に質問してみよう