Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] domandina sui punatori

    Data una matrice (ad esempio int a[3][5] perchè:

    *(a[i] + j) corrisponde a a[i][j] ?

    Grazie
    Andrea

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Se scrivi uno schemino su come i dati sono conservati in memoria, lo comprendi facilmente.

    Ad esempio, gli elementi dell'array

    a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]

    sono memorizzati in sequenza a partire dall'indirizzo di a[0]

    Tramite l'aritmetica dei puntatori, a partire da quell'indirizzo, si arriva agli altri elementi.

    Ovviamente lo stesso dicasi in generale per

    a[i][0] a[i][1] a[i][2] a[i][3] a[i][4]

  3. #3
    No . Il compilatore semplicemente crea un array di x*y elementi .

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Nel caso di un array di questo tipo

    int a[2][3];

    gli elementi allocati sono 2 x 3 -> 6 e sono posti in memoria in modo contiguo

    a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

    Ma se scrivi

    int *p = a[1];

    il compilatore e' abbastanza "furbo" da memorizzare in p l'indirizzo dell'elemento

    a[1][0]

  5. #5
    Utente di HTML.it L'avatar di Lanus
    Registrato dal
    Apr 2006
    Messaggi
    43
    sono abbastanza noob sui puntatori, ma credo che conti j valori dopo a[i]. Quindi dato che gli elementi degli array sono dichiarati appositamente un dopo l'altro, aggiungendo j a a[i] si arriverà ad a[i] [j]. Ma sei J è superiore alle colonne punterà alla riga sotto e di conseguenza aumenterà anche I

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Non stai dichiarando un doppio puntatore.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Il doppio puntatore ti serve per gestire l'allocazione dinamica dell'array (se non conosci a priori il numero di righe e colonne).

    Considera che la scrittura

    char im[x][y];

    se x e y non sono costanti, non e' consentita.

    Se invece sai che l'immagine sara' di 100 righe da 200 caratteri, puoi scrivere

    char im[100][200];

  8. #8
    Originariamente inviato da oregon
    Ma se scrivi

    int *p = a[1];

    il compilatore e' abbastanza "furbo" da memorizzare in p l'indirizzo dell'elemento

    a[1][0]
    La scrittura
    codice:
     int *p = a[1]
    è errata. Se si vuole inizializzare un puntatore ad un elemento di un array lo si deve fare attraverso l'operatore indirizzo tranne nel caso in cui lo si vuole inizializzare all'elemento 0 dellla matrice.

    In quel caso si scrive:
    codice:
    int *p = a /* perchè a, contiene l'indirizzo iniziale dell'array e quindi dell'elemento 0 */

  9. #9
    Utente di HTML.it L'avatar di Lanus
    Registrato dal
    Apr 2006
    Messaggi
    43
    Originariamente inviato da oregon
    Il doppio puntatore ti serve per gestire l'allocazione dinamica dell'array (se non conosci a priori il numero di righe e colonne).

    Considera che la scrittura

    char im[x][y];

    se x e y non sono costanti, non e' consentita.

    Se invece sai che l'immagine sara' di 100 righe da 200 caratteri, puoi scrivere

    char im[100][200];
    ah questo non lo sapevo... In C# è consentito anche se la variabile non è const. Che brutto modo di programmare che insegna il .net

    Quindi in pratica in C vanno usate le funzioni di assegnamento dinamico per fare una cosa del genere?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da devil89
    La scrittura
    codice:
     int *p = a[1]
    è errata.
    No ... non e' cosi'. La scrittura in questione e' perfettamente corretta.

    Nel caso di un array come quello che ti ho indicato

    int a[2][3];

    la scrittura

    int *p = a[1];

    e' perfettamente legale ed equivale a

    int *p = &a[1][0];

    Originariamente inviato da devil89
    Se si vuole inizializzare un puntatore ad un elemento di un array lo si deve fare attraverso l'operatore indirizzo tranne nel caso in cui lo si vuole inizializzare all'elemento 0 dellla matrice.
    Se il puntatore deve puntare all'inizio della riga, puoi scrivere come ti ho detto.

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.