
林晴比古さんの「新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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
【C++】関数ポインタの使い方
-
C++/Cこういうことは可能でしょ...
-
連想配列に格納されたオブジェ...
-
C言語での引数の省略方法
-
cinの区切り文字の書き方
-
C2601 ローカル関数の定義について
-
return 1L
-
#define _CRT_SECURE_NO_WARNIN...
-
std::set<int> で、ある値が何...
-
C言語をお願いします
-
複数桁10進数の*桁目だけを抽出...
-
C#の質問
-
ラップ関数とはどんなものですか?
-
リストビューに隠しパラメータ
-
アスタリスクで正方形
-
配列v2を逆順にしてv1に格納す...
-
C言語 構造体の並び替え
-
c言語
-
C#の1~Xまでの数値を徐々に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
C言語での奇数の和
-
「{ } で囲むだけ」は正しい?
-
std::set<int> で、ある値が何...
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
int16_t の _t は何?
おすすめ情報