【问题标题】:I don't understand why some pointer addresses are like this我不明白为什么有些指针地址是这样的
【发布时间】:2020-06-26 07:08:47
【问题描述】:

我正在学习C语言的指针,我有一些问题。

#include <stdio.h>

int main()
{
    char c = 'A';
    char* pc = &c;
    char** ppc = &pc;

    printf("%p %p\n", pc, ppc);
    printf("%p %p\n", pc + 1, ppc + 1);
    printf("%p %p\n", &c, &c + 1);
    printf("%p %p\n", &pc, &ppc);
    printf("%p %p\n", &pc + 1, &ppc + 1);

    return 0;
}

在这段代码中,假设

&c = 0117FE7B
&pc = 0117FE6C
&ppc = 0117FE60

我以为有些答案会是这样的:

ppc + 1 = 0117FE6D
&pc + 1 = 0117FE6D
&ppc + 1 = 0117FE61

但正确答案是这样的:

ppc + 1 = 0117FE70
&pc + 1 = 0117FE70
&ppc + 1 = 0117FE64

我不明白为什么。有人可以为我解释一下吗? (我的电脑使用的是 64 位 windows 操作系统。)

【问题讨论】:

  • ppc 的类型是什么? &amp;ppc 的?请记住,指针添加会考虑基础类型的大小
  • @pmg: 在给定平台上指针的大小不一样吗?
  • 在指针运算中,表达式ptr + n有点意思是(unsigned char *)ptr + n*sizeof *ptr
  • @JuneYoon:不,在 C 标准的某些规则内,不同类型的指针的大小可能会有所不同。在普通的现代 C 实现中,所有指针的大小都相同是很常见的,但这不是标准要求的。
  • @thurizas: C 2018 6.2.5 28 需要指向 void 和字符类型的指针具有相同的表示形式,需要指向结构类型的指针具有相同的表示形式,需要指向联合类型的指针具有相同的表示,并表示指向其他类型的指针不需要具有相同的表示。

标签: c pointers 64-bit memory-address


【解决方案1】:

指针算术是以对象的形式完成的,而不是字节。如果 p 计算为 4 字节 int 对象的地址,则 p + 1 计算为 下一个 4 字节 int 的地址,而不是下一个字节: p>

int x;           // assume 4-byte int
int *ip = &x;

short s;         // assume 2-byte short
short *sp = &s;

char c;
char *cp = &c;

    +---+                  +---+                   +---+
x : |   | <-- ip       s : |   | <-- sp        c : |   | <-- cp
    +---+                  +---+                   +---+
    |   |                  |   |                   |   | <-- cp + 1
    +---+                  +---+                   +---+
    |   |                  |   | <-- sp + 1        |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   | <-- ip + 1       |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+

所以根据所指向类型的大小,p + 1 将给出地址 + 1,或者地址 + 4,或者地址 + 8,等等。

记住,数组下标操作a[i]定义*(a + i) - 给定起始地址a,偏移量i对象(不是字节! !)从该地址并尊重结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 2013-05-09
    • 1970-01-01
    • 2022-11-18
    • 2020-08-29
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多