
配列中の最大値を発見するプログラムとして,
下記のようなプロブラムが参考書にのっていましたが,よくわからない箇所があり,質問させてください。
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
最早開始時間と最遅完了時刻を...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
C言語での引数の省略方法
-
systemの戻り値を取得する方法
-
剰余演算を論理演算と加減算に...
-
「指定されたキャストは有効で...
-
【C++】関数ポインタの使い方
-
VB.NET DLL 参照型String読込み
-
C言語の課題です
-
system関数がうまくいかない
-
構造体のすべての変数を文字列...
-
実数の整数部,小数部の取得
-
「{ } で囲むだけ」は正しい?
-
signal関数の使い方
-
反復処理
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
C言語に関する質問です フィボ...
-
異なる文字列のマッチングを、D...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
return 1L
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
式は定数値が必要です」という...
-
数字列を3桁ごとにカンマで区切...
-
実数の整数部,小数部の取得
-
C言語でDxlibを使って3x3の奇数...
-
プログラムについて(UNIX)
-
acceptをalarmでタイムアウトさ...
-
C言語の課題です
-
エラー 添字が付けられた値が、...
-
CStringの配列要素を関数で受け...
-
最早開始時間と最遅完了時刻を...
-
入力された数字を大きい順に並...
おすすめ情報