Путаница с указателями в C

#c #arrays #pointers

#c #массивы #указатели

Вопрос:

Я изучаю C, и теперь у меня путаница с указателями. Мой вопрос в том, почему printf(«%d», *(i)); не возвращает элемент вместо адреса при использовании многомерного массива??

 #include <stdio.h>

int main()
{
    int i[2][2] = {{1,8},{2,9},{3, 4}};
    //int i[2] = {1,2,3};
    printf("%d", *(i));
    printf("n%d", i);
}
  

Комментарии:

1. Пожалуйста, обратите также внимание, что в вашем коде i имеет длину 2, но инициализатор содержит 3 элемента.

Ответ №1:

Ну, это массив массивов, поэтому при индексации / разыменовании его один раз вы получаете массив, который распадается на указатель…

Комментарии:

1. Да, и изображение в этой статье должно объяснить это подробнее: c-faq.com /~scs/cclass/int/sx9b.html

2. @dbrank0: Страница, на которую вы ссылаетесь, посвящена «моделированию многомерных массивов» с использованием нескольких уровней массивов указателей. Это нечто отличное от «обычного» многомерного массива, который мы имеем здесь. Таким образом, картинка не совсем корректна для этого вопроса.

Ответ №2:

Поскольку многомерный массив может быть записан как **i, то, что вы делаете *(i), дает вам адрес первого массива.