#include <stdio.h>
void init_val(double *a, int n);
int main(void)
{
double x[6];
int i, n;
n = sizeof(x) / sizeof(x[0]); /* 配列の要素を求める */
init_val(x, n); /* 配列の初期化 */
printf("配列の要素数は%dです。",n);
printf("各配列の要素の中身は次の通りです。\n");
for( i = 0 ; i < n ; i++)
{
printf("x[%d]=%f\n", i, x[i]);
}
return 0;
}
void init_val(double *a, int n)
{
int i;
for( i = 0 ; i < n ; i++ )
{
a[i] = i * 0.123;
}
}
---------------------------------------------------------------------------------------------
配列の要素数は6です。各配列の要素の中身は次の通りです。
x[0]=0.000000
x[1]=0.123000
x[2]=0.246000
x[3]=0.369000
x[4]=0.492000
x[5]=0.615000
このプログラムの
n = sizeof(x) / sizeof(x[0]); /* 配列の要素を求める */
この部分が分かりません、
sizeof(x) は48
sizeof(x[0]) は8でした。
48を8で割って6という要素数を求めているわけですが、
このように設定してわざわざ、要素数を求める意味はあるのでしょうか?
No.4ベストアンサー
- 回答日時:
配列の要素数を求める機能が C 言語に存在しない為です。
言語設計の時点では、要素数は固定長で指定するものなので、
要素数を求める機能など無駄だと思われていたのかもしれません。
ただそれでは不便なので...
処理系によっては、要素数を求めるマクロ関数が独自に用意されています。
https://msdn.microsoft.com/ja-jp/library/ms17577 …
C++ 言語ならば、
配列を array クラスで置き換れば、メンバー関数で一発です。
http://www.cplusplus.com/reference/array/array/s …
No.6
- 回答日時:
double x[6]と要素数は6つと定義しているわけですから、
n = sizeof(x) / sizeof(x[0]);
と、書かなくても n = 6 と書けばすむことです。
ただ、保守性の問題から、定数を直接至る所へ記述するのは良くないことです。
(要素数を変更する必要ができたときに修正箇所が少ない方がいいですよね)
#define ですますこともできますが、#define をかかなければなりません。
その点、定数(この場合6)を書いておくのではなく、sizeof(x) / sizeof(x[0]) にしておけば、要素数の定義(この場合 double x[6])を変更するのみでよくなります。
No.5
- 回答日時:
しいて言えば
sizeof(x) / sizeof(x[0]) は (x が配列なら) 必ず x の要素数を与える
くらいかな.
あと一応突っ込んでおくと sizeof は関数じゃないからね.
No.3
- 回答日時:
> このように設定してわざわざ、要素数を求める意味はあるのでしょうか?
無いと言えば無いですよね(笑)。
例えば次のようにして書いたらわざわざsizeof使わなくても済みますし。
#include <stdio.h>
#define N 6 /* こういう風にしちゃう */
void init_val(double *a, int n);
int main(void)
{
double x[N];
int i;
init_val(x, N); /* 配列の初期化 */
printf("配列の要素数は%dです。", N);
printf("各配列の要素の中身は次の通りです。\n");
for( i = 0 ; i < N ; i++)
{
printf("x[%d]=%f\n", i, x[i]);
}
return 0;
}
void init_val(double *a, int n)
{
int i;
for( i = 0 ; i < n ; i++ )
{
a[i] = i * 0.123;
}
}
つまり「こういう動作をさせたい」って動作結果だけを考えた場合、このコードでは必ずしもsizeofは必要ないです。
ただ、練習問題っつーか例示ですしねぇ・・・。必然じゃないにしても「sizeof」の動作を教える為には・・・と言うあくまで「例示」じゃないでしょうか。
No.1
- 回答日時:
もし、そのようにしない場合は、要素数が6なので、
以降は、
n=6; の行を追加するか
for( i = 0 ; i < n ; i++) のところを
for( i = 0 ; i < 6 ; i++) のように書き直す必要があります。
その前提で、
もし、要素数を10にした場合は、
double x[10];のほかに
for( i = 0 ; i < 10 ; i++) のように書き直す必要があります。
つまり、n = sizeof(x) / sizeof(x[0]); /* 配列の要素を求める */
を行っていれば、変更は1っ箇所で済みます。
これは、個人だけでソースを管理している場合は、ありがたみが感じられませんが、
会社で開発する場合のように、複数の人が、同じソースをメンテナンスする場合は、
非常に有効な方法になります。
この方法をとらないで、
要素数を10にした場合、
double x[6];
for( i = 0 ; i < 6 ; i++)
の2か所を変える必要がありますが、もし、for( i = 0 ; i < 6 ; i++) の場所が
非常に離れていた場合、ここの修正を見落とす可能性があります。
それに対して、n = sizeof(x) / sizeof(x[0]); /* 配列の要素を求める */
のようにしていれば、変更箇所は1か所だけなので、だれがメンテナンスしても
バグを誘発する危険がありません。
同じ思想で、6の代わりに
#define YOSO_SU (6)
と定義し、
double x[YOSO_SU];
for( i = 0 ; i < YOSO_SU; i++)
のようにコーディングをする方法もあります。
これも変更箇所を1か所だけにするという意味では、非常によくつかわれてます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで配列の計算
-
VB.net 引数で配列変数を渡す際...
-
EXCEL VBA で、0から?1から?
-
変数を動的に作るには?
-
パソコンキーボードで時分秒を...
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
C言語 重複しない4ケタの乱数...
-
配列の要素数を超えた参照のコ...
-
IF関数でEmpty値を設定する方法。
-
10進数を4桁のバイト配列に格納...
-
遅延バインディングを使用でき...
-
C# 多次元配列の要素数の変更
-
ジャグ配列とは
-
C# での文字列パディング
-
空き番号探し
-
応用情報技術者試験の令和元年...
-
VBでbyte配列型のインスタンス...
-
グループ分け
-
c# 他プロセス起動 リダイレク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
応用情報技術者試験の令和元年...
-
IF関数でEmpty値を設定する方法。
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
EXCEL VBA で、0から?1から?
-
動的配列が存在(要素が有る)か...
-
変数を動的に作るには?
-
C言語 重複しない4ケタの乱数...
-
VBで作った乱数を一度も重複さ...
-
VB.net 引数で配列変数を渡す際...
-
配列の要素数を超えた参照のコ...
-
C#の質問
-
複数のテキストボックスに同じ...
-
VBでbyte配列型のインスタンス...
-
For文と配列
-
遅延バインディングを使用でき...
-
【MFC】GetCount()とGetSize()...
-
配列プロパティをREDIMする方法...
-
Excel VBAで配列の途中から(X)M...
-
五目並べのプログラムを配列と...
おすすめ情報