【问题标题】:what happens when we do (char *) casting to store integer data into char pointer?当我们进行 (char *) 转换以将整数数据存储到 char 指针时会发生什么?
【发布时间】:2022-07-31 18:14:38
【问题描述】:
int a;
(&a+1) -&a: 1
(char*)(&a+1) -(char*)&a: 4

您能否解释一下为什么我们在进行 (char *) 转换时得到了不同的结果?

我编译了代码,发现转换前后的地址是一样的。但是当我们做算术时,我们会得到不同的结果。为什么? &a: 1283454684 &a+1: 1283454688 (char*)&a: 1283454684 (char*)(&a+1): 1283454688

【问题讨论】:

  • 具有讽刺意味的是,这个问题的答案是 in the tag info itself 用于指针算术标记。
  • 对我来说这个问题有点不清楚,但我认为答案是:当你增加(也就是加 1)指向类型 T 的指针时,地址会增加类型 T 的大小。所以如果 T 是 char 则地址也增加 1 但如果 T 是 int 则地址增加 sizeof(int) 在大多数系统上为 4。这允许您使用 *(base + index) 访问 T 数组以访问元素 index

标签: c pointers pointer-arithmetic


【解决方案1】:

在进行指针运算时,C 编译器使用指针指向的数据的大小作为“度量单位”,因为最小的大小是单个字节。

所以当你有一个指针 type* p 并添加 n 时,编译器会这样做:

C: 
   p+n

ASM: 
   p + n * sizeof(<data type pointed by p>)

请注意,每次访问数组时都会在后台发生这种情况。

struct bigStruct{
   int a;
   int b;
   ...
   int z;
};

// Define array of 100 bigStructs
struct bigStruct allStructs[100];

allStructs[3] == *(&allStructs + 3)
allStructs[3] == *(&struct bigStruct)((char*)&allStructs + 3*sizeof(struct bigStruct))

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多