Я столкнулся с мнением, что в случае, если у нас есть указатель на указатель, мы можем разыменовать его через [][]
, если выделенная память является смежной. В противном случае может использоваться только разыменование с помощью арифметики указателей. Но я не могу полностью воспроизвести эту ситуацию, то есть вот пример кода:
#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
дают одинаковые результаты. Я что-то здесь не получаю или оба метода разыменования работают одинаково?