どうもこんにちは。
C言語でプログラムを作成しています。
ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか?
標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。
要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。
配列の要素数も引数として一緒に渡す必要がありますか?
[作ってみたサンプル]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// func1 と func2 をまとめられないだろうか。。。
void func1(int (*p)[10])
{
________int n = sizeof(*p) / sizeof((*p)[0]);
________int i;
________for (i = 0; i < n; i++) {
________________printf("%d\n", (*p)[i]);
________}
________printf("\n");
}
void func2(int (*p)[5])
{
________int n = sizeof(*p) / sizeof((*p)[0]);
________int i;
________for (i = 0; i < n; i++) {
________________printf("%d\n", (*p)[i]);
________}
________printf("\n");
}
int main(int argc, char *argv[])
{
________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 };
________int ary2[5] = { 3, 6, 9, 12, 15 };
________func1(&ary1);
________func2(&ary2);
________return 0;
}
No.3
- 回答日時:
与えられる引数の型がある程度決まっているなら配列はvoid*で渡して
switchなどで型を分岐させるというのはどうでしょうか。
(要素数はやはり別途引数で渡す必要があります)
単なる思いつきで実際にやってもいないのでうまくいくかどうかも
分かりませんが(外していたらすみません)。
No.2
- 回答日時:
標準関数で「配列のポインタを渡す」ものってあったっけ?
C においては「何らかの形で『最後』の位置を与える」ことが必須だったはず. 方法としては
・要素数を与える (memcpy など)
・「最後」の要素のあとに「特殊」な値を入れる (str系)
くらいかな.
C++ なら参照と template でなんとでもなるんだけど....
回答ありがとうございます。
確かに要素数を与えるだけでなく、文字列などは特殊な値を終了として扱っていますね。
Java なら渡された配列から要素数を取得することができますが、Cだと難しいようですね。。。
No.1
- 回答日時:
参考にした標準の関数がなにかわからないが、
適当でないものを参考にしてるかも。
> 配列の要素数も引数として一緒に渡す必要がありますか?
要素数を渡すのが一般的だと思います。
#ifndef _countof
#define_countof(a)(sizeof(a)/sizeof((a)[0]))
#endif
void func(int *p, int size)
{
__for (i = 0; i < n; i++) {
____printf("%d\n", *(p+i) );
__}
}
int main(int argc, char *argv[])
{
__int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 };
__int ary2[5] = { 3, 6, 9, 12, 15 };
__func(ary1, _countof(ary1));
__func(ary2, _countof(ary2));
__return 0;
}
回答ありがとうございます。
私も要素数を一緒に渡すのが一般的だと思っています。
要素数を渡さないで、要素数を知ることが可能なのか調べています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
構造体のextern方法
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
std::for_eachに、ループカウン...
-
C言語 ファイルの指定された行...
-
2次元配列のnew
-
c言語
-
C言語の課題が出たのですが自力...
-
配列のアドレス部
-
C言語の配列のコピーについて
-
C#で配列が空かを判定するには?
-
C言語で重複組合せを全列挙
-
MFC - ダイアログボックスのPic...
-
C#で構造体の配列を持った構造...
-
この変数名はわかりにくいですか?
-
c言語 構造体
-
C#でのフィボナッチ数列
-
AfxBeginThread の引数について
-
Cのエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
構造体のextern方法
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語の2次元配列 容量が大き...
-
c言語 構造体
-
C言語 ファイルの指定された行...
-
C言語についてです 5人のテスト...
-
int i, int i[1];
-
fclose()でセグメンテーション違反
-
char型配列をint型に代入するには
-
C言語から質問です。
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
[C++]const int と配列
おすすめ情報