Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    118

    [C]passaggio puntatori per riferimento

    Ragazzi ho un piccolo problema nel passaggio di puntatori x riferimento
    praticamente ho scritto questo codice

    #include<stdio.h>

    struct lista

    {

    int info;

    struct lista *s;

    };

    void provafun(struct lista **p);
    main()
    {
    struct lista *p;
    provafun(&p);
    printf("%d",p->info);
    }
    void provafun(struct lista **p)
    {
    *p=(struct lista *)malloc(sizeof(struct lista));
    *p->info=10;
    }

    ma mi da errore alla riga 17

    *p->info=10;

    C17: error: request for member 'info' in something not a structure or union
    come posso fare?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    codice:
    (*p) -> info = 10;
    la prossima volta comunque posta il codice tra tag code come previsto dal regolamento. Ti consiglio anche di includere stdlib.h.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    118
    Grazie mille

  4. #4
    Se vogliamo essere pignoli il C non ha il passaggio di parametri per riferimento.
    Supporta solo il passaggio di parametri per valore e per indirizzo (puntatore e vettore).
    Al contrario del C++ che supporta anche i parametri per riferimento.

    Saluti.

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da italian_coder
    Se vogliamo essere pignoli il C non ha il passaggio di parametri per riferimento.
    Supporta solo il passaggio di parametri per valore e per indirizzo (puntatore e vettore).
    In realtà C supporta solo il passaggio per valore :master: Infatti viene passata una copia dell'indirizzo. Esempio:
    codice:
    #include <stdio.h>
    
    void f(int *);
    
    int main(int argc, char **argv) {
    	int a = 10;
    	printf("a = %d\n", a);
    	f(&a);
    	printf("a = %d", a);
    	return 0;
    }
    
    void f(int *x) {
    	int y = 20;
    	x = &y;
    }
    Output:
    codice:
    a = 10
    a = 10
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Sia per valore che per indirizzo, per valore viene passata una copia esatta del valore, per indirizzo viene passata una copia del valore del puntatore, cioè l'indirizzo a cui punta.
    Infatti nello scope della funzione f() x cambierà indirizzo, puntando ai dati di y, ma per la funzione chiamante x punterà sempre ai dati della variabile a.
    Invece nella chiamata per riferimento (&) è possibile modificare sia l'indirizzo del puntatore che i dati a cui punta.

    Saluti.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Alex intendeva dire che

    Originariamente inviato da italian_coder
    per valore viene passata una copia esatta del valore, per indirizzo viene passata una copia del valore del puntatore, cioè l'indirizzo a cui punta.
    comunque una "copia" viene passata, o del valore, o dell'indirizzo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da oregon

    comunque una "copia" viene passata, o del valore, o dell'indirizzo ...
    Questi due tipi di passaggio di parametri si chiamano rispettivamente: by value e by address.
    Quindi è bene distinguerli.

    Saluti.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Lasciamo perdere ...

    Saluti
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Originariamente inviato da oregon
    Lasciamo perdere ...

    Saluti
    Thread inutile, esattamente come il mio di risposta.
    La mia era una precisazione assolutamente corretta, se dobbiamo parlare di un linguaggio di programmazione è bene farlo con dovizia di particolari, per non lasciare nulla sottointeso.

    Saluti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.