@dandropov95

Почему имени массива нельзя «присваивать» новое значение?

К примеру есть такое объявление и инициализация массива:
char arr[] = "string";
Получается что arr указывает на первый элемент символьного массива. arr == &arr[0]
arr это же просто указатель. Почему нельзя сменить его значение что бы он указывал на новый адрес?
И почему нельзя создавать массивы (не символьные) в стиле указателей?
int arr[] = {1, 2, 3, 4, 5}; // ok
int * arr = {1, 2, 3, 4, 5}; // ne ok
  • Вопрос задан
  • 358 просмотров
Пригласить эксперта
Ответы на вопрос 2
@konfederation
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Это синтаксис объявления и инициализации статического массива. Язык си позволяет не указывать размерность в квадратных скобках и просто указать int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Т.е. последовательность в фигурных скобках позволяет инициализировать массив. Размерность, указанная в квадратных скобках, но которую мы можем опустить при инициализации, позволяет определить сколько памяти необходимо выделить под все это дело. Когда ты объявляешь указатель, ты не выделяешь память под массив.
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
arr это же просто указатель.

Нет, arr -- это имя массива. В языке С указатели и массивы -- разные концепции.

Почему нельзя сменить его значение что бы он указывал на новый адрес

Потому что это не предусмотрено языком в таком контексте как у вас. А вот в таком контексте -- можно:
void f(int arr[])
{
    arr = arr + 1;
}


И почему нельзя создавать массивы (не символьные) в стиле указателей?
int * arr = {1, 2, 3, 4, 5}; // ne ok


В с99 и далее -- можно:
int * arr = (int []){1, 2, 3, 4, 5}; // ok
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы