なぜ通常、ポインタ変数に初期値を与える整数を使用しないのですか?[c/c++]

3045 ワード

--------『cとポインタ』6.9ポインタ定数より抜粋------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
変数aが位置100に格納されていると仮定すると、次の文の役割は何ですか.
*100 =25;
位置100に格納された変数であるため、aに25を割り当てるように見えます.ただし、これはエラーです.フォント値100のタイプは整数であり、間接アクセス操作はポインタタイプ式にのみ作用します.
確かに25を位置100に格納したい場合は、強制タイプ変換を使用する必要があります.
*(int*)100 = 25;
強制タイプ変換は、値100を「整数」から「整数へのポインタ」に変換し、間接的にアクセスするのが合法です.aが位置100に格納されると、この文は値25をaに格納する.
しかし、このようなテクニックが必要な機会は唯一ではありません.
通常、コンパイラが特定の変数をメモリのどこに置くか予測できないので、アドレスを事前に知ることはできません.&オペレータで変数のアドレスを得るのは簡単ですが、式はプログラム実行時に評価され、その結果を文字値定数としてソースコードにコピーするには間に合いません.
このテクニックの唯一の利点は、変数にアクセスするのではなく、ハードウェア自体にアクセスするためにアドレスを介してメモリ内の特定の場所にアクセスすることです.例えば、オペレーティングシステムは、入出力デバイスコントローラと通信し、I/O動作を開始し、前の動作から結果を得る必要がある.一部のマシンでは、デバイスコントローラとの通信は、特定のメモリアドレスで値を読み取り、書き込むことによって実現される.ただし、これらの操作はメモリにアクセスするよりも、デバイスコントローラインタフェースにアクセスします.このように、これらの場所は、予め知られているアドレスによってアクセスしなければならない.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ポインタの値を整数として取り出すか、整数値をアドレスとしてポインタに割り当てることができます.
int a=123,b;
int *ptr=&a;
char *str;
b=(int)ptr;  //   ptr           。
str=(char*)b;  //                 str。

注意:
例:
unsigned int a;
a=N;///Nは正当なアドレスを表す必要があります
ptr=a;
aの値は合法的なアドレスを表す必要があることを強調しています.そうしないと、ptrを使用すると、不正な操作エラーが発生します.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ps:通常、ポインタ変数に初期値を付与する整数は使用されませんが、使用できます.(唯一ではない)
ポインタ変数に値を割り当てる場合は、アドレス定数または変数でなければなりません.通常の整数ではありません.
次のコードを実行します.
int *pi = (int*)0xbfc5aaac;
一般的には、このアドレスが物理メモリにマッピングされていない可能性があるため、セグメントエラーが報告されます.
そのため、ポインタを使用するには特に注意してください.ポインタを誤ったアドレスに指しやすく、このようなアドレスにアクセスするとセグメントエラーが発生し、意味のない値に読む可能性があります.
なぜ通常、ポインタ変数に初期値を与える整数を使用しないのですか?
安全と互換性の問題のためだと思います.ポインタ変数に整数を割り当てると、この変数に絶対アドレスが割り当てられます.
この絶対アドレスを使用する場合は、次のことを確認できます.
(1)システムにアクセスしてアクセスを禁止するスペースがないことを保証しますか?
(2)仮定(1)が満たされると、どのコンピュータでもこの空間にアクセスできる効果は同じですか?
この2つの点が保証されている場合は、強力な変換プロセスを含む直接値を割り当てることができます.
しかし、ほとんどの場合、誰もこの把握を持っていないかもしれませんが、X 86システムのシステム中断関数アドレスはまだ20年以上も維持されているかもしれません.
tips:
  • ポインタ変数自体のデータ値のタイプは、unsigned long int
  • です.
  • ポインタ付与演算でよく見られるのは、
  • のいくつかの形式です.
    1つの変数のアドレスに同じデータ型を指すポインタを与える.
    1つのポインタの値を同じデータ型の別のポインタに与える.
    配列のアドレスを同じデータ型を指すポインタに与える.
    一部のコンテンツはインターネットから抜粋されています.
    http://learn.akae.cn/media/ch23s01.html
    http://zhidao.baidu.com/question/210714496.html?fr=qrl&cid=869&index=1
    針を怖がらないでpdf