
林晴比古さんの「新C言語入門」でC言語を勉強している初心者です。
現在ポインタの勉強をしています。色々教科書の文例等をポインタで書くとどうなるか試しております。
上書P200練習問題2に「配列の最大値を返す(その際配列の長さを渡す)」プログラムがあり、それをポインタで渡すプログラムに直してみました。
仮引数に「maxdata」を設定し、そのアドレスを関数側に渡し、関数側ではポインタとして受け取る(そうすれば関数側からはreturnで値を返す必要がない)、と考え、下記のように書いてみました。
#include <stdio.h>
void max_of_array(int n[], int len, int *ans);
int main(void)
{
int dt[6] = {50,20,80,30,10,40};
int maxdata;
max_of_array(dt,6,&maxdata);
printf("最大値=%d\n", maxdata);
return 0;
}
void max_of_array(int n[], int len, int *ans)
{
int i;
ans = &n[0];
for (i=1; i<len; i++){
if (*ans < n[i]) *ans = n[i];
}
}
しかしコンパイルすると、何故か「最大値=1」となってしまいます。(正しくは80です)
他にも色々試してみましたがうまくいかず、かなり考えてみたのですがどうしても分かりません。お分かりの方、どうすれば正しくなるのが教えてください、よろしくお願いします。

No.5ベストアンサー
- 回答日時:
>ans = &n[0];
でansの参照先がnの先頭番地に変えられてしまいますので、
>if (*ans < n[i]) *ans = n[i];
によって、最大値の答えはn[0]に入れられてしまいます。
呼び出す方では、d[0]に答えが入ってしまうわけです。
maxdataの値は最初の値(初期化されてないので不定)のままです。多分、たまたま1になっただけだと思います。
ans = &n[0];
を
*ans = n[0];
にすればよいと思います。
主文から関数に引数を渡した時せっかく、ansがmaxdataを参照できるようになっていたのに、
さらにansにまたn[0]のアドレスを入れてしまったせいで、
maxdataへの参照ができなくなって、
n[0]を参照するようになってしまったのですね。
そうなると確かにmaxdataの方は何もない状態に戻ってしまいますよね(*^_^*)
大変よく理解できました!コンパイルもうまくいきました。
丁寧なご回答どうもありがとうございました。
No.3
- 回答日時:
>#1さん
>どちらでもお好きなほうで。
そうではなく、前者は必須。後者はダメ。
後者がダメな理由は、このプログラムではdt[]をソートしている「のではない」から。
No.2
- 回答日時:
ans = &n[0];を*ans = n[0];とするか
printf("最大値=%d\n", maxdata); をprintf("最大値=%d\n", dt[0]);とする。どちらでもお好きなほうで。
なぜそうなるかはポインタを本当に理解するとわかります。しっかり悩んでね。
みんな悩んで大きくなった。
「*ans=n[0]」に修正し、うまくいきました!どうもありがとうございました。
主文から関数に引数を渡した時点で、ansがmaxdataを参照できるようになっていたのを、
わざわざまたさらにn[0]のアドレスをansに投入してしまったことで
ansはn[0]を参照するようになってしまったのですね。
はい。しっかり悩んでポインタをもっとちゃんと理解したいと思います!
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
「{ } で囲むだけ」は正しい?
-
CStringの配列要素を関数で受け...
-
構造体の勉強中です 合計点の高...
-
足して100になるような乱数のア...
-
数字列を3桁ごとにカンマで区切...
-
C言語で分からないところがあり...
-
double型の値を、一桁ずつint型...
-
if と配列の組み合わせ
-
エンキューとデキューの操作関数
-
次のプログラムを教えてくださ...
-
線形補間 2次元テーブル C言語...
-
ファイルに含まれるアルファベ...
-
ファイルから Carray<int,int> ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
(int *)の意味
-
ColorをRGBで指定する方法
-
未解決の外部シンボル _printf...
-
構造体の勉強中です 合計点の高...
-
商と剰余を同時に求める(C言語)
-
C言語で分からないところがあり...
-
式は定数値が必要です」という...
-
C言語での奇数の和
-
std::set<int> で、ある値が何...
-
課題でつまってます・・・
-
int16_t の _t は何?
-
比較回数と交換回数表示について
おすすめ情報