初心者です。
非常に基本的な質問かもしれませんが、
ご回答いただけたらうれしいです。
void test1(unsigned char* data)
{
}
void test2(unsigned char** data)
{
}
int main(void)
{
unsigned char data1[6];
unsigned char data2[6][6];
test1(data1);
test2(data2);
}
としてtest1はうまくいくのに、
test2はコンパイルエラーになります。
どっちもポインタになると思うのですが…。
また、unsigned char data2[6][6]を
他の関数の引数とする場合は
どうすればよろしいのでしょうか?
宜しくお願いいたします。
No.2ベストアンサー
- 回答日時:
ポインタ参照と配列参照を混同しているから、エラーの原因が理解出来ないのだと思います。
test1(data1);
と書いた場合、これは、
test1(&data1[0]);
と書いているのと同じです。同様に
test2(data2);
と書くと
test2(&data2[0][0]);
と同じです。
「&data2[0][0]」は「unsigned charへのポインタ(unsigned char *)」ですから、関数の宣言部の「unsigned char **」と一致せず、エラーになります。
なお、関数test2の引数「unsigned char **data」は、unsigned charのポインタへのポインタですので、unsigned charの2次元配列であるdata2は受け取れません。
unsigned charの2次元配列であるdata2を引数に渡す場合は、受け取り関数の引数をunsigned char *にして、関数内で配列要素にアクセスする場合は、自分で要素番号を計算する必要があります。
void test2(unsigned char *data)
{
unsigned char c;
c = data[3 * 6 + 1]; /* data2[3][1]にアクセス */
}
void main(void)
{
unsigned char data2[6][6];
test2(data2);
}
1次元配列だろうが2次元配列だろうが3次元配列だろうが、次元数が幾つであっても、配列名のみを書いた時は、「配列要素へのポインタ」つまり「<データ型> *」になると言う事を忘れないで下さい。
No.3
- 回答日時:
#2です。
補足です。
最近のCでは#1の回答の書き方も可ですが「古典的なCコンパイラ」では、この書き方を許さない場合があります。なので、#2の回答では「処理系に依存しない、殆どすべてのCコンパイラで許されている書き方」にしています。
まあ、たいていのCコンパイラで#1の回答の書き方で大丈夫だと思いますが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
構造体のextern方法
-
C言語の2次元配列 容量が大き...
-
C言語を使って、ファイルの読み...
-
bmpやImageの配列を関数の引数...
-
C#で構造体の配列を持った構造...
-
[C++/CLI]マネージコードで配列...
-
C言語において、 配列要素をひ...
-
MFCのCArrayを使った二次元配列
-
AfxBeginThread の引数について
-
C#で配列が空かを判定するには?
-
プログラム 数列の和
-
万年カレンダーについて。
-
C言語についてです 5人のテスト...
-
100個の要素を持つ1次元配列に1...
-
ポインタを使って構造体の配列...
-
配列のNULL初期化について
-
C言語の配列のコピーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
構造体のextern方法
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
コンボボックスでデフォルト値...
-
2番目の最大値を求める
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
MFCのCArrayを使った二次元配列
-
C言語の課題が出たのですが自力...
-
C言語 ファイルの指定された行...
-
Cのエラー
-
ポインタを使って構造体の配列...
-
配列のアドレス部
-
char型配列をint型に代入するには
-
MFC - ダイアログボックスのPic...
-
C言語から質問です。
おすすめ情報