Почему я не могу получить доступ к элементам 2D-массива, если я объявил его с помощью обозначения указателя? - PullRequest
0 голосов
/ 21 июня 2020

Ниже представлены два 2D-массива, один из которых объявлен с использованием нотации массива, а другой - с использованием нотации указателя (т.е. указатель на группу смежных одномерных массивов (не массив указателей).

int array1[][3]={{1,2,3},{4,5,6}};
int (*array2)[3]={{1,2,3},{4,5,6}};

Я могу получить доступ к элементам array1, используя как массив, так и указатель.

 //accessing the 3rd element of the first row (of array1)
printf("array1[0][2]=%d",array1[0][2]);//3
printf("\n*(*array1+2)=%d",*(*array1+2));//3 

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

//accessing the 3rd element of the first row (of array2)    
printf("\n*(*array2+2)=%d",*(*array2+2));
printf("\narray2[0][2]=%d",array2[0][2]);

Что-то не так в том, как я объявил эти массивы? Я также пробовал объявить array2 как stati c, но он по-прежнему генерирует ошибку.

Почему эта ошибка возникает при объявлении с использованием обозначения указателя? Как мне это исправить?

Однако ошибки нет, если последние 2 строки заменить следующим образом:

printf("\n(*array2+2)=%d",(*array2+2));//9
printf("\narray2[2]=%d",array2[2]);//25

Но что это значит? Если я дам array2[3], то значение увеличится на 4 (размер int)

Ответы [ 2 ]

4 голосов
/ 21 июня 2020

Этот код является недопустимым, потому что инициализатор для скаляра должен быть единственным выражением (необязательно заключенным в фигурные скобки):

int (*array2)[3]={{1,2,3},{4,5,6}};

Вы должны получить сообщение о диагностике компилятора c. Если вы этого не сделаете, измените настройки компилятора.

Поведение, которое вы получаете от любого сгенерированного исполняемого файла, бессмысленно, так как это неправильная программа C, поэтому остальная часть вопроса спорный.

0 голосов
/ 21 июня 2020

in C u не может сгенерировать массив с помощью такого метода.

для генерации массива с фиксированным размером u необходимо int array [2] [2] = {{1,2}, { 3,4}};

с этим u может указывать на него указатель и обращаться к нему, как хотите;

void * p = (void *) array;

printf ("% i", ((int ) p + 3)); // 4

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