首页 > 解决方案 > c语言,指针运算

问题描述

我有以下代码

void main(void) {
    int data = 0x5555;
    int* dataptr = &data;
    int** dataptrptr = &dataptr;
    int*** dataptrptrptr = &dataptrptr;
    printf("%d\n", ***dataptrptrptr);
}

data在地址0xabcd

dataptr在地址0x1234

dataptrptr在地址0x8888

dataptrptrptr在地址0xffff

是否正在读取有效地址*((*dataptrptrptr) + 4) 0x8888 + 4 = 0x888c

另外,表达式的值是**dataptrptrptr0x1234 吗?

标签: cpointers

解决方案


*((*dataptrptrptr) + 4) 0x8888 + 4 = 0x888c 是否正在读取有效地址?

也许 - 这取决于

*dataptrptrptr0x8888,但地址并不像整数那么简单。

将 4 作为整数添加到 0x8888 是 0x888C。

作为一个指针,将 4 加到int**0x8888 将int**在内存中进一步形成地址 4 指针。

如果int **指针是 8 个字节,并且地址字节地址上递增,则预期总和为int**0x88A8。

如果int **指针是 4 字节并且地址字节地址上递增,则预期总和为int**0x8898。

如果一个int **指针是 N 字节,并且如果 int **它位于内存中的一个特殊位置,地址是在 N 字节块中,那么预期的总和是int**0x888C。

但存在其他可能性:0x8890、pointer_street:0x0004、未定义行为等。

指针数学不是整数数学。


表达式的值**dataptrptrptrint *指针 0x1234。


推荐阅读