-5
#include<stdio.h>

#define int int*

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

我的问题是,在 linep=(int *)5中,q=10它是如何在内部工作的,因为p并且q都是指针类型,我们怎么可能为指针变量分配一个整数值q?还有一件事这种类型的铸造如何p=(int*)5在这里工作?

通过使用这个公式,我们可以回答

新地址=旧地址+数字*指针指向的数据类型的大小

4

3 回答 3

1

#define int int*将替换int *p, qint* *p, q. 所以Here是指向并且是类型p的双指针。intqint

例如,在 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;前辈替换。所以它没有发出任何警告。

所以现在printf("%d",q+p);将为您45提供 32 位机器或8564 位机器的情况。

于 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 回答