2017-02-12 5 views
-2
#include<stdio.h> 

int main() 

{ 
    char *p; 
    p="%d\n"; 
    p++; 
    p++; 
    printf(p-2, 400); 
    return 0; 
} 

Когда я запускаю код выше, я получаю вывод 400. Но почему 400?Какой будет выход следующей программы C

+1

Что еще вы ожидали получить и почему? –

+0

На самом деле я больше не знал о синтаксисе функции printf(). Поэтому я не понимаю, что происходит в моем коде. –

ответ

2

printf() Первый параметр - это строка формата. Переменная p является указателем на массив символов, который также представлен в виде строк.

Когда p присваивается строка "%d\n", она указывает формат целого числа, чтобы напечатать его значение, а затем напечатать символ возврата каретки.

С p является указателем на символ p++ означает перемещение указателя вперед 1 символ. Это делается дважды, чтобы переместить p вперед 2 символа, чтобы он указывал на начало символа возврата каретки. p-2 говорит, что делает указатель математике, чтобы дать char* 2 символа перед тем, где p баллов.

Это начало строки возврата каретки %d. Это становится строкой формата, а второй параметр 400 заменяет %d и печатает сам, за которым следует возврат каретки.

3

p сначала назначается строка форматирования. Затем он уменьшается на 1 два раза. Наконец, его значение минус два передается в printf с дополнительным параметром 400.

Вычитание 2 из последнего значения p возвращает его к исходной строке форматирования. И поэтому printf печатает значение 400.

+0

Спасибо @Zbynek. Я понял. –

1

Вы указали указатель на строку и присвоили ей значение "%d\n". Этот указатель содержит адрес в памяти.

Например, позволяет сказать, что он указывает на адрес 6 при добавлении к нему два (которые вы не должны делать вам, что вы всегда должны знать, где ваши указатели указывают), вы измените адрес до 8.

Теперь, когда вы делаете printf, вы заменяете его на текущее значение адреса p указывает на (8) минус 2, который равен 6.

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