Я не понимаю, почему некоторые адреса указателей такие - PullRequest
1 голос
/ 14 марта 2020

Я изучаю указатель на C языке и у меня есть несколько вопросов.

#include <stdio.h>

int main()
{
    char c = 'A';
    char* pc = &c;
    char** ppc = &pc;

    printf("%p %p\n", pc, ppc);
    printf("%p %p\n", pc + 1, ppc + 1);
    printf("%p %p\n", &c, &c + 1);
    printf("%p %p\n", &pc, &ppc);
    printf("%p %p\n", &pc + 1, &ppc + 1);

    return 0;
}

В этом коде допустим, что

&c = 0117FE7B
&pc = 0117FE6C
&ppc = 0117FE60

Я думал, что некоторые ответы будут вот так:

ppc + 1 = 0117FE6D
&pc + 1 = 0117FE6D
&ppc + 1 = 0117FE61

но правильный ответ был такой:

ppc + 1 = 0117FE70
&pc + 1 = 0117FE70
&ppc + 1 = 0117FE64

и я не понимаю почему. Может кто-нибудь объяснить это для меня? (Мой компьютер использует 64-битную windows ОС.)

1 Ответ

4 голосов
/ 14 марта 2020

Арифметика указателя c выполняется в терминах объектов , а не байтов. Если p вычисляется по адресу 4-байтового int объекта, то p + 1 оценивается по адресу следующего 4-байтового int, а не следующего байта:

int x;           // assume 4-byte int
int *ip = &x;

short s;         // assume 2-byte short
short *sp = &s;

char c;
char *cp = &c;

    +---+                  +---+                   +---+
x : |   | <-- ip       s : |   | <-- sp        c : |   | <-- cp
    +---+                  +---+                   +---+
    |   |                  |   |                   |   | <-- cp + 1
    +---+                  +---+                   +---+
    |   |                  |   | <-- sp + 1        |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   | <-- ip + 1       |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+

Таким образом, в зависимости от размера указываемого типа, p + 1 даст либо адрес + 1, либо адрес + 4, либо адрес + 8 и т. Д. c.

Помните, что операция индексации массива a[i] определяется как *(a + i) - с учетом начального адреса a, смещение i объектов (не байтов) !!) с того адреса и почтите результат.

...