2012-02-11 6 views
0

Я решала последние годы GATE вопрос бумаги, где я застрял с этим вопросомПроблема с указателями массивов в C

Что делает следующий фрагмент C-программы печати?

char c[]="GATE2011"; 
char *p =c; 
printf ("%s", p+p[3]-p[1]); 

Ответ «2011»

Я знаю, что в с, переменные массива являются указатель на первый адрес массива. Моим логическим ответом был «E2011», но выход

Может кто-нибудь объяснить, что в этом участвует математика-указатель?

+0

Я думаю, что вам нужно перечитать свою книгу по указателям. Вы смешиваете арифметику указателей с символами. Это приведет к возникновению всех проблем в будущем, если вы спуститесь по этому маршруту. –

+0

@EdHeal Это был экзамен (GATE). надеюсь, не какой-нибудь производственный код! –

ответ

3

р [3] = A

р [1] = Е

Е - А = 4

следовательно, p + 4 = адрес от 2

отсюда распечатывается 2011

+0

спасибо. я провел время в сложных решениях и забыл о том, чтобы взглянуть на основы. Теперь я запомню это решение. –

+0

без проблем. удачи в вашем экзамене и связанных с ним действиях –

7

Эта проблема имеет много больше, чем ASCII values, чем с указателями.

p[3] == 'E' == 69 (decimal) 
p[1] == 'A' == 65 
p[3]-p[1] = 4 

p+4 = A string starting at the 4th character. 

p[] = [0] [1] [2] [3] [4] [5] [6] [7] [8] 
     G A T E 2 0 1 1 \0 

Следовательно, р [4] =

+3

Ну, это немного * о указателях. :) – Duck

+2

Ну, это о * смешении * указателей и значений ASCII :) –

+0

спасибо .. Я провел вчера вечером манипулирование адресами, я полностью забыл о значениях ASCII. –

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