
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.121.38] |
![]() |
|
Сообщ.
#1
,
|
|
|
Изучаю книгу Кернингана и Ритчи "Язык программирования С", при выполнении упражнения возник вопрос. Не могу понять почему при компиляции возникает ошибка в коде:
![]() ![]() main() { int argc2 = 4; char *argv2[] = {"hello.exe", "1", "2", "+"}; ++argv2; //error C2105: для "++" требуется левостороннее значение } В нижепреведённом коде ошибки не возникает: ![]() ![]() main(int argc, char *argv[]) { ++argv; } Никак немогу понять в чём разница и почему один код работает, а другой - нет. Компилирую в Microsoft Visual Studio 2008. В свойствах проекта указано "Компилировать как код С" |
Сообщ.
#2
,
|
|
|
klepa83
Все достаточно просто! char *argv2[] = {"hello.exe", "1", "2", "+"}; В этом случае argv2 это имя массива. Которое не может использоваться в арифметике указателей. Но имя массива в свою очередь может безболезненно сводиться к указателю на указатель. ![]() ![]() char** a = argv2; ++a; И вполне себе работать. Во втором случае ![]() ![]() main(int argc, char *argv[]) { ++argv; } argv это аргумент функции переданный по значению (т.е мы имеем копию указателя), что фактически означает что это указатель на указатель. и с ним работать вполне можно. Конечно можно и так писать ![]() ![]() main(int argc, char **argv) { ++argv; } Но первый вариант предпочтителен т.к. мы видим что в качестве аргумента функции передается массив указателей |
Сообщ.
#3
,
|
|
|
Большой
Действительно всё оказалось достаточно просто и понятно ![]() |