ポインタと間接演算子について


下記のコードで、char str[100] = "Hello";ではなく char *str =
"Hello";で成立するのがなぜか分かりません。ポインタにはアドレスしかいれられないと理解しているのですが違いますか？

また、これは"Hello"が先に配列（文字列）としてコンピュータ側に認識され、その文字列の先頭アドレスを指しているからポインタにアドレスが入り、char
*str = "Hello";が成立しているのでしょうか？

[code]

    #include <stdio.h>
    
    int main(void) {
        char *str = "Hello";
    
        printf("%s\n", str);
    
        return 0;
    }
    
[/code]




『これは"Hello"が先に配列（文字列）としてコンピュータ側に認識され、その文字列の先頭アドレスを指しているからポインタにアドレスが入り、char
*str = "Hello";が成立している』という理解で良いと思います。

問題のプログラムがコンパイルされる時、 "Hello"が文字列(文字定数)だとコンパイラが認識します。

オブジェクトコード（C言語のプログラムがコンパイルされたもの）がロードされる時、定数"Hello"と、文字列へのポインタである変数Strを保存する領域がメモリ上確保され、初期化("Hello"のところには、"Hello\0"という6バイトの文字列がオブジェクトコードからコピーされ、strのところはNull(どこも指していないポインタ）に設定）されます。

そして、*str = "Hello"; に該当する部分が実行されると、strのところに"Hello"のアドレス("Hello"へのポインタ）が入れられます。

