Почему оператор ++ увеличивает целое число на 4, а не на 1?

У меня есть простой код в Objective-C, который состоит из кнопки и метки. Когда вы нажимаете кнопку один раз, на этикетках отображается: «u hit me», если вы нажмете дважды, сообщение будет: «Я сделал это снова». Но, если u нажимает кнопку 5x или более, сообщение должно быть: «STOP THAT»;

Я использовал простой, if s и счетчик, который увеличивается с помощью оператора ++ . Проблема в том, что мой счетчик увеличивается с шагом 4, а не с шагом один.

Вот код

 @implementation hitMe NSString *myString = @""; int *counter = 0; - (IBAction)htM:(id)sender { if ([myString isEqualToString:@""]){ //first hit myString = @"u hit me"; } else { // second and next hits... myString = @"u did it again!"; counter++; } // if I use "counter > 5" it doesn't work, // I have to use 21 if I want the button hit 5 times before // I get the "STOP THAT" message if (counter > 21) { myString = @"STOP THAT "; } [labelOne setStringValue:myString]; // I used this only to check the count value [labelTwo setIntValue:counter]; } @end 

Переменная, которую вы увеличиваете, counter , является указателем на int, а не int. Итак, компилятор поворачивается:

 counter++; 

в

 counter += 4; // sizeof(int) == 4 

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

Измените int *counter на int counter и все будет в порядке.


Редактировать: спецификация языка C определяет арифметику указателя (что происходит, когда вы добавляете или вычитаете с помощью указателей) таким образом, потому что наиболее распространенное использование математики указателя – это перемещение по массиву, на который вы указываете. Таким образом, одна единица приращения для указателя – это одна единица массива, или sizeof(arrayType) . Символ * дал бы вам поведение, которое вы ожидали, потому что sizeof(char) равен 1.