#include <stdio.h> int main(void) { char str[1] = "abcde"; for (char* p = str; *p; ++p) { ++(*p); printf("%s\n", &(*p)); } }
私としてはchar str[1] = "abcde";char型の配列の変数str[0]に文字列のの先頭の文字aが入るためコンパイルエラーになるのではないかと考えています。
どうかわかりやすく教えて下さい。
また、char str = "abcde";も間違いなのはstrが配列ではなく、たまの単純変数を扱っていないためでしょうか?だとしたら、 "abcde";の先頭のaの文字のみを扱うため間違っているのでしょうか?
ちなみに、char str[1] = "abcde";とchar str = "abcde"に初期値のための{ }が付かないのは何故でしょうか?正直、どんな時(ポインタや配列を使う時?)に{ }を使うのかよくわかりません。
また、char *str[] = { "abcde"}; ならコンパイルできる理由はchar型のポインタの配列により、{ }により文字列を初期値にして、文字列の先頭のaのアドレスをstr[0]に入れられるためでしょうか?
初期値を中括弧で囲む必要があるのは次の2つ。 char buff[20] = { 'a', 'b', 'c', '\0' }; char *parr[3] = { "abc", "de", "hello"}; と言われましたが、char型の配列やchar型へのポインタの配列などとありますが、文字や文字列を初期値するために{ }がついているとわかりました。
ただなぜ、 char *ptr; = "hello;はポインタがあるのに文字列が{ }に囲まれていないかわかりません。 どうかわかりやすく教えて下さい。
最後にchar str[] = "abcde";ではなく、 char *str[] = "abcde";とした場合、なぜコンパイルエラーを起こすのでしょうか?
文字列の先頭のaがchar型のポインタstr[0]の配列のメモリにaが入るのではないのでしょう?
どうかコンパイルエラーになる理由をわかりやすく教えて下さい。
最後の質問については char *str[] = {"abcde"};にすると解決するとの事ですが、なぜ{ }をつけると解決するのかわかりません。ポインタ変数strを扱う時は文字や文字列を{ }で囲まなければならないのでしょうか?
どうかよろしくお願いします。
編集
画像のプログラムにおいて質問があります。 "321"[2]では、3は[0]、2は[1]、1は[2] との事ですが、 では、char str[4] = "abc"では、aは[0] ではなく、aは[1]になると言われたのですが、"321"[2]では、3は[0]、2は[1]、1は[2] のやり方に沿うとaは[0]になると思い納得できません。 なぜaは[1]になるのでしょうか?