Cuando se pasa una variable a una función, ¿por qué la función solo obtiene un duplicado de la variable?

Cuando se pasa una variable a una función, ¿por qué la función solo obtiene una copia / duplicado de la variable?

int n=1;

void foo(int i)
{
    i++;
}

Como todos sabemos, la función foo () no puede cambiar el valor den utilizando foo (n).

Por supuesto, podemos pasar la dirección de la variable para hacer algún cambio en la variable del parámetro.
¿Pero no crees que es un poco inconveniente?

¿Por qué c / c ++ está diseñado para dar solo un duplicado a la función en lugar de dar directamente la variable "real" a la función?
¿Cuál es el beneficio / beneficio de este paradigma?

Actualizar:
He leído la respuesta de @paxdiablo. Creo que su explicación de "encapsulación, modularidad y localización del efecto" es buena.
Pero a mi manera, también puede preservar el valor del argumento del parámetro. También puede realizar encapsulación. De esta manera: (suponga que la función puede obtener directamente la variable "real" en lugar de un duplicado de forma predeterminada)

void foo(int n)
{
    int temp=n;
    //Do something to temp...

}

Y a mi manera,El mecanismo complicado, como "pasar por referencia" o puntero puede eliminarse cuando quiera cambiar el valor de los parámetros pasados. Ese es el beneficio.

Después de un tiempo de pensamiento. ¡Me doy cuenta de que la razón por la que c / c ++ no está diseñado como lo propuse es solo por la INCONVINIENCIA de mi camino!
A mi manera, si una función tiene una larga lista de variables, sería terrible. Lo que creo que es la forma más conveniente es de hecho inconveniente:
Debes escribir así:

void foo(int a,int b,double c,float d,char s...)
{
    int temp1=a;
    int temp2=b;
    double temp3=c;
    float temp4=d;
    char temp5=s;
    ...
    //Do something to temp{1,2,3,4,5....}

}

Así que los diseñadores de c / c ++ introducen un mecanismo complejo para intercambiar con comodidad.
Estoy en lo cierto?

Respuestas a la pregunta(8)

Su respuesta a la pregunta