将整数分配/转换为指针

时间:2012-08-24 11:02:39

标签: c pointers

#include<stdio.h>

#define int int*

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

我的问题是排在p=(int *)5q=10内部是如何正常工作的,因为pq都是指针类型,我们怎么可能为指针变量q?分配一个整数值。还有一个问题是这种类型的p=(int*)5如何在这里工作?

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

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

3 个答案:

答案 0 :(得分:1)

#define int int*会将int *p, q替换为int* *p, q。因此,pint的双指针,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;。所以它不会发出任何警告。

所以现在printf("%d",q+p);会在32位计算机或45包含64位计算机的情况下为您提供85

答案 1 :(得分:0)

指针,因为计算机中的所有数据,无论其逻辑含义如何,都以物理方式实现为数字。

在指针的情况下,通常数字是虚拟地址;因此,当您手动为指针指定值时,您将设置虚拟地址。

当发生这种情况时,虚拟地址的范围通常从0到CPU的地址总线宽度,因此您可以使用它 - 当然,除非该地址尚未分配,否则它将导致异常。

然而,有时(典型的没有虚拟内存的嵌入式系统)地址是物理的,而不是虚拟的,并且一些硬件设备(时钟,寄存器等)具有已知的物理地址,这些物理地址被手动分配给指针然后从指针读取指针/写给。

答案 2 :(得分:0)

  

p =(int *)5;

地址00000005上的变量p点。如果要尝试将值更改为此地址,可能会导致其他数据损坏和程序运行时无法预测。 例如

**p=10 

导致异常

未处理的异常:访问冲突写入位置0x00000005。

在下一次操作之前尝试 printf(“%p”,p),以查看poiner p的初始地址。

  

的printf( “%d”,Q + P);

这里地址算术的魔力开始..你可以将指针q的地址添加到另一个指针。因此指针移动到地址空间中的新位置。试试这个:

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