我有以下代码
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吗?
最佳答案
Is the effective address being read by *((*dataptrptrptr) + 4) 0x8888 + 4 = 0x888c?
也许 - 这取决于
*dataptrptrptr
是 0x8888
,但地址并不像整数那么简单。
将 4 作为整数加到 0x8888 上是 0x888C。
作为指针,将 4 添加到 int**
0x8888 将在内存中进一步形成地址 4 int**
指针。
如果 int **
指针为 8 个字节,并且如果地址在字节地址上递增,则预期总和为 int **
0x88A8。
如果 int **
指针为 4 个字节,并且如果地址在字节地址上递增,则预期总和为 int **
0x8898。
如果一个int **
指针是N个字节并且if int **
存在于一个特殊的地方在内存中,地址以 N 字节 block 为单位,预期总和为 int**
0x888C。
但还存在其他可能性:0x8890、pointer_street:0x0004、未定义行为等
指针数学不是整数数学。
表达式**dataptrptrptr
的值是int *
指针0x1234。
关于C语言、指针算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61372297/