Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [c] puntatore che non va

    ho questa funzione:

    void leggi_vettore_stringhe(char *a[], int n)

    poi nel main alloco un array dinamico, il problema è che se la chiamo cosi:

    leggi_vettore_stringhe(array, n);

    mi da errore!!

    perche?

    mi dite un po' anche qualche avvertenza/sottiglieza per usare al massimo i puntatori a puntatori?

    thanks for all! :metallica

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ho risolto richiamandola:

    leggi_vettore_stringhe(&array, n)

    ma un puntatore non contiene gia un indirizzo?



    l'array l'ho dichiarato nel main cosi:

    char *array;

    con successiva malloc connessa

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798

    Re: [c] puntatore che non va

    void leggi_vettore_stringhe(char* a, int n);

    richiamandola così:
    char* a = "Ciao";
    leggi_vettore_stringhe(a, 5);

    dovrebbe andare bene.

    L'utilizzo di reference(char &a) oppure di puntatori (char* a)
    dipende da cosa vuoi fare: i reference li puoi utilizzare
    come degli alias per le variabili, una volta inizializzati
    non puoi modificarli. Cosa che invece puoi fare con i puntatori,
    tenendo conto che non li utilizzi in modo diretto
    ma devi dereferenziare quando vuoi accedere al contenuto della
    variabile puntata.
    Sicuramente, qualcun'altro potrà darti una spiegazione migliore
    visto che non lavoro molto con il c/c++.

    Ciao.
    Slack? Smack!

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da Lucked

    l'array l'ho dichiarato nel main cosi:

    char *array;

    con successiva malloc connessa
    Per il compilatore va bene, ma non è quello che vuoi fare tu, cioè avere un array di puntatori a caratteri, devi dichairarlo cosi:

    char **array = (char **)malloc(n * sizeof(char *));
    for(i = 0; i < n; i++)
    array[i] = (char *) malloc(MAX_DIM_STRINGA * sizeof(char));


  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ciao anx, grazie.
    approfitto per qualche domanda:

    non mi è chiara la simbologia:

    char *a[] questo come si legge?

    fra l'altro il prof mi ha detto che corrisponde a questo: char **a

    è vero? :bubu:

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da Lucked
    ciao anx, grazie.
    approfitto per qualche domanda:

    non mi è chiara la simbologia:

    char *a[] questo come si legge?
    allora, [] inidca che stai dichiarano un array, * indica che stai dichairando un puntatore, pero [] ha una precendenza maggiore di *, quindi

    char *a[]

    corrisponde a

    (char *)a[]

    ovvero char *a[] è un array di puntatori a char*

    Originariamente inviato da Lucked
    fra l'altro il prof mi ha detto che corrisponde a questo: char **a

    è vero? :bubu: [/B]
    In parte si e in parte no: puoi usare array di puntatori a char laddove è richiesto un char**, ma non viceversa.

    Un array di char (char a[])altro non è che un puntatore COSTATE ad una zona di memoria occupata da una successione di variabili di tipo char; un avolta dichiarato con:

    char a[10];

    a punta ad un certo indirizzo, che corrisponde all' indirizzo della prima delle 10 variabili, e non puo essere riassegnato, cioè non puoi fare:

    a = ....

    perche un array è COSTANTE, anche se puoi riassegnare i suoi elementi: a[i] = 'a';

    Invece un puntatore è una variablie che mantiene l'indirizzo di una locazione di memeoria in cui sarà conservata una variabile di un certo tipo, e puo essere riassegnatoad esempio:

    int a[10];
    int *p = a //assegno a p il puntatore rappresentato da a
    a[0] == p[0] restituisce 1 (true)


    Puntatori a puntatori. I puntatori sono variabili e per tanto hannno una locazione di memoria in cui c'è il loro valore, pertanto si puo avere un puntatore che punta ad una variabile puntatore.

    Uno degli usi dei puntaotri e quello di creare dinamicamente un array, uno degli usi dei puntatori a puntatori è di creare dinamicamente array bidimensionali:

    codice:
    char **array = (char **)malloc(n * sizeof(char *)); 
    for(i = 0; i < n; i++) 
           array[i] = (char *) malloc(MAX_DIM_STRINGA * sizeof(char));
    array è un char**: un puntatore a un puntatore a char.

    quindi array[i] è un char *: puntatore a char

    Analogamente

    char *array[10];

    è un array di puntatori a char, ma array non puo essere riassegnato, inoltre array è allocato staticamente , cioè basta dichiararlo per allocarlo; questo vale per array, ma non per le sue variabili, cioè ogni array[i] deve essere a sua volta allocato dinamicamente, ma non bisogna allocare memoria per array.

    codice:
    char *array[10];
    char **a = array; //OK, a ora punta alla stesssa locazione a cui
                      //punta array, a è un puntatore alla prima 
                      //locazione di array
    
    equivalente a:
    
    a = &array[0]
    Ci vuole un po di tempo per acquisire dimistichezza coi puntatori in c...

    errore frequente:

    int *p; //p dichiarato come puntatore a int e non inizializzato
    *p = 10; //assegno a alla locazione puntata da p il valore intero 10

    il problema sta nel fatto che p non è inizializzato e punta in una qualsiasi locazione della memoria, il cui valore sarà sovrascritto col valore 10, cuasando un errore.


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.