p[i]
ここで、char *p;
はグローバル変数です。次のようにポインタアクセスへのインデックス付きアクセスの切り替え
char *p;
int access_p_i(uintptr_t i)
{
return printf("p[%lx]=%c\n", i, p[i]);
}
使用目的は次のとおりです。
char buf[] = "abcde";
p = buf; /*set p once*/
access_p_i(3); //prints p[3]=d
access_p_i(2); //prints p[2]=c
は、私は絶対的なポインタを取るために(機能を変更することなく)、それをハイジャックしたいと言う:
memset(&p,0,sizeof(char*)); /*set p once*/
access_p_i((uintptr_t)"d");
access_p_i((uintptr_t)"c");
これはポータブルだろうと法的なC?
@ 2501私が本当にやりたいことは、そのポインタを構造体に持っていて、その構造体を主にインデックスを使って操作する機能が1つありますが、それを生ポインタに切り替えることがあります両方のケースでただ1つの関数を使うことができるかどうか疑問に思っています(私はそれらを格納するのでインデックスを使用し、ベースが再配置されている場合は書き直す必要はありません)。 – PSkocik
@ 2501それはうまく動作することはありませんが、完全にうまく動作します([demo](http://ideone.com/b10yMu))。 – dasblinkenlight
@dasblinkenlightそれは未定義の動作ではありません。標準は動作を定義し、コンパイラの出力は定義しません。 Gccはここでは非常に寛容です。 – 2501