Относительно использования функций с индексом массива - PullRequest
0 голосов
/ 04 августа 2020

Может ли кто-нибудь объяснить мне лог c относительно значения переменной b?

#include <stdio.h>

unsigned char buffer[4] = {1,2,3,4};   /* Declare the buffer */

unsigned char* u8GetHeader(void)
{
    static int count = 0;
    count++;              /* incrementing the value of count for every invoke */
    if(1 == count)
      return &buffer[0];
    else
      return &buffer[1];
}

int main()
{
     unsigned int a , b;
     a = (u8GetHeader())[0];
     b = (u8GetHeader())[1];
     printf("The value of variable a = %d\n",a);
     printf("The value of variable b = %d\n",b);
}

Ответы [ 3 ]

3 голосов
/ 04 августа 2020

Эта программа является хорошим кандидатом для сначала работы на бумаге, а затем пошагового выполнения программы, чтобы проверить, соответствует ли она вашим ожиданиям.

Предположим, что buffer является глобальным по адресу 0x1000.

Первый вызов u8GetHeader возвращает адрес buffer[0], который равен buffer или 0x1000. Затем вы индексируете его с помощью 0, поэтому вы получаете доступ к номеру 0x1000, который равен 1.

Второй вызов возвращает адрес buffer[1] или 0x1001. Вы индексируете его с помощью 1, поэтому вы получаете доступ к номеру 0x1002, что составляет 3.

2 голосов
/ 04 августа 2020

Давайте немного изменим вашу программу:

int main()
{
    unsigned int a , b;
    unsigned int *x, *y;

    x = u8GetHeader();
    y = u8GetHeader();
    a = x[0];
    b = y[1];
    printf("The value of variable a = %d\n",a);
    printf("The value of variable b = %d\n",b);
}

При первом вызове функции u8GetHeader она возвращает указатель на первый элемент массива. Это присваивается переменной x.

Каждый раз после первого вызова функция u8GetHeader возвращает указатель на второй элемент. Это присваивается переменной y.

Теперь, если мы «нарисуем» массив и указатели на различные элементы в нем, он может выглядеть так:

+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
^   ^
|   |
x   y

Он должен Будьте предельно ясны, что y указывает на значение 2. Это y[0] == 2. Из этого также должно быть совершенно ясно, что добавление 1 к этому индексу (т.е. y[1]) затем приведет к получению второго элемента из y, который является значением 3. Итак, y[1] == 3.

Возможно, также полезно знать, что для любого массива указателя p и индекса i выражение p[i] равно точно равно *(p + i).

Отсюда получаем, что y[1], тогда должно быть *(y + 1)., И если мы добавим стрелку для y + 1 на чертеже, мы получим:

+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
^   ^   ^
|   |   |
x   y   y+1
2 голосов
/ 04 августа 2020

Почему b дает вам 3: Поскольку count is stati c, он будет увеличиваться при каждом вызове. С помощью b = (u8GetHeader())[1]; вы вызываете функцию во второй раз, поэтому возвращается &buffer[1], который является указателем на {2,3,4}, а его второе значение равно 3.

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