Передача по значению:

При передаче данных по значению функции передается копия аргумента. Это означает, что изменения внутри функции не влияют на оригинальные данные.

Пример:

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;
}