

下記のコードで、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]


CC BY-SA 4.0
2020-05-05T06:22:12.480
66309
2020-05-05T11:05:42.573
2020-05-05T06:33:55.163
3060
39983
question
c++ c ポインタ
ポインタと間接演算子について


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

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

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

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


CC BY-SA 4.0
2020-05-05T06:46:44.200
66310
2020-05-05T06:46:44.200
217
66309
answer


`char *str = "Hello";`はポインタ変数`str`を宣言し、その初期値は`"Hello"`が配置された領域のアドレスです。

質問に「間接演算子」とありますが、宣言文で使われる`*`は「間接演算子」ではないと理解しています。「間接演算子」は実行文で使われる演算子でアドレスの前に配置することにより、アドレスが示す領域の中身を示します。

宣言文で使われる`*`をなんと呼ぶのかは知りませんが、後に続く変数、配列がポインタ変数、ポインタ配列であることを意味します。


CC BY-SA 4.0
2020-05-05T07:27:48.473
66314
2020-05-05T07:27:48.473
35558
66309
answer


C言語の仕様上 `"Hello"` は文字列リテラルと呼ばれるもので  
その型は `const char *` と定められています。  
`str` の型は `char *` なのでポインタです。  
つまりポインタからポインタへの代入となります。

この行が実行されるとスタック上に確保されている文字列 `"Hello"` の  
先頭アドレスがstrに代入されることになります。


CC BY-SA 4.0
2020-05-05T11:05:42.573
66326
2020-05-05T11:05:42.573
4388
66309
answer