2015-10-25 4 views
-5
char alpha[] = "abcdefghi"; 
    char ch[80], *pch = &ch[0]; 
    strcpy(ch, alpha); 
    putchar(*pch++); 
    putchar((*pch)++); 
    putchar(*++pch); 
    putchar(++(*pch)); 
    printf("\n%s", ch); 

Почему функция putchar печатает 'a' 'b' 'c' и 'd' соответственно? Почему printf ("\ n% s", ch); распечатать acddefghi? Я действительно плохо с указателем.Указатель на выходной сигнал указателя

+0

Домашнее задание :( –

+0

«Если вы действительно плохи с помощью указателей», я предлагаю серьезно сесть и получить книгу K & R, прочитать ее, прочитать, если вы все еще не получите ее, отлаживаете зайдите в него, посмотрите на значения указателей, продолжайте перечитывать их, пока не получите момент лампочки. C преуспевает в силе и простоте указателей. – t0mm13b

ответ

1

ОК, я попытаюсь объяснить это как можно проще.
Когда вы это сделаете: putchar (* pch ++), что вы говорите, «напечатайте этот символ адреса, на который указывает pch, а затем увеличивайте pch, чтобы указать на следующий адрес». По существу, перед первым putchar(), * pch = 'a' и после * pch = 'b' (потому что pch теперь указывает на ch [1]).

Теперь, во втором putchar(), что вы говорите: 'напечатайте символ в адресе, на который указывает pch, а затем увеличивайте значение CHARACTER по этому адресу на 1'. Итак, вместо того, чтобы делать то, что вы делали во втором putchar(), вы могли бы заменить эту строку на эти две строки:
putchar(*pch); // 'b' *pch += 1; // see, you increment the value(notice the *), not the pointer.

Однако, поскольку, как я уже сказал, он увеличивает знак ПОСЛЕ второго putchar(), он просто печатает то, что было, что «b». Итак, просто чтобы очистить, после второго putchar(), ch [0] = 'a' (мы ничего не изменили в этом значении) и ch [1] = 'c' (мы увеличили значение символа на 1 и 'b' + 1 = 'c'). Остальное не изменилось, поэтому ch [2] = 'c', ch [3] = 'd' и т. Д. Но pch указывает на ch [1]
Теперь, в третьем putchar(), вы что-то делаете аналогично с первым исключением того, что вы первый увеличиваем адрес, PCH точки, а затем напечатать значение этого address.So, вы могли бы заменить третье putchar() с этими двумя линиями:

pch++; // increment the pointer by one, it now points to ch[2], which is 'c'(it remained unchanged) putchar(*pch); // 'c'

Таким образом, после третьего putchar(), ch [0] = 'a' (осталось неизменным), ch [1] = 'c' (изменено во втором putchar()), ch [2] = 'c' (осталось неизменным)

Наконец , в последнем putchar() то, что вы делаете, похоже на второе, за исключением того, что вы увеличиваете значение CHARACTER, которое указывает pch, прежде чем вы его распечатываете. Помните, что PCH указывает на сп [2] Таким образом, вы могли бы заменить последнюю putchar() с этими двумя линиями:

*pch += 1; // 'c' + 1 = 'd' putchar(*pch); // 'd'

Итак, после 4 putchars, ч [0] = 'а' (он остался неизменным), ch [1] = 'c' (изменено во втором putchar()), ch [2] = 'd' (изменено в четвертом putchar()) и ch [3] = 'd' (он остался неизменным), а остальная часть строки остается неизменной, и я думаю, теперь очевидно, почему вы получаете результат, полученный от printf().

0

ch - это массив символов. В C массив - это просто указатель на первый элемент массива. Это делает ch указателем на char (char *). putchar печатает один символ, когда вы передаете ему символ для печати. * pch ++ говорит: «используйте символ по этому адресу», а затем увеличивайте адрес до следующего символа. printf печатает всю строку из-за спецификатора формата «\ n% s», который сообщает printf напечатать массив символов (строка, если вы это сделаете), которая найдена по адресу ch. Что мы знаем выше, это массив символов. Надеюсь это поможет.

0

разыменовывает указатель и возвращает обратно значение «а», то указатель увеличивается на 1.

putchar(*pch++); 

То же, что первое объяснение выше. Возвращает «b».

putchar((*pch)++); 

Приращает указатель, затем разыскивает его, возвращаемое значение - «c».

putchar(*++pch); 

Как и предыдущий, возвращается значение 'd'.

putchar(++(*pch)); 

Приращения/сокращения указателя основаны на типе объявленной переменной.

С ch объявлен массив символов, printf распечатывает все содержимое этой переменной.

strcpy(ch, alpha); 

Скопируйте содержимое alpha в массив ch, т.е. «ABCDEFGHI»

распада Все «массивы» в указатели, указывающие на первый элемент типа Т. (Они не являются на самом деле массивы!)

0

*pch++ печать текущее значение указателя и приросты указатель

(*pch)++ печати текущего значение указателя, и приращение, которые ценят

*++pch Это увеличивает указатель и значение печати нового указателя

++(*pch) Это увеличивает значение текущего указателя, а затем распечатать, что новое значение

putchar(*pch++);  // It prints ch[0], print and increments pointer 
putchar((*pch)++); // It prints ch[1], print and increment value; 
putchar(*++pch);  // It prints ch[2], pointer increments and print 
putchar(++(*pch)); // It prints ch[2]+1, increment value and print 
0

значения адресного адреса Адрес местонахождения
значение data означает значение по этому адресу

Подумайте об этом так:
Что бы ни следует после * - это адрес.
Например: * x, здесь значение x является адресом.
И когда вы комбинируете * и x i.e. * x, он представляет значение по этому адресу.
Всякий раз, когда вы делаете * p ++, значение p (которое является значением адреса) должно увеличиваться в зависимости от типа данных указателя. Таким образом, он укажет на следующий блок адреса. Он не будет увеличивать значение данных.

В C указатель char указывает на адрес первого массива и печатает весь массив до получения нулевого символа.

Смотрите лекции по указателю. Вы будете понятны.

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