@avion123678

Имена массивов в си?

Здравствуйте, чем является имя массива в C? Имя массива это не совсем указатель, так как для него не работает операция присваивания другого указателя. Clion отображает имя массива как некий класс int [n]. Так же адрес расположения массива и адрес, который он содержит совпадают. При создании многомерного массива (двух мерного в частности) имя массива имеет класс int [n][n]. Но также адрес расположения имени массива, и адрес который он содержит совпадают, поэтому приведением к типу int* можем получить обычный указатель на int и с помощью него, управлять выводи массива. При этом для функции нет разницы имя массива или указатель, так как она принимает просто адреса. Так что это за типы такие?
  • Вопрос задан
  • 378 просмотров
Решения вопроса 1
gbg
@gbg
Баянист. Тамада. Услуги.
Начнем с устранения ваших проблем в терминах, так как из него следует ваше непонимание ситуации. А также с устранения методических проблем.

Главный источник информации о языке - стандарт языка. Не книжки Страуструпа, Майерса, не то, что показывает CLion, IntelliSense и их друзья, а стандарт языка. Не следует делать выводов о работе и устройстве языка из этих источников.

Далее, нет такоего термина "имя массива в C". Есть термин "переменная типа массив". Если вы написали:
int ints[2];
- это у вас массив на стеке. ints при этом имеет семантику указателя, который всегда и гарантированно указывает на 0 элемент в массиве. Понятно, что коль скоро это указатель на стек, записать туда другой указатель (ints=somePointer) нельзя - потому что нигде в программе, на самом деле, этот указатель не хранится - он вычисляется и подставляется компилятором на ходу.

Из этого не следует(!), что переменная типа "массив" не имеет семантики указателя.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
bingo347
@bingo347
Ткнуть в доку лучше готового к копипасте ответа
Массивы в C - это сахар над арифметикой и разыменовыванием указателей
Согласитесь, проще и нагляднее писать arr[i] чем *(arr + i)

Так же, для хранения данных на стеке необходимо знать точный размер этих данных во время компиляции. Объявляя тип массива для переменной на стеке, мы еще и показываем компилятору, сколько памяти нам надо, то есть, когда мы пишемint arr[10];компилятор понимает, что тут нужно выделить sizeof(int) * 10 памяти на стеке
Ответ написан
CityCat4
@CityCat4
Если я чешу в затылке - не беда!
Здравствуйте, чем является имя массива в C?

Ничем. "Имя массива" - это просто удобное название для тех, кто не одолел темы указателей. Те, кто эту тему одолел, таким вопросом уже не задаются, потому что статические массивы типа int[5] для них просто перестают существовать. "Имя массива" указывает на его первый элемент, но сделать с ним ничего нельзя. Точка. Не нравится - используйте динамические массивы.
При создании многомерного массива (двух мерного в частности)

"Двумерный (трех- , четырех-, n- мерный) массив" - это абстракция. В памяти данные идут последовательно, следовательно вся "мерность" массива - это автоматическое перемещение текущего указателя к некоей точке. Что опять нас возвращает к вопросу о статических и динамических массивах.

Осваивайте указатели и все эти костыли отвалятся сами по себе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы