#c #pointers
#c #указатели
Вопрос:
char foo[] = "something";
char *p = foo;
Есть ли способ изменить указанное значение и увеличить указатель на следующий элемент, используя только один;?
Я имею в виду, сделать эффект этих 2 строк ниже в одном операторе?
*p = 'S';
p ;
Комментарии:
1. Хотя выполнение того, что вы намереваетесь сделать, может показаться необычным, это не улучшает читабельность. Есть несколько ситуаций, с которыми я бы согласился при проверке кода.
2.
*p = 'S'; p ;
это уже канонический код. Любое его изменение сделает программу менее читаемой и потенциально менее безопасной, поскольку смешивание с другими операторами — плохая и опасная практика.
Ответ №1:
Комментарии:
1. Как сказал @Lundin ниже, я не думаю, что круглые скобки являются идиоматическими.
Ответ №2:
Это сделает свою работу :
*p = 'S';
Ответ №3:
Кроме того, если вы хотите сначала увеличить и получить следующее значение:
* p = 'o';
Как вы можете видеть, среди всех ответов у вас есть выбор: либо
(1) разыменование, затем увеличение указателя:
*p = 'S';
или
(2) увеличить указатель, затем разыменовать:
* p = 'o';
И то, и другое можно использовать по мере необходимости в качестве приращений цикла, тестов и в различных других контекстах.
Комментарии:
1. Как мы можем судить по скобкам в первой строке, этот код недоступен для чтения. Скобки на самом деле совершенно излишни, но поскольку вам удалось запутать себя, запутав код, вы все равно ставите туда скобки. Итак, все, что вам удалось, — это написать код, который вы не знаете, как он работает. Гораздо лучший способ написать тот же код
p ; p = 'o';
2. Я ненавижу, когда это происходит. Обновлено, чтобы удалить лишнюю запутанность.
3. Я хотел сказать, что весь этот ответ вместе с другими является излишним запутыванием и без того идеального кода.
Ответ №4:
*p = 'S';
p ;
Это уже оптимальный код. Вы не можете улучшить читаемость, безопасность, производительность или удобство обслуживания этого кода, изменив его.
Если вы настаиваете на его изменении без какой-либо разумной причины, то, конечно, вы можете это сделать:
??=define BORK ;
??=define BOINK *
??=define SPLURK
??=define SPROING =
BOINK p SPROING 'S' BORK p SPLURK BORK
Это действительно плохой код. Я уверен, что другие также будут рады предоставить больше таких примеров кода, который намного хуже того, что у вас уже было.