2013-05-28 2 views
2

Я пытаюсь выяснить, как работает этот код, может ли кто-нибудь помочь мне запустить процессы, происходящие здесь: Как то, что делает *(++cp)? В моем сознании я думаю его = str + 7 И *oddNums = 1 начало массива oddNums. , так что str + 8 после математики, которая = ld Извините, я действительно не понимаю.печать с помощью указателей

int main() 
{ 
    int oddNums[5] = {1, 3, 5, 7, 9}; 
    char str[20] = "Hello world"; 
    int *ip = oddNums; 
    char *cp = str + 6; 

    printf("\n.%c",*(++cp) + *oddNums); 


    return EXIT_SUCCESS; 
} 
+0

Он нуждается в '#include ' и '#include '. –

ответ

9
printf("\n.%d",*(++cp) + *oddNums); 

Перерыв вниз. Это эквивалентно: приращения первого утверждения

++cp; 
printf("\n.%d", *cp + *oddNums); 

The cp так теперь cp == str + 7. Замена cp в модифицированных выходах PRINTF:

printf("\n.%d", *(str + 7) + *oddNums); 

*(str + 7) таким же, как str[7], который является одиночным символом 'o'. *oddNums равно 1. Выполнение одной заключительной подстановки дает:

printf("\n.%d", 'o' + 1); 

Он печатает символ 'p'. Вернее, он печатает значение ASCII 'p' , так как у нас есть формат %d, а не %c.

+1

+1 с (по общему признанию, смешной) nitpick: он печатает десятичное значение ''o' + 1' в любом символе, установленном для использования компилятором/системой. Скорее всего, ASCII. –

+0

Да, он предназначен для печати персонажа. Он должен быть математикой ASCII. 'o' + 1 = 'p' –

3
int oddNums[5] = {1, 3, 5, 7, 9}; 

Это создает массив из 5 int с. Если вы обратитесь к oddNums[2], это даст вам 5. Если вы ссылаетесь на oddNums, это указатель на int, который указывает на начало массива. Так что *oddNums даст вам 1, *(oddNums+1) даст вам 3 и так далее.

char str[20] = "Hello world"; 

См. Мои обсуждения около oddNums, которые применимы здесь. Это также строка, которая означает, что она заканчивается нулем после буквы d.

int *ip = oddNums; 

Помните oddNums является указателем на целое число. Таким образом, это просто копирует его другому указателю int под названием ip.

char *cp = str + 6; 

Это присваивает значение (str + 6) к char указателя cp. str является указателем char, указанным выше. Он указывает на начало строки «Hello world».

printf("\n.%d",*(++cp) + *oddNums); 

*(++cp) означает получить то, что cp указывает на послеcp было увеличено. Другими словами, preincrementcp, а затем получить то, на что он указывает. cp указывал на str + 6, который был w в строке.Но ++cp указывает на «o» в «мире». Таким образом, *(++cp) даст «o».

Затем 'o' добавляется к чему-либо oddNums указывает на. Ничего не случилось с oddNums, так как мы начали, поэтому он все еще указывает на 1 в массиве integer. *oddNums говорит «дайте мне то, что oddNums указывает на», который является 1.

Таким образом, значение *(++cp) + *oddNums будет 'o' + 1, что «р» (следующая буква в последовательности ASCII).

Интересно, что printf говорит, что «напечатать то, что вам дано как целое число после печати строки и периода» («\ n.% D»). Поэтому результат будет ... .112. Я думаю.

+0

(Отредактировано для исправления форматирования и опечатки) – lurker

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