Много вопросов ... пытаются захватить ответы на каждый:
/* делает * ул = опал или делает * ул = о, так как ул указатель символьного типа? */
*str
является 'o'
, поскольку он указывает на первый символ
/* В чем разница между полукокса * конец и полукокса * конец? и теперь кончик указывает на опал?*/
Там нет никакой разницы между char *end
и char* end
. Это становится сложнее, когда вы пишете
char* a, b;
, поскольку это эквивалентно
char *a, b;
и нет, как вы могли бы подумать
char *a, *b;
Вот почему чище писать char *end;
.
И end
указывает на opal
сейчас - *end
is 'o'
.
если (str) {/ * если str не является нулевой? */
Да - тестирование, что вы не получили передается указатель NULL
Чтобы проверить, что вы не получили передается строка длины 0, вы должны проверить *str
(после тестирования, что str
не NULL, в противном случае вы получите ошибку сегментации для "осмеливаясь смотреть на * NULL")
время (ул < конец) {/ * почему не * ул < * конец? это вопрос, когда o < l? */
Тестирование указателей - один движется к концу, а другой движется назад. Когда вы встречаетесь посередине, вы останавливаетесь; в противном случае вы своп в два раза, и не будет никакого чистого эффекта ...
*str++ = *end; /* what is the difference between *str++ and ++str? does *str++ = l? */
Сначала скопируйте значение *end
в *str
, то увеличиваем str
указатель. Если вы положили ++str
, вы сначала увеличиваете его, а затем используете. И это будет означать, что вы положили l
вместо p
вместо вместо o
.
редактировать один критический анализ на вашем коде (выходит за рамки вопросов, которые вы просили, и в ответ на комментарий от @chux): когда вы проверяете для if(str){}
вам действительно нужно else return;
заявление, так как вы на самом деле end--;
, а затем использовать *end
. Удостоверьтесь, что 0xFFFFFFFFFFFFFFFF
почти всегда является недопустимым адресом ...
Если вы на самом деле тестировали if(*str!='\0')
, тогда вы все равно должны просто вернуться (пустая строка является «необратимой» - или, скорее, ей ничего не нужно считаются обратными).
Кстати, я предпочитаю сделать условие явным (например, я сделал именно тогда); он не только показывает ваше намерение более четко, но компилятор может на самом деле жаловаться, если вы сделали if(str!='\0')
или if(*str != NULL)
, поскольку типы, которые вы сравниваете, несовместимы. Это означает, что у вас будет более надежный, более читаемый код и, скорее всего, сделайте то, что вы намеревались.
Если вы буквально передаете «опал», это будет неопределенное поведение, так как вам не разрешено изменять строковый литерал. –
@ShafikYaghmour, что бы вы тогда прошли? – Opal
Массив символов, 'char arr [] =" opal ";'. –