【问题标题】:Assigning/Casting integers to pointers将整数分配/转换为指针
【发布时间】:2012-08-24 11:02:39
【问题描述】:
#include<stdio.h>

#define int int*

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

我的问题是,在p=(int *)5q=10 行中,它是如何在内部工作的,因为pq 都是指针类型,我们怎么可能将整数值分配给指针变量@ 987654326@?。还有一件事,这种类型的转换 p=(int*)5 在这里工作吗?

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

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

【问题讨论】:

  • #define int int* - 邪恶主谋:P
  • 是 p = (int) 5 还是 p = (int *) 5 ?
  • 由于#define,这只是无意义的代码,在现实世界的应用程序中没有用处。无需详述它的作用。
  • @PetarMinchev 你知道“从不归咎于恶意......”这句话吗?
  • @cnicutar - 我还没听说过。不错,谢谢:)

标签: c pointers


【解决方案1】:

#define int int* 将替换 int *p, qint* *p, q。所以这里p 是指向int 的双指针,qint 类型。

例如,考虑以下在 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 位机器的情况下或85 在64 位机器的情况下。

【讨论】:

    【解决方案2】:

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

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

    事实上,虚拟地址的范围通常从 0 到 CPU 的地址总线宽度,所以你可以不用它——当然,除非该地址没有被分配并且访问它会导致异常。

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

    【讨论】:

      【解决方案3】:

      p=(int *)5;

      变量p指向地址00000005。如果试图改变这个地址的值,可能会导致其他数据的损坏和不可预知的程序运行时间。 例如

      **p=10 
      

      导致异常

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

      在下一次操作前尝试printf("%p",p)查看指针p的初始地址。

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-02-13
        • 2017-02-12
        • 1970-01-01
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        相关资源
        最近更新 更多