c语言,指针算术

问题描述 投票:1回答:1

我有以下代码

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?

另外,表达式的值是否为 **dataptrptrptr 0x1234?

c pointers
1个回答
2
投票

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

也许吧--这要看情况

*dataptrptrptr0x8888,然而地址并不是整数那么简单。

作为整数,把4加到0x8888上就是0x888C。

作为指针,将4加到 int** 0x8888正在形成地址4 int** 指针在内存中更远的地方。

如果 a int ** 指针是8个字节和 如果 地址在字节地址上递增,预期总和为 int** 0x88A8.

如果 a int ** 指针是4个字节和 如果 地址在字节地址上递增,预期总和为 int** 0x8898.

如果 a int ** 指针是N个字节和 如果 int ** 住在内存中一个特殊的地方,其中地址是以N个字节为单位的,预期总和是 int** 0x888C。

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

指针数学不是整数数学。


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

© www.soinside.com 2019 - 2024. All rights reserved.