У меня есть следующий код
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?
1 ответ
Считывается ли эффективный адрес *((*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 байтов и если int **
находится в специальном месте в памяти, где адрес представлен фрагментами из N байтов, ожидаемая сумма это int**
0x888C.
Но существуют и другие возможности: 0x8890, pointer_street:0x0004, неопределенное поведение и т. д.
Математика указателей не является целочисленной математикой.
Значением выражения **dataptrptrptr
является указатель int *
0x1234.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
4
к указателю в C увеличивает его значение не на4
, а на4 * sizeof (*int)
.addr + N
, вы сообщаете компилятору, что вам нужно значение Nth, начинающееся с addr. Если там что-то есть или нет, это полностью ваша проблема, а не компилятора