![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
配列中の最大値を発見するプログラムとして,
下記のようなプロブラムが参考書にのっていましたが,よくわからない箇所があり,質問させてください。
findMaxという関数に渡されているのは,aryの先頭アドレスだと思いますが,
findMax関数内では,pary[]を引数としていますが,これはどういう意味なのでしょうか?
実際にどのような処理が行われているのかよくわかりません。
ポインタ変数?
でもそのあとにはpary[0],pary[1]として使っているしよくわかりません。
教えていただけると嬉しいです。宜しくお願いいたします。
最近Cを学び始めましたが,ポインタがまだなれません…。
============================
#include <stdio.h>
#define DATA_SIZE (12)
int ary[] = {5,7,10,1,25,15,30,10,31,13,22,32};
int findMax(int *, int);
int main(void)
{
int max;
int i;
max = findMax(ary,DATA_SIZE);
printf("Maximum number is %d\n",max);
return(0);
}
int findMax(int pary[],int size){
int max;
int i;
max = pary[0];
for(i = 0; i < size; i++){
if(pary[i] > max){
max = pary[i];
}
}
return(max);
}
No.2ベストアンサー
- 回答日時:
C言語の配列の面白い性質を一つだけ。
char a[10]などあったとき、
a[1]と*(a + 1) は同じで、
*(a + 1)と*(1 + a)は同じで、
*(1 + a)と1[a]は同じです。
int findMax(int *pary,int size)でaryの先頭アドレスがparyに入っているので、
当然、*paryでary[0]の値を得られるのはわかりますよね。
*pary は *(pary + 0)と同じですから、pary[0]と同じです。
ちなみに、pary + 1の指すアドレスはparyの型によって変わります。
paryはint型変数へのポインターなので、実際のアドレスは(void*)(pary) + 1 * sizeof(int)になっています。
printf("%p\n", pary + 1)して確認してみてください。
> ポインタ変数をpary[0],pary[1],pary[2]と使った場合,
> 元の配列ary[0],ary[1],ary[2]全く同じ意味になるのでしょうか?
どちらも配列の同じ要素を参照しています。
なんか回し者みたいでアレですが、ポインターを理解することなくしてC言語は理解できませんから、一度「秘伝C言語問答 ポインタ編」などを読んで網羅的に理解してみてはいかがでしょうか。
回答ありがとうございます。
詳しく説明してくださったのでベストアンサーにさせていただきます。
>*(1 + a)と1[a]は同じです。
こちらの文の意図がわかりませんでした。
1は数字なので,変数のように扱うことはできないのでは?
よくわからないことを言っていたらすいません。
オススメ本までありがとうございます。
Cの勉強はまだ一冊目の基本書をやっている所ですので,
それが終わったら挑戦してみようと思います。
No.1
- 回答日時:
関数における仮引数の宣言は特殊で, 「配列」と宣言したとしても勝手に「ポインタ」と解釈されます. つまり
int findMax(int *, int);
という宣言と
int findMax(int [], int);
という宣言とは全く同じものを意味します. 同様に, 関数定義を
int findMax(int pary[],int size)
ではじめても
int findMax(int *pary,int size)
ではじめても違いはありません.
一方, 配列名を式の中で使うと (例外的な場所を除いて) 「先頭要素へのポインタ」に自動的に変換されます.
回答ありがとうございます。
まだわからない箇所があります,教えて頂ければ嬉しいです。
int findMax(int *pary,int size) でparyにaryの先頭アドレスを代入し,
その後 max = pary[0];を実行していますが,そこがよくわかりません。
ポインタ変数をpary[0],pary[1],pary[2]と使った場合,
元の配列ary[0],ary[1],ary[2]全く同じ意味になるのでしょうか?
ポインタの示す先の値を代入する場合は,
max = *pary[1]のようにするのではないのでしょうか?(コンパイルは通りませんでした。)
お探しの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# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
【C++】関数ポインタの使い方
-
エラー 添字が付けられた値が、...
-
acceptをalarmでタイムアウトさ...
-
比較回数と交換回数表示について
-
ラップ関数とはどんなものですか?
-
商と剰余を同時に求める(C言語)
-
c++でテンプレートのコードでわ...
-
数字列を3桁ごとにカンマで区切...
-
C言語 配列と関数の練習問題
-
read関数をノンブロッキングで...
-
C言語 エラーの原因がわからな...
-
C++でvectorにテキストファイル...
-
C言語の配列をC++のvectorに高...
-
実数の整数部,小数部の取得
-
C言語初心者です、、、お助けく...
-
if と配列の組み合わせ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
へんな現象
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
if と配列の組み合わせ
-
C言語での奇数の和
-
C言語 配列と関数の練習問題
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
C言語
-
実数の整数部,小数部の取得
-
足して100になるような乱数のア...
-
卒業研究でよく分からないとこ...
-
数字列を3桁ごとにカンマで区切...
-
c言語
-
std::set<int> で、ある値が何...
-
比較回数と交換回数表示について
おすすめ情報