アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語の配列とポインタについて
どこがアドレスでどこから数字になってるかわかりません。
前の質問に補足しようと思いましたが文字数制限があったので新しく質問します。
int getaverage(int data[10]);
int main(void)
{
int average,array[10] = {15,78,98,15,98,85,17,35,42,15}; printf("array[3] = %d\n",array[3]); average = getaverage(array);
printf("array[3] = %d\n",array[3]); printf("%d\n",average);
return 0;
}
int getaverage(int data[10])
{
int i,average = 0;
for (i = 0;i < 10;i++) {
average += data[i];
} data[3] = 111;
return
average / 10;
}

まずgetaverageにdataの一番はじめのアドレスが送られます。
そしてfor文でdata[i]として回されます。

そこで疑問なんですが
なぜちゃんと数字が足されるのでしょうか?

アドレスを受け取ったのだからアドレスの足し算になったりしないのでしょうか?

A 回答 (3件)

>>アドレスを受け取ったのだからアドレスの足し算になったりしないのでしょうか?



文法的には、他の方の回答のとおりです。

気持ち?、感じ方の問題としては、

なんにしても、
アドレスを足し算することはあまりないですよね。
アドレスを受けて、
 (a)その中身を処理し、return(戻り値)で値を返す
 (b)その中身を処理し、アドレスがあるから、その中身を書き換える
のが普通のケースだと思います。
アドレスを渡すのが合理的なケースは沢山ありますよね。
    • good
    • 0

>>なぜちゃんと数字が足されるのでしょうか?


アドレスを受け取ったのだからアドレスの足し算になったりしないのでしょうか?

貴方が書いたプログラムの命令が、「数字の足し算」をするように書かれているからです。
もし、貴方が「数字の足し算」をやりたいと思っていても、勘違いで「アドレスの足し算」をするように命令を書いていたら、結果はアドレスの足し算になります。

プログラムは書いた人が「○○して、××を得る処理を書いた」と思っていても、コンピュータは、書かれた命令どおりに動作するので、記述を間違えると「□□して、○○を得る処理をする」という結果になって、自分が意図した動作はしません。
    • good
    • 1

data[i]というのはコンパイラで処理される際に*(data + i)となります。


data + iであればそれはポインタ(要するにメモリ上のアドレス)ですが、*(data + i)と*がついていればdata + iが指し示すメモリ領域にあるデータの値を表しています。

以上のことからdata[i]はポインタが指し示している領域にあるデータの値となります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!