Demostración de porque los punteros se pasan a función por valor.[C]

Iniciado por NOB2014, 22 Mayo 2016, 18:10 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola gente.
No quería molestarlos por esta nimiedad pero en realidad no logro realizar el código correcto para demostrarlo, en todos los manuales dice que los punteros se pasan a las funciones por valor, ¿es este un Ej. correcto para demostrarlo? porque estoy pasando el puntero y en main se modifica el valor al pasar un puntero a la función, y en el otro caso es correcto porque estoy pasando la variable "a" por referencia pasando la dirección de memoria.-

#include <stdio.h>
#include <stdlib.h>

void funcionCp(int *q);
void funcionDm(int *q);


int main( void ){
int a=100, *p = &a;

funcionCp(p);

printf("\n Variable *p = %d", *p);

funcionDm(&a);

printf("\n Variable *p = %d", *p);

return 0;
}

void funcionCp(int *q) {
*q+=1;
}

void funcionDm(int *q) {
*q+=1;
}


Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

engel lex

no entendi la explicación inicial

Citarporque estoy pasando el puntero y en main se modifica el valor al pasar un puntero a la función, y en el otro caso es correcto porque estoy pasando la variable "a" por referencia pasando la dirección de memoria.-

no entiendo el conflicto, pasar por referencia es una manera discreta de pasar un puntero, incluso ves que *p=&a es decir perfectamente se puede ver que es lo mismo pasar *p que &a
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

AlbertoBSD

El valor de un apuntador es la direccion de memoria del dato apuntado..

Si tienes problema con la sintaxis de punteros puedes cambiar el ejemplo por

void funcionCp(int *q) {
q[0] +=1;
}


Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

Gracia por ocuparte, voy a intentarlo en partes, porque con el barullo que tengo no logro explicarme, ¿es correcto que los punteros se pasan a las funciones por valor? -
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

SebaC

Si los punteros se pasan por valor eso significa que el contenido ddl puntero (la dirección del objeto al que apunta) se copia eso significa que si cambia el valor del puntero en el cuerpo de la función el cambio no se refleja al salir de ella seguirá apuntando a la antigua dirección pero se puede cambiar el valor del objeto al que apunta.

AlbertoBSD

La respusta de Sosar es la mas acertada y mejor explicada.. ;-) ;-)

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

class_OpenGL

En C no existe pasar por referencia. El concepto de referencia es de C++ (que yo sepa). Todo lo que le pasas a una función en C es por valor, es decir, se copia el parámetro a la pila.

Comúnmente (y para mi entender, erróneamente), se suele decir que cuando pasas un puntero por los parámetros de una función en C, se suele decir que estás pasando la variable a la que apunta ese puntero por referencia. Se dice esto porque el objetivo de pasar un puntero, o bien es para modificar la variable, o bien es para no ocupar mucho espacio en la pila, los cuales son los objetivos del paso por referencia. Sin embargo, no hay que confundir términos

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

NOB2014

Creo que en parte me cayo la ficha, díganme, el código que pongo a continuación demuestra correctamente que el paso de un puntero a función es por valor? . -
Sosar, realmente lo tuyo fue muy didáctico. -   
Alberto... me podes decir de donde sacaste esto, ¿cómo se mastica?
q[0] +=1;

#include <stdio.h>

void funcionCp(int *q);


int main( void ){
int a=100, *p = &a;

funcionCp(p);

printf("\n En main *p = %d", *p);


return 0;
}

void funcionCp(int *q) {
    q++;
}


Mucha gracia al resto que me ayudo a entender un poco más de los punteros. -
Un abrazo.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MAFUS

Realmente, cuándo te dicen que un puntero se pasa por valor te quieren decir esto:

#include <stdio.h>

void f(int *p) {
    printf("La dirección de p en f()    : %p\n", p);
}

int main()
{
    int a;
    int *p = &a;   
   
    printf("La dirección de p en main() : %p\n", p);
    f(p);
   
    return 0;
}

AlbertoBSD

#9
Un apuntador tiene como valor una direccion de memoria..

En tus ejemplos simplemente es un solo valor al que apunta.

Sin embargo podria ser realmente la direccion de todo un  arreglo.

Curiosamente el valor del apuntador es igual a la direccion de memoria del primer elemento.

Si quieres probarlo ve el siguiente ejemplo.

int *arreglo = calloc(3,sizeof(int));
printf("Direccion del arreglo completo: 0x%x",arreglo);
printf("Direccion del elemento 0 del arreglo: 0x%x",&arreglo[0]);
...


En mis videos de youtube tengo un video que habla de apuntadores dobles... ahi muestros sus valores y sus posiciones en memoria tal vez sea un poquitin enredoso pero podria ayudarte un poco
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW