#include<stdio.h>
#define int int*
main(){
int *p,q;
p=(int *)5;
q=10;
printf("%d",q+p);
}
我的问题是排在p=(int *)5
和q=10
内部是如何正常工作的,因为p
和q
都是指针类型,我们怎么可能为指针变量q
?分配一个整数值。还有一个问题是这种类型的p=(int*)5
如何在这里工作?
通过使用此公式,我们可以回答
新地址=旧地址+数字*指针所指向的数据类型的大小
答案 0 :(得分: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;
。所以它不会发出任何警告。
所以现在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);