誰かにはわかるポインタ入門編

// '\' エスケープ
#include <stdio.h>

int main()
{
    char str[256] = "ab\\c";
    char* cp;
    char str2[256];
    int i=0;

    for (cp=str; *cp != '\0'; cp++) {
        //printf("%c\n", *cp);

        if (*cp == '\\') {
            str2[i] = *cp;
            i++;
            str2[i] = '\\';
        }
        else{
            str2[i] = *cp;
        }
        i++;
    }
    str2[i] = '\0';
    printf("str =%s\n", str);
    printf("str2=%s\n", str2);

    return 0;
}
-- run
str =ab\c
str2=ab\\c

文字列中の'\'をエスケープする例。
for (cp=str; *cp != '\0'; cp++) {
の部分がポインタを知らない人は謎に思えるかもしれない。
自分もC言語はもうあまり触ることがないので解説を入れておく。
まず、for文は for(初期値;繰り返し条件;カウンタ) で構成されており、
初期値の cp=str はポインタ変数cpに配列strのアドレスを代入する、と読み替えることができる。
配列は連続したアドレスに格納されているので一回目のループ時は
*cp(ポインタを参照)に 'a'が代入される。二回目のループ字は
'b'、三回目は'c'、四回目は '\0' 文字列の最後を示すヌル文字である。
また説明するまでもないが cp++はアドレスを一つ進めるになる。
 
次は条件式だが
if (*cp == '\\') {
ポインタの参照値が '\' なら str2[i] = *cp; その文字をコピーして
str2の次の配列番号に '\' を追加で入れるというだけだ。
もちろんこうしていくとstrが'\0'の時はfor文を抜けてしまうので
最後に '\0' を入れて文字列を確定している。
 
・・なんか適当になったがわかるのでよしとする。

#include <stdio.h>

int main()
{
    char str[256] = "ab\\c";
    char* cp;
    char str2[256];
    int i=0;

    for (cp=str; *cp != '\0'; cp++) {
        if (*cp == '\\') str2[i++] = '\\';
        str2[i++] = *cp;
    }
    str2[i] = '\0';
    printf("str =%s\n", str);
    printf("str2=%s\n", str2);

    return 0;
}

ちょっと短くしてみた。どうせ'\'の時はコピーしてるので一行にまとめてstr2[i++] = *cp;。
あとi++だろうか。i++と++iの違いを知っていれば分かるが
str2[i++] はstr2[0]を左辺値としたあと、iをひとつインクリメントするという意味だ。
 
以上、誰かにはわかるポインタ入門編でした