пример кода, как это:Как заканчивается этот цикл?
#include<stdio.h>
void main()
{
char *s={"abcd"};
do {
printf("%d\n",++s);
} while(*s);
}
Где указателя ТОЧКА, когда цикл заканчивается у Как это работает?
пример кода, как это:Как заканчивается этот цикл?
#include<stdio.h>
void main()
{
char *s={"abcd"};
do {
printf("%d\n",++s);
} while(*s);
}
Где указателя ТОЧКА, когда цикл заканчивается у Как это работает?
В C нуль эквивалентен false
. Поэтому, когда *s
указывает на символ терминатора в строке (ноль), цикл останавливается.
«abcd» хранится в памяти в 5 последовательных байтах: 'a' 'b' 'c' 'd' '\0'
.
Последний байты, ноль, завершает цикл, так как ноль ложен в С.
Прежде всего, вы не должны использовать %d
для форматирования указателя, то для целых чисел, а не для указателей. Вместо этого используйте %p
.
Это линии-
char *s={"abcd"};
инициализирует строку с '\0'
в качестве последнего символа.
Ваши программы проходят через каждый символ (от 2-го до последнего) строки и печатает адрес, где они хранятся в памяти. Поскольку это цикл do-while
, проверка состояния выполняется после выполнения тела цикла.
ПРИМЕЧАНИЕ: не печатает адрес первого символа because-
printf("%d\n",++s);
этой линии (за счет прироста приставкой) получает приращение указатель на следующий символ, прежде чем передать его значение printf
. Поэтому, когда тело цикла выполняется в первый раз, печатается адрес второго символа (b
).
Теперь условие части цикла проверяет, отличен ли символ в указанном s
(символ может называться *s
) отличен от нуля.
Поскольку строка имеет '\0'
как последний символ (который имеет целочисленное значение 0
), цикл завершается, когда он достигает последнего символа.
Выход вашей программы (с %d
изменен %p
) будет что-то вроде но НЕ точно такой же как-
0x40061d
0x40061e
0x40061f
0x400620
Обратите внимание, что только 4 адреса печатаются (от 'b'
до '\0'
, адрес 'a'
не печатается). Для этого вы должны попробовать это -
#include<stdio.h>
main()
{
char *s={"abcd"};
do {
printf("%p\n",s++);
} while(*s);
printf("%p\n", s); // to print the address of the '\0' character.
}
Спасибо, но почему результат остается постоянным, когда я изменяю abcd на другие четыре символа? –
@ Z-Cao Он печатает адрес символов. Адрес может или не может измениться. Не имеет значения, на какой символ он указывает. Для печати символа используйте 'printf ("% c \ n ", * s);'. – ShuklaSannidhya
Что говорит вам ваш printf? – CppLearner
'' указывает на 0 байт после '' d'', когда цикл заканчивается. –
Кстати, вы не должны использовать '% d' для указателя в' printf'. Если вы хотите распечатать значение указателя, используйте '% p'. – Inspired