Один из способов чтения указателей и ссылок состоит в том, что во время деклараций «*» можно заменить на «что-то, на что указывает». Итак:
int* a;
Означает, что «a» - это то, что указывает на целое число (т. Е. «A» - указатель).
В других местах кода (не объявлениях), «*» можно заменить на «вещь, на которую указывает». Итак:
*a = 5;
Означает, что «вещь, на которую указывает« а », становится равной 5». Т.е. целое число, на которое указывает точка, теперь равно 5.
В вашем первом блоке кода «a» - это просто целочисленный тип. когда вы пишете fun c (& a);, вы передаете адрес 'a' (то есть имя ячейки памяти, в которой хранится значение 'a') функции. Функция ожидает тип int * (что-то, указывающее на int), и это именно то, что вы ему дали.
В функции 'a' - это просто адрес вашей переменной. Затем функция берет этот адрес и говорит: «увеличивайте значение, на которое указывает« а ».
Во втором блоке кода« а »снова является целочисленным типом. На этот раз, однако, функция ожидает ссылочную переменную (потому что определение функции ожидает int & type.
Таким образом, внутри функции 'a' является исходной переменной, а не копией или указателем на оригинал переменная. Функция говорит «увеличить фактическое целое число, которое было отправлено».
Подробнее