На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Ошибка при работе с указателями , для "++" требуется левостороннее значение
    Изучаю книгу Кернингана и Ритчи "Язык программирования С", при выполнении упражнения возник вопрос. Не могу понять почему при компиляции возникает ошибка в коде:

    ExpandedWrap disabled
      main()
      {
          int argc2 = 4;
          char *argv2[] = {"hello.exe", "1", "2", "+"};
       
          ++argv2; //error C2105: для "++" требуется левостороннее значение
      }


    В нижепреведённом коде ошибки не возникает:

    ExpandedWrap disabled
      main(int argc, char *argv[])
      {
          ++argv;
      }


    Никак немогу понять в чём разница и почему один код работает, а другой - нет.

    Компилирую в Microsoft Visual Studio 2008. В свойствах проекта указано "Компилировать как код С"
      klepa83
      Все достаточно просто!

      char *argv2[] = {"hello.exe", "1", "2", "+"};

      В этом случае argv2 это имя массива. Которое не может использоваться в арифметике указателей. Но имя массива в свою очередь может безболезненно сводиться к указателю на указатель.
      ExpandedWrap disabled
        char** a = argv2;
        ++a;


      И вполне себе работать.
      Во втором случае
      ExpandedWrap disabled
        main(int argc, char *argv[])
        {
            ++argv;
        }


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

      Конечно можно и так писать
      ExpandedWrap disabled
        main(int argc, char **argv)
        {
            ++argv;
        }

      Но первый вариант предпочтителен т.к. мы видим что в качестве аргумента функции передается массив указателей
      Сообщение отредактировано: Большой -
        Большой
        Действительно всё оказалось достаточно просто и понятно :) Я както и забыл, что массив - это не совсем тоже что и указатель, таким образом проблема действительно решается. Спасибо!
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0193 ]   [ 16 queries used ]   [ Generated: 19.09.24, 21:21 GMT ]