Ваш первый фрагмент кода был
char * c = "test";
*c++;
putchar(*c);
и, как вы заметили, он печатает e
. Но важно отметить, что во второй строке *
совершенно лишний. Вы увеличили c
, и , извлекли указатель на символ - и затем выбросили указатель на символ.
Это работало бы точно так же - и было бы более понятным, без запутанных, лишних операторов - если бы вы вместо этого сказали
char * c = "test";
c++;
putchar(*c);
Затем вы задались вопросом, почему вы не можете увеличить указатель на 2. Но, конечно, вы можете увеличить указатель на два - вы можете либо сказать
char * c = "test";
c++;
c++;
putchar(*c);
или
char * c = "test";
c += 2;
putchar(*c);
или
char * c = "test";
c = c + 2;
putchar(*c);
Но вы написали
c = *c + 2;
Это не сработало, и неудивительно - опять же, у вас есть ненужное *
, и здесь это не так безобидно. Здесь вы без необходимости извлекаете символ, на который указывает c
, но вместо того, чтобы выбросить его, вы добавляете к нему 2, , а затем пытаетесь присвоить символ исходной переменной указателя . Ваш компилятор, вероятно, жаловался на это - назначение символа указателю не имеет смысла. Это как если бы вы сказали
c = 'x';
Похоже, вы не уверены, что означает *
в C. Это , а не просто маркер, который говорит, что «эта переменная является указателем». Это оператор, который активно выбирает значение, на которое указывает указатель.
Всякий раз, когда вы работаете с указателями, вы должны помнить очень важное различие между значением указателя и значением, на которое указывает указатель .
Возвращаясь к исходному примеру, когда вы сказали
char * c = "test";
значение указателя c
- это «указатель на первый символ строки», а значение, на которое указывает указатель, - «символ t
».
Если вы скажете
c++
Вы увеличиваете значение указателя. Теперь он указывает на второй символ строки, а указанным значением является символ e
.
Если c
является указателем, то всякий раз, когда я сам упоминаю c
в выражении, я ссылаюсь на значение указателя. Но всякий раз, когда я вставляю перед оператором *
, я ссылаюсь на значение, на которое указывает указатель.