以下のようなコードを書きます。
char *n1,*n2;のようにポインタを独立したものと定義すればそれぞれの値に応じて文字を取得できますが、FILE *fp1, *fp2;は独立していますが、fgetcを呼ぶたびにポインタが更新されています。

int main(int argc, char** argv){
    FILE *fp;
    fp = fopen("main.text", "w");
    char nn[]="mainworld";
    fputs(nn, fp);
    fclose(fp);
    fp = NULL;

    FILE *fp1, *fp2;
    char *n1,*n2;
    fp = fopen("main.text", "r"); //ファイルへのポインタを代入
    n1=nn;//文字列へのポインタを代入

    //コピー
    fp2 = fp;
    n2=n1;
    while (1) {//それぞれに対して一文字ずつ取り出す操作

        printf("%c%c",*(n1++), (char) fgetc(fp));
        if (feof(fp))break;
        printf("%c%c",*(n2++), (char) fgetc(fp2));
        if (feof(fp2))break;
    }
    return 0;
}

EOFを出力していますが気にしないでください。仕様です。

もっとわかりやすいコードでは、ファイルの時のものとメモリ内の文字列の時とに分け2つのコードと実行結果の比較がわかりやすいかと思います。なので printf("%c,%c",*(n1++),*(n2++));printf("%c%c", (char) fgetc(fp), (char) fgetc(fp2));//この書き方あまり良くなかったかもの2つの時比べてもらえるとわかりやすいです。