Указатели разыменования различий между [] и * - PullRequest
0 голосов
/ 11 декабря 2019

Я столкнулся с мнением, что в случае, если у нас есть указатель на указатель, мы можем разыменовать его через [][], если выделенная память является смежной. В противном случае может использоваться только разыменование с помощью арифметики указателей. Но я не могу полностью воспроизвести эту ситуацию, то есть вот пример кода:

#include <stdio.h>
#include <stdlib.h>

#define ITEMS_NO    3
#define LETTERS_NO  4

int main(void)
{
    char* theArray[ITEMS_NO];
    char* dummyArr[ITEMS_NO];

    for (int i = 0; i < ITEMS_NO; ++i)
    {
        theArray[i] = malloc(LETTERS_NO);
        dummyArr[i] = malloc(LETTERS_NO); // make sure mem is not adjecent

        for (int k = 0; k < LETTERS_NO - 1; ++k)
        {
            theArray[i][k] = '0' + i;
            dummyArr[i][k] = 'z';
        }

        theArray[i][LETTERS_NO - 1] = 0;
        dummyArr[i][LETTERS_NO - 1] = 0;
    }

    for (int i = 0; i < ITEMS_NO; ++i)
    {
        printf("item by square bracket %i = %c \n", i, theArray[i][1]);
        printf("item by ptr %i = %c \n", i, *((*(theArray + i)) + 1));
        free(theArray[i]);
        free(dummyArr[i]);
    }
}

В этом примере я выделяю dummyArr, чтобы убедиться, что выделенная память для theArray не является соседней. друг другу. Оба вызова printf дают одинаковые результаты. Я что-то здесь не получаю или оба метода разыменования работают одинаково?

1 Ответ

3 голосов
/ 11 декабря 2019

Два метода абсолютно эквивалентны. Раздел 6.5.2.1p2 C стандарта относительно состояний подписки массива:

Выражение postfix, за которым следует выражение в квадратных скобках [], представляет собой обозначение элемента с подписьюобъект массива. Определение подстрочного оператора [] состоит в том, что E1[E2] идентичен (*((E1)+(E2))). Из-за правил преобразования, применяемых к двоичному оператору +, если E1 является объектом массива (эквивалентно указателю на начальный элемент объекта массива) и E2 является целым числом, E1[E2] обозначаетE2 -й элемент E1 (считая от нуля).

Тот факт, что у вас есть указатель на указатель, где каждый указатель указывает на отдельный массив, в отличие отистинный 2D-массив не меняет этого.

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