文字列のコピー
char型 のポインタ変数は以下のような使い方をすることができます。
文字列を使用した記述例
// pointer to a character string program in C.
#include <stdio.h>
int main(int argc, char *args[])
{
char *p = "123";
printf("p=%s\n", p);
p = "456" + 1;
printf("p=%s\n", p);
return 0;
}
実行結果
p=123
p=56
ここではポインタ変数「p」を宣言した際に、文字列リテラル「123」を代入し、初期化しています。
文字列リテラルを評価すると、先頭文字へのポインタが得られる為、文字列リテラルの「123」が格納された
記憶域の先頭文字「1」のアドレスで変数「p」が初期化されます。
ポインタ変数「p」は、文字列の先頭文字を指すポインタである為、添字演算子[]を適用することで
文字列中の各文字へアクセスすることができます。
例:p[0] ⇒ '1'、p[0] ⇒ '2'
ポインタ変数「p」からの参照イメージ

上記処理の後に、ポインタ変数「p」に対し、文字列リテラル「456」 + 1 を代入しています。
ここでは文字列リテラルの「456」が格納された記憶域の先頭文字「4」のアドレスに対し、1 加算したアドレスを
代入しています。
つまり、ポインタ変数「p」には文字列リテラル「456」の2文字目「5」の先頭アドレスが格納されたため、
printf()での出力結果が「56」となっています。
ポインタ変数「p」からの参照イメージ

上記の結果のように、文字列リテラルを使用したポインタによる文字列は、配列による文字列よりも、
多くの記憶域を必要とする為、注意が必要です。
(ポインタ変数「p」に別の文字列のポインタを格納した後も文字列リテラルで確保したメモリは残り続ける為)