-5
#include<stdio.h>

#define int int*

main(){
    int *p,q;
    p=(int *)5;
    q=10;
    printf("%d",q+p);
}

私の質問は、 in linep=(int *)5であり、とが両方ともポインター型でq=10あるため、内部でどのように機能しているのか、ポインター変数に整数値を割り当てることができるのはどうしてですか? もう1つ、このタイプのキャストがここでどのように機能していますか?pqqp=(int*)5

この式を使えば答えられる

新しいアドレス = 古いアドレス + 数値 * ポインタが指しているデータ型のサイズ

4

3 に答える 3

1

#define int int*int *p, qとして置き換えますint* *p, q。したがって、ここpは への二重ポインタでintありq、タイプはintです。

たとえば、char の同じロジックの以下のプログラムを検討してください。

#include<stdio.h>  
#define char char*  
main()
{     
    char *p,q;     
    printf("%d, %d\n", sizeof(p), sizeof(q));
} 

出力は

4, 1

p=(int *)5;- このステートメントも、前処理者のように置き換えられp=(int* *)5;ます。したがって、警告はスローされません。

そのため、32ビットマシンまたは64ビットマシンの場合にprintf("%d",q+p);提供されます。4585

于 2012-08-24T11:20:48.770 に答える
0

実際、コンピューター内のすべてのデータとしてのポインターは、論理的な意味に関係なく、物理的に数値として実装されます。

ポインタの場合、通常、番号は仮想アドレスです。そのため、ポインタに手動で値を割り当てると、仮想アドレスが設定されます。

たまたま、仮想アドレスは通常0からCPUのアドレスバス幅までの範囲であるため、それを回避できます。もちろん、アドレスが割り当てられておらず、アクセスすると例外が発生します。

ただし、場合によっては(通常、仮想メモリのない組み込みシステム)、アドレスは仮想ではなく物理であり、一部のハードウェアデバイス(クロック、レジスタなど)には既知の物理アドレスがあり、ポインタに手動で割り当てられてから、ポインタの読み取り/書き込みが行われます。 。

于 2012-08-24T11:11:20.257 に答える
0

p=(int *)5;

変数 p はアドレス 00000005 を指します。値をこのアドレスに変更しようとすると、他のデータが破損したり、プログラムの実行時間が予測不能になる可能性があります。例えば

**p=10 

例外を引き起こす

未処理の例外: アクセス違反書き込み場所 0x00000005。

次の操作の前にprintf("%p",p)を試して、ポインター p の初期アドレスを確認してください。

printf("%d",q+p);

ここからアドレス演算の魔法が始まります.. ポインタ q のアドレスを別のポインタに追加できます。したがって、ポインターはアドレス空間の新しい位置に移動します。これを試して:

p = p+ q
printf("%p",p);
于 2012-08-24T11:19:41.780 に答える