Что выводится этот код, массив и указатели

У меня есть несколько вопросов относительно кода ниже.

  1. Если у меня есть указатель какого-то типа, что это значит использовать индексирование массива с ним? в этом примере, что делает ptr[3] обозначать (ptr - указатель какого-то типа)?
  2. Выход программы должен быть to be or not to be (Hamlet) но я не уверен почему, моя проблема с линией (&ptr2)[3] = strЯ не понимаю, как эта строка меняет третий элемент ptr1 массив.

    int main()
    {
     char str[] = "hmmmm...";
     const char *const ptr1[] = {"to be", "or not to be", "that is the question"};
     char *ptr2 = "that is the question";
    
     (&ptr2)[3] = str;
    
     strcpy(str, "(Hamlet)");
     for (int i = 0; i < sizeof(ptr1) / sizeof(*ptr1); ++i)
     {
        printf("%s ", ptr1[i]);
     }
     return 0;
    }
    

Используя этот визуализатор, мы видим, что ptr1 будет указывать на str, я просто не понимаю, почему это происходит.

Помощь приветствуется.

1 ответ

Решение

Если у меня есть указатель какого-то типа, что это значит использовать индексирование массива с ним? в этом примере, что означает ptr[3] (ptr - указатель некоторого типа)?

В С, a[i] является синтаксическим сахаром для *(a + i), Это допустимый синтаксис для указателей, даже если они не указывают на массив.

Выход программы должен быть или не быть (Гамлет), но я не уверен, почему, моя проблема со строкой (&ptr2)[3] = str, я не понимаю, как эта строка изменяется третий элемент массива ptr1.

Линия (&ptr2)[3] ничего не меняет в str1, Он пытается получить доступ к неизвестной ячейке памяти.

Если вам сказали, что выход этой программы должен быть "быть или не быть (Гамлет)", то вы ошиблись.

Другие вопросы по тегам