c - 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。
有人能帮我吗?
解决方案
只有我必须承认,我根本无法理解这些结果,因为当我计算一个指针时,它应该指向内存中随机的东西,它总是出现 0xc 或 0x10。
该程序不会访问任何指针的“指针指向的内存中的值”。它只进行指针算术(更改指针指向的内容)。
该问题的目标可能是测试您是否了解指针算法在 C 中的工作原理。
指针算术在 C 中的工作原理是它隐藏了“乘以 sizeof(无论指针指向什么)”。换句话说,p = p + n;
大致相当于p = (char *)p + n * sizeof(*p);
,或替代地p = &p[n];
。
推荐阅读
- matlab - 在 Matlab R2020a 中打开脚本时出错
- apache-spark - Spark randomSplit 训练和测试数据行数总是给出不同的结果
- c# - 当找不到我在顶部指定的网站 url 时,我如何创建 else 或 if 语句在 usrNameLabel 中创建文本
- http - 非英语语言的 HTTP 自定义 Header 键名
- mysql - 如何更改 mysql 表中的 ID-s 顺序(按值排序记录)
- javascript - 用户拒绝后使用 JS 在 IE 11 中调用剪贴板访问提示
- typescript - 如何使用 VSCode api 打开自定义编辑器
- html - 如何在 css calc 中使用负值和百分比值?(流体设计)
- c# - 将具有名称的特定孩子放入数组
- spring-boot - 使用属性文件中的值进行自定义注释时出现错误 - 标记“)”上的语法错误,此标记后应为默认值