21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
|
||||||
1 | ||||||
Указатели в массиве25.09.2012, 10:44. Показов 742. Ответов 19
Метки нет (Все метки)
В книжке нет описания к данному коду и мне немного не понятно в некоторых моментах: 1). while (*p) { (не понятно какое условие понимается под *p) 2). while(*p!=' ' && *p) { (*p!= ' ' - это понятно, что если будет пробел, а вот && *p - это что за условие?)
Ответьте пожалуйста на мои вопросы и напишите краткое описание того, как работает программа, у меня в голове немного не укладывается что заем и почему.
0
|
25.09.2012, 10:44 | |
Ответы с готовыми решениями:
19
Указатели в массиве Указатели в строчном массиве Указатели в двумерном массиве Указатели на объекты в массиве |
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
|
||||||
25.09.2012, 10:46 | 2 | |||||
указывать на 0, в С++ 0 тождественно равен False
но p у тебя указывает на тип char и там
фактически проверяется конец строки и программа выводит по отдельности разделенные пробелом символьные массивы("слова") до конца строки
1
|
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
|
|
25.09.2012, 10:49 [ТС] | 3 |
Вы имеете ввиду первый вопрос как я понял. Т.е. конструкция типа while(*p) { - проверяет нет ли конца строки, т.е. знака \0 в конце, если есть то прекратить?
0
|
2276 / 1767 / 741
Регистрация: 27.07.2012
Сообщений: 5,250
|
|
25.09.2012, 10:50 | 4 |
*p - разыменовывание указателя p. Разыменовывая указатель, мы получаем значение той переменной, на которую он указывает. Отсюда while (*p) будет работать (в цикл будет заходить), пока то, на что указывает p будет отличным от нуля.
*p - опять же, то же самое, что и выше. Условие: то, на что указывает p, не равно пробелу и отлично от нуля. Здесь работа со строкой. Строки в С должны заканчиваться символом 0. Вот на него проверка и делается. Возможно, будет понятнее, если условия с *p заменить на (*p != '\0').
1
|
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147
|
|
25.09.2012, 10:52 | 5 |
судя по всему p - это адрес, на который указывает указатель. Таким образом while (*р) означает "пока есть какое-то введенное значение str". Хотя я сам ничего теперь не понимаю =) Зачем пишется while(*p!=' ' && *p), если достаточно while(*p!=' ') на мой взгляд, ведь этот цикл уже вложен в первый цикл, в котором второе условие уже проверено while (*р). И что означает q = token; интересно, если q ничего не присвоено, то что присваивается token? Возможно это только часть программы в примере книжки? =) Либо я тугодум =D
0
|
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
|
|
25.09.2012, 10:54 | 6 |
*p - разыменовываем указатель, получаем значение.
В условных операторах любое значение отличное от нуля дает true. Добавлено через 1 минуту while(*p!=' ' && *p) выполняется внутри цикла while (*р). Так что во избежание проблем по достижению конца строки тут тоже нужно проверять на нуль символ
0
|
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147
|
|
25.09.2012, 10:56 | 7 |
А поясните плз почему так надо? Разве первым циклом не проверится достижение нуль символа? Если достигнет конца строки то оно и не даст пройтись вложенному циклу.
0
|
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
|
||||||
25.09.2012, 10:58 | 8 | |||||
Простой пример:
2
|
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147
|
||||||
25.09.2012, 11:05 | 9 | |||||
непонятно ничего=(
0
|
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
|
|
25.09.2012, 11:05 [ТС] | 10 |
Теперь стало ясно как работает программа. Всем спасибо, вопрос исчерпан.
0
|
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
|
||||||
25.09.2012, 11:08 | 11 | |||||
Fooly, если ты уберешь это условие то
1
|
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147
|
||||||
25.09.2012, 11:15 | 12 | |||||
Мне вообще ничего не понятно теперь Поясните мне всё
0
|
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
|
||||||
25.09.2012, 11:17 | 13 | |||||
Fooly, я же вверху ответил посмотри внимательно
1
|
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147
|
|||||||||||
25.09.2012, 11:18 | 14 | ||||||||||
Т.е сразу первый цикл проверяет не по одному символу, а сразу загружает весь массив? Если так, то понятно. А я думал по одному символу проверяет из массива. Или я опять неправильно понял?
ЗЫ оно же по одному всё-таки символу проверяет начиная с нулевого. Тогда почему не написать
0
|
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
|
||||||
25.09.2012, 11:27 | 15 | |||||
первое условие проверяет конец всей строки , второе проверяет конец строки + конец отрезка строки "слова" разделеного пробелом ' ' для того чтобы обновить q
Fooly, есть такая клевая штука дебаг режим , пока твой мозг не стал компилятором кода используй его и проверяй все что происходит, в будующем если ты будешь усложнять код и не понимать что там происходит , будешь разбивать его на части , и также дебагом пробегать , пока твой мозг не станет компилятором
1
|
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147
|
|||||||||||||||||||||
25.09.2012, 11:36 | 16 | ||||||||||||||||||||
Так, я практически всё понял кроме одного... так сказать
Допустим у нас записан массив "stasik mihajlov/0" Первый цикл
Когда же доходим до "/0", то мы не входим даже в цикл. И вообще цикл закончится на этом. Правильно? =) Так вот... Хоть убейте, но я не понимаю зачем нам проверять
И более того, я не понимаю зачем тут цикл while, если правильнее (на мой взгляд) будет иф
Извиняюсь, что я туплю, но я хочу полностью понять это ситуацию, чтобы больше не возникало вопросов =) PS сейчас всё прокомпилирую, и если разберусь, то сниму все вопросы, а пока убирать свои дотошные вопросики убирать отсюда не буду
0
|
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
|
|||||||||||
25.09.2012, 11:48 | 17 | ||||||||||
не верно посмотри внимательно где у тебя инкримент p он какраз внутри цикла
1
|
21 / 17 / 4
Регистрация: 26.03.2012
Сообщений: 147
|
||||||
25.09.2012, 11:55 | 18 | |||||
Что загружает
0
|
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
|
|||||||||||
25.09.2012, 12:51 | 19 | ||||||||||
Добавлено через 9 минут Т.е. если p = {'a', 'b', '\0'}, то *p указывает на 'a'
1. Строка 1: разыменовываем указатель *p = 'a', значение отличное от нуля поэтому выполняем итерацию цикла 2. Строка 2: *p != ' ' и *p != 0 (т.к. *p='a'). Выполняем итерацию вложенного цикла 3. Строка 3: смещаем указатель p. p теперь указывает на 'b' 4. Строка 4: конец итерации вложенного цикла 5. Строка 2: *p != ' ' и *p != 0 (т.к. *p='b'). Выполняем итерацию вложенного цикла 6. Строка 3: смещаем указатель p. p теперь указывает на '\0' 7. Строка 2: *p != ' ' и *p == 0 (т.к. *p='\0'). Закончить выполнение вложенного цикла 8. Строка 5: *p == 0 (т.к. *p='\0'). Не входим в true-блок. 9. Строка 6: конец итерации главного цикла. 10. Строка 1: *p == 0 (т.к. *p='\0'). Закончить выполнение главного цикла
2
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
25.09.2012, 13:11 | 20 |
0
|
25.09.2012, 13:11 | |
25.09.2012, 13:11 | |
Помогаю со студенческими работами здесь
20
Указатели в двумерном массиве Указатели в массиве на сортировку Как использовать указатели в массиве Как использовать указатели в двухмерном массиве Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |