Imagina que quieres enviar un paquete a un amigo. Tienes dos opciones: enviarle una copia del contenido (paso por valor) o simplemente decirle dónde recogerlo (paso por referencia). En C, este concepto aplica directamente:
Cuando pasas un valor directamente a una función, esta recibe una copia del dato original. Eso significa que cualquier cambio que se haga dentro de la función no afectará el valor fuera de ella.
Ejemplo:
void incrementar(int x) {
x += 1; // Solo modifica la copia
}
int main() {
int numero = 5;
incrementar(numero);
printf("%d", numero); // Salida: 5
return 0;
}
En este caso, no pasas el valor, sino su dirección de memoria (usando punteros). Así, cualquier cambio dentro de la función afectará directamente al valor original.
Ejemplo:
void incrementar(int *x) {
*x += 1; // Modifica el valor original
}
int main() {
int numero = 5;
incrementar(&numero);
printf("%d", numero); // Salida: 6
return 0;
}
Los arrays y strings son tratados de forma especial en C. Cuando pasas un array como parámetro, lo que realmente estás pasando es un puntero al primer elemento del array. Esto significa que cualquier cambio dentro de la función afectará al array original.
Ejemplo con Arrays:
void modificarArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
arr[i] += 1; // Modifica el array original
}
}
int main() {
int numeros[] = {1, 2, 3};
modificarArray(numeros, 3);
printf("%d", numeros[0]); // Salida: 2
return 0;
}
Ejemplo con Strings:
void cambiarPrimeraLetra(char str[]) {
str[0] = 'X'; // Modifica el string original
}
int main() {
char texto[] = "Hola";
cambiarPrimeraLetra(texto);
printf("%s", texto); // Salida: "Xola"
return 0;
}
Eficiencia y Seguridad al Pasar Parámetros
Cuando trabajes con estructuras grandes o datos sensibles, hay algunas cosas que deberías tener en cuenta:
const
: Si no quieres que tu función modifique los datos, usa const
para restringir los cambios.void imprimirArray(const int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
void imprimirValor(int *ptr) {
if (ptr != NULL) {
printf("%d\n", *ptr);
} else {
printf("Puntero nulo\n");
}
}
A veces necesitas que una función devuelva más de un valor. En estos casos, puedes usar parámetros por referencia para devolver múltiples resultados.
Ejemplo:
void dividir(int a, int b, int *cociente, int *resto) {
*cociente = a / b;
*resto = a % b;
}
int main() {
int coc, res;
dividir(10, 3, &coc, &res);
printf("Cociente: %d, Resto: %d\n", coc, res);
return 0;
}
I am particularly drawn to developing applications that are not only functional but also visually appealing and easy to use. I accomplish this by implementing SOLID principles and clean architecture, and applying testing to ensure quality.