c язык, арифметика указателей - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть следующий код

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 Ответ

2 голосов
/ 22 апреля 2020

Эффективный адрес читается * ((* dataptrptrptr) + 4) 0x8888 + 4 = 0x888 c?

Возможно - это зависит

*dataptrptrptr равно 0x8888, но адреса не являются простыми целыми числами.

Добавление 4 к 0x8888 в виде целых чисел 0x888 C.

В качестве указателя добавление 4 к int** 0x8888 формирует адрес 4 int** указателей в памяти.

Если указатель a int ** равен 8 байтов, а , если увеличение адреса на байтовом адресе, ожидаемая сумма будет int** 0x88A8.

Если указатель a int ** составляет 4 байта, а , если увеличение адреса на байтовом адресе, ожидаемая сумма будет int** 0x8898.

Если Указатель a int ** составляет N байтов, а , если int ** живут в специальном месте в памяти, где адрес находится в кусках N байтов, ожидаемая сумма равна int** 0x888 C.

Но существуют и другие возможности: 0x8890, pointer_street: 0x0004, неопределенное поведение , et c.

Математическая указатель не является целочисленной математикой.


Значением выражения **dataptrptrptr является указатель int * 0x1234.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...