我有以下代码
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?
有效地址是否被*((*dataptrptrptr) + 4) 0x8888 + 4 = 0x888c读取?
也许吧--这要看情况
*dataptrptrptr
是 0x8888
,然而地址并不是整数那么简单。
作为整数,把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, 未定义行为,等等。
指针数学不是整数数学。
表达式的值是 **dataptrptrptr
是 int *
指针0x1234。