• ベストアンサー

配列が0から確保される理由

配列を確保すると int a[3]; とするとa[0]から確保されます。 なぜだが忘れてしまいました。 誰か教えてください。 すいません。

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

  • ベストアンサー
  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

それはあるメモリアドレスから(3*sizeof(int))バイト確保するということなので、最初のインデックスを1とすると、n番目の要素にアクセスするのに、(あるアドレス+(n-1)*sizeof(int))を計算せねばならず、面倒だからです。 通常、最初のインデックスが1であることよりも、0であるこのとほうがうれしい場合が多いです。 最初のインデックスを1としてやったほうがいい場合は、アルゴリズム的にミスしている可能性が高いです。

mojiraa
質問者

お礼

非常に参考になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

配列確保の仕様は言語によって異なります。nを指定した場合 (1)1~nを確保・・Fortran、PL/Iなど (2)0~nを確保・・BASIC (3)0~n-1を確保・・C言語 C言語は、OSであるUNIXを記述するために作られた言語です。そのため高級言語の顔とアセンブラーの顔をあわせ持っています。 アセンブラー(というより機械語)では0相対アドレスが標準です。このためC言語では配列が0から取られるようになっています。 一方、アプリケーションユースでは、整数添え字が多いため、C以外のほとんどの言語では1相対が採用されています。 余談ですが、私は、BASICの仕様が一番好きです。

mojiraa
質問者

お礼

非常に参考になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

言語の仕様と言ってしまえばそれまでですが、例えば int *a; という定義がされていた場合、a[1]と*(a+1)は同じものを意味します。 同様に、以下の式は全て同じものを意味します。 a[0] *(a+0) *a これらを同じにするためには、ゼロから始めておくのが分かりやすい ということではないでしょうか。

mojiraa
質問者

お礼

非常に参考になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 2次元配列の動的確保&配列の添え字の書式について

    (1)2次元配列の動的確保について 1次元配列の動的確保は理解できたのですが、次のプログラムの 文(ⅰ)~(ⅱ)の意味を理解できていないので教えてください。 int **a, j, k, nrows=3, ncolumns=4 ; a = (int **)malloc(nrows * sizeof(int *)); a[0] = (int *)malloc(nrows * ncolumns * sizeof(int)); …(ⅰ) //先頭アドレスに… for(j = 1; j < nrows; j++) a[j] = a[0] + j * ncolumns; …(ⅱ)   //この行が特にわかりません。 (2)配列の添え字について この書き方はどういう意味になりますか? out[X_SIZE * (i) + (j)] 分かる方、回答お願いします。

  • 動的配列確保

    JAVA初心者です。 VBでのRedim Preserve、CのreallocみたいなものはJAVAには無いのでしょうか? 要はあらかじめ配列数がわかっていない時に動的配列確保を行いたいのです。 Objectではなく、基本クラスのint、byte等の配列に使いたいと思っております。 ArrayListが近い事が出来そうだったのですが、Objectにしか使用出来ないので、 断念しました。教えてください。

    • ベストアンサー
    • Java
  • 配列の確保の仕方

    C言語でプログラムを記述していますが、 確保している配列が多すぎるためか、 access vilation at ・・・ などのエラーが出ます。 <プログラム> #define A 1000 #define B 10000 をグローバルで宣言して、各関数内でこれを用いて宣言しています。 int data[A][B]; double root[A][B];   ・   ・   ・ int score[A][A][B]; などを初めにたくさん宣言しています。 聞くところによると、動的に確保すればいい、とも聞いたんですが、あまり意味がわかりません。 上のエラーメッセージが出ないようにするにはどうすればいいのでしょうか? この説明だけでお分かりいただけないなら、言っていただければ詳しく言います。

  • ポインタ配列の動的確保

    ポインタの配列の動的確保について教えてください。 入力した数値をポインタ配列に入れるプログラムです。 下記のように書いてみました。(見づらくてごめんなさい) #include<stdio.h> #include<stdlib.h> #define kensu 3 main() { char abc[kensu+1]={'A','B','C','\0'}; char *ptr[kensu]; int i; printf("3つの整数を入力して下さい。\n"); for(i=0;i<kensu;i++){ ptr[i]=(char*)malloc(sizeof(char)*10); if(ptr[i]==NULL){ printf("メモリの取得に失敗しました"); exit(1); } printf("整数%c:",abc[i]); fgets(ptr[i],10,stdin); if(ptr[i][strlen(ptr[i])-1]=='\n') ptr[i][strlen(ptr[i])-1]='\0'; } for(i=0;i<kensu;i++) free(ptr[i]); } ちゃんと動いているようです。 しかし、ポインタ配列の動的確保をネットで調べてみると、ポインタのポインタ(?)を使って、下記のように2度mallocしています。 #include <stdio.h> #include <stdlib.h> #define N 3 int main(void) { char** arr; int i,j; arr = (char**)malloc(N * sizeof(char*)); /* ポインタ配列を確保 */ /* 配列の要素それぞれにつき、メモリ領域を確保 */ for(i=0;i<N;i++) arr[i] = (char*)malloc(N * sizeof(char));   ・・・ ポインタの配列を宣言して、配列の各要素に動的確保するのと ポインタのポインタを宣言し、ポインタ配列を動的確保して、再度配列の要素に動的確保するのとでは、何か違いがあるのでしょうか? ポインタのポインタを宣言し、ポインタ配列を確保する必要性が良く分かっていないのです。 ネット等で調べて見たのですが、理解力がないのかよく分かりませんでした。 どうか教えてください。

  • 動的に確保した配列のファイルへの書き出し

    動的に確保した配列を、ファイルに書きだそうとしています。 int i, arraysize = 10; int **array; array = new int*[ arraysize ]; for (i = 0 ; i < arraysize ; i++) array[ i ] = new int [ arraysize ]; ofstream out("filename", ios::out | ios::binary); out.write((char *) array, sizeof( array )); これでは array のポインタが書き込まれるだけ、なのかな ? ということで、配列を書き込む目的を果たせておりません。このように動的に確保した多次元配列 (要素数は既知) をファイルに書き込むためにはどうすればよろしいでしょうか。

  • 2次元配列の動的確保について、アドバイス下さい

    今、大容量の2次元配列を造りたいので、 メモリの動的確保の勉強をしてました。 昔は、サイズ分mallocで確保して、配列の各行の先頭アドレスを それぞれ対応させていって、行列としてポインタを扱えるようにしてたのですが、 調べていると、もっと簡単に2次元配列のメモリを確保できるみたいなので、その方法を調べていました。 その中で、 if(!(ptr = (int (*)[RETSU])calloc(GYOU*RETSU, sizeof(int)))) こういう例題を見つけたんですけど、 これの、(*)[RETSU])のところが、理解できません。 これは何をしているのでしょうか? どういう言葉で検索すれば、説明が出てくるのか解らなかったので質問させて頂きました。 この(*)[RETSU]の感じの書き方をすると、結構簡単にメモリ確保できるみたいなので、解説、または説明サイトなど教えて頂けると助かります。 または、例題を書いていただけるとスゴク助かります。 ちなみに私が造りたいのは、 100行300000列 ほどの配列です。 是非、よろしくお願いします。

  • Visual C++で配列を動的に確保したい

    int n; cin >> n; int array[n]; のような配列の確保がしたいです。Visual C++出ない環境ではできるのですが、VC++ではできないようです。VC++でできますか?

  • 配列について

    int a[100][100][100] と定義した場合にエラーが出るのですが100を変えずに配列を確保するにはどうしたらいいでしょうか?

  • 大きさが領域未定の画像の配列を確保するとき

    すいませんが、 画像の大きさ未定の配列を確保するとき、 どのようにしたらいいのでしょうか? 今までは想定されるMaxを取っていましたが 今度出来るだけその時にあった配列を取るようにしようと思ったのですがどのようにしたらいいのでしょうか? RGB値を分けてint型3つでも配列はこだわりません。 動的に配列が取れればいいのですが、定数が必要ですと出てきます。 よろしくお願いいたします。

  • 多次元配列の動的メモリ

    1次の配列aの動的メモリは例えば 「double *a;  int num = 3; //配列の数  a = new double [3];」 などとすれば確保できることは分かるのですが、 二次元配列など、多次元配列の動的メモリは どのようにすれば確保できるのですか?