Передача по значению:
При передаче данных по значению функции передается копия аргумента. Это означает, что изменения внутри функции не влияют на оригинальные данные.
Пример:
void modifyValue(int value) {
    value = 10;
}
 
int main() {
    int x = 5;
    modifyValue(x);
    // Здесь x все еще равно 5, потому что modifyValue получила копию x
    return 0;
}Передача по ссылке:
При передаче по ссылке функции передается сам объект, а не его копия. Это позволяет функции изменять оригинальные данные.
Пример:
void modifyValueByReference(int& value) {
    value = 10;
}
 
int main() {
    int x = 5;
    modifyValueByReference(x);
    // Теперь x равно 10, потому что modifyValueByReference работает с оригинальным x
    return 0;
}Передача через указатель:
При передаче через указатель функции передается адрес объекта. Функция может изменять данные по этому адресу, но не имеет информации о самом объекте, на который указывает указатель.
Пример:
void modifyValueByPointer(int* ptr) {
    *ptr = 10;
}
 
int main() {
    int x = 5;
    int* ptr = &x;
    modifyValueByPointer(ptr);
    // Теперь x равно 10, потому что modifyValueByPointer изменила значение через указатель
    return 0;
}