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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>>アドレスを受け取ったのだからアドレスの足し算になったりしないのでしょうか?
文法的には、他の方の回答のとおりです。
気持ち?、感じ方の問題としては、
なんにしても、
アドレスを足し算することはあまりないですよね。
アドレスを受けて、
(a)その中身を処理し、return(戻り値)で値を返す
(b)その中身を処理し、アドレスがあるから、その中身を書き換える
のが普通のケースだと思います。
アドレスを渡すのが合理的なケースは沢山ありますよね。
No.2
- 回答日時:
>>なぜちゃんと数字が足されるのでしょうか?
アドレスを受け取ったのだからアドレスの足し算になったりしないのでしょうか?
貴方が書いたプログラムの命令が、「数字の足し算」をするように書かれているからです。
もし、貴方が「数字の足し算」をやりたいと思っていても、勘違いで「アドレスの足し算」をするように命令を書いていたら、結果はアドレスの足し算になります。
プログラムは書いた人が「○○して、××を得る処理を書いた」と思っていても、コンピュータは、書かれた命令どおりに動作するので、記述を間違えると「□□して、○○を得る処理をする」という結果になって、自分が意図した動作はしません。
No.1
- 回答日時:
data[i]というのはコンパイラで処理される際に*(data + i)となります。
data + iであればそれはポインタ(要するにメモリ上のアドレス)ですが、*(data + i)と*がついていればdata + iが指し示すメモリ領域にあるデータの値を表しています。
以上のことからdata[i]はポインタが指し示している領域にあるデータの値となります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
ExcelVBAでのkernel32(64bit)
-
Run-Time Check Failure #3とい...
-
NULLとブランクの違い
-
関数ポインタの高速化のメリット
-
Cで作成したDLL関数をVBから呼...
-
main(int argc,char **argv[])...
-
LPSTR型の初期化について
-
C言語のポインタに直接アドレス...
-
アプリを32bitから64bit移行
-
ハンドル、アドレス、ポインタ...
-
CWnd::EnableWindow()の扱い方
-
#define NULL ((void *)0) の弊害
-
C言語でのconstを返す関数
-
C言語の関数と配列に関する質問
-
C++で関数ポインタから関数名を...
-
関数ポインタの利点
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
セグメントエラー
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
ExcelVBAでのkernel32(64bit)
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
DLL<->VB間での受け渡し(文字...
-
C言語でのconstを返す関数
-
ポインタについて
-
参照型で受け取った引数をポイ...
-
TCHAR文字列内の検索について
-
デバイスハンドルとは?
-
基本アルゴリズムの『返す』の...
おすすめ情報