首页 > 解决方案 > 32位或64位系统中的指针运算长短

问题描述

我正在准备考试,问了以下问题,以下程序在 32 位或 64 位中生成什么输出?

#include <stdio.h>
int main(int argc, char **argv)
{
 long *p = (long *)8;
 short *q = (short *)0;
 int c, i, l;

 p = p + 1;
 q = q + 1;

 printf("p = %p q = %p\n", p, q);

 c = (char *)p - (char *)q;
 i = (int *)p - (int *)q;
 l = (long *)p - (long *)q;

 printf("c = %d, i = %d, l = %d\n", c, i, l);

 return 0;
}

32位的结果如下:

p = 0xc q = 0x2
c = 10, i = 2, l = 2

64位的结果如下:

p = 0x10 q = 0x2
c = 14, i = 3, l = 1

只有我必须承认,我根本无法理解这些结果,因为当我计算一个指针时,它应该指向内存中随机的东西,它总是出现 0xc 或 0x10。

有人能帮我吗?

标签: cpointersoperating-systemlong-integershort

解决方案


只有我必须承认,我根本无法理解这些结果,因为当我计算一个指针时,它应该指向内存中随机的东西,它总是出现 0xc 或 0x10。

该程序不会访问任何指针的“指针指向的内存中的值”。它只进行指针算术(更改指针指向的内容)。

该问题的目标可能是测试您是否了解指针算法在 C 中的工作原理。

指针算术在 C 中的工作原理是它隐藏了“乘以 sizeof(无论指针指向什么)”。换句话说,p = p + n;大致相当于p = (char *)p + n * sizeof(*p);,或替代地p = &p[n];


推荐阅读