2013-05-19 5 views
-1

пример кода, как это:Как заканчивается этот цикл?

#include<stdio.h> 
void main() 
{ 
    char *s={"abcd"}; 
    do { 
     printf("%d\n",++s); 
    } while(*s); 
} 

Где указателя ТОЧКА, когда цикл заканчивается у Как это работает?

+0

Что говорит вам ваш printf? – CppLearner

+1

'' указывает на 0 байт после '' d'', когда цикл заканчивается. –

+1

Кстати, вы не должны использовать '% d' для указателя в' printf'. Если вы хотите распечатать значение указателя, используйте '% p'. – Inspired

ответ

4

В C нуль эквивалентен false. Поэтому, когда *s указывает на символ терминатора в строке (ноль), цикл останавливается.

3

«abcd» хранится в памяти в 5 последовательных байтах: 'a' 'b' 'c' 'd' '\0'.

Последний байты, ноль, завершает цикл, так как ноль ложен в С.

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. 
} 
+0

Спасибо, но почему результат остается постоянным, когда я изменяю abcd на другие четыре символа? –

+0

@ Z-Cao Он печатает адрес символов. Адрес может или не может измениться. Не имеет значения, на какой символ он указывает. Для печати символа используйте 'printf ("% c \ n ", * s);'. – ShuklaSannidhya

Смежные вопросы