アプリ版:「スタンプのみでお礼する」機能のリリースについて

コマンドライン引数で文字列を一つだけ与え、一文字ずつ表示させる関数です。
なぜ、ポインタであるargv[1]を引数として、配列を受け取るはずのtestに与えてもエラーが出ないのでしょうか?
感覚的には型が違うというエラーが出そうなのですが、、、
よろしくお願いします。

「c言語 配列とポインタについて」の質問画像

質問者からの補足コメント

  • 私も初めは配列は受け取れないということで*strとして引数を設定いていたのですが、main関数内のtest(num,argv[1]);の部分で警告文が出てしまってうまくいきませんでした。
    ここで関数testの引数をchar strとするのとchar *strにするのではどのような違いが生じるのでしょうか?
    (以下先述した警告文)
    incompatible pointer types passing 'char *' to parameter of type 'char **'; take the address with & [-Wincompatible-pointer-types]

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/02/09 23:31

A 回答 (3件)

C言語では、いくつかの例外を除くと、T型の配列=T型のポインタとして扱われます。


p[i] と *(p+i) は同じです。
関数宣言での引数にchar str[] と書いても、 char *str と書いたのと同じです。
int main(int argc,char *argv[]) は int main(int argc,char **argv) の別表記です。
※ このようなものを糖衣構文(syntax suger)と言います
https://ja.wikipedia.org/wiki/%E7%B3%96%E8%A1%A3 …

> 配列は受け取れないということで*strとして引数を設定いていたのですが

void test(int num,char * str[])
としたのでは?
これだと
void test(int num,char ** str)
の意味になります。
argv[1] は char * なので、 char ** とは違います。

C言語の配列とポインタの関係はちょっとややこしいところがあります。
しっかり学習しましょう。




あと、写真を貼るのもいいですが、ソースコードをコピペしていただけると、回答者側でも動作確認がしやすくなります。
書き写し間違いといったミスも防げます。
ご検討ください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
納得できました。
また、質問方法へのアドバイスもありがとうございます。
配慮が足りていませんでした、、。
今後はソースコードを直接書き込むようにいたします。

お礼日時:2023/02/10 09:44

既に回答はあるけど, ちょっと指摘しておこう.



「関数testの引数をchar strとするのとchar *strにするのではどのような違いが生じるのでしょうか?」と書いているけど, その画像の場合関数 test の (第2) 引数は char str じゃなくて char str[] だ. 「配列」を意味する「[]」を無視しちゃいけないぞ.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
[]の有無を軽視していました。気をつけます。

お礼日時:2023/02/10 09:46

C において「『配列』を受け取る関数」は宣言できないし, そもそも「関数に『配列』を渡す」こともできない.



その test という関数は, ポインタを受け取っているのだ.
この回答への補足あり
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
配列とポインタの理解が甘かったです。
配列を直接、受渡できないことをエラーに対処している間に忘れてしまうことがあるので気をつけます!

お礼日時:2023/02/10 09:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!