Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    40

    [C] esercizio puntatori

    buon giorno la prossima settimana devo svolgere un'esame di sistemi oprativi,in cui è integrata anche una piccola parte di linguaggio C .....premessa io so programmare in java,il linguaggio C è abbastanza simile togliendo qualche struttura e altre differenze...ma quello che nn riesco ancora a capire sono sti maledetti puntatori!!!!! qui di seguito vi riporto un esercizio sui puntatori cn soluzione a fianco,e se qualcuno di voi mi può spiegare sti puntatori una volta per tutte (anche quelli con doppio asterisco) e mi può spiegare xkè nell'esercizio si ottiengono i risultati riportati a fianco nel commento...un grazie in anticipo
    ESERCIZIO 1 (4 punti)
    Inserire nei commenti l’output delle istruzioni printf(), immaginando che la funzione
    print_ar() stampi il contenuto di tutti gli elementi dell’array:
    int int_ar[] = {12,3,5,2};
    int *ip, *jp, **kpp;
    ip = jp = &int_ar[0];
    kpp = &ip;
    (*kpp)++;
    printf("**kpp = %d\n", **kpp); //____**kpp = 3_______
    printf("*++ip = %d\n", *++ip); //____*++ip = 5_______
    printf("**kpp = %d\n", **kpp); //____**kpp = 5_______
    print_ar(int_ar,4); //____ 12 3 5 2_______
    (*(*kpp-1))/=3;
    printf("*(*kpp-1) = %d\n", *(*kpp-1)); //____*(*kpp-1) = 1___
    print_ar(int_ar,4); //____ 12 1 5 2_______
    ++jp;
    *jp = (**kpp)/2;
    printf("**kpp = %d\n", **kpp); //____**kpp = 5_______
    printf("*jp = %d\n", *jp); //____*jp = 2_________

  2. #2

    Re: [C] esercizio puntatori

    Originariamente inviato da boxer89
    io so programmare in java,il linguaggio C è abbastanza simile togliendo qualche struttura e altre differenze...ma quello che nn riesco ancora a capire sono sti maledetti puntatori!!!!!
    Se sapessi programmare in Java, dovresti sapere almeno cosa sono i puntatori ed il loro funzionamento visto che esistono (in forma implicita) e vengono usati spesse volte

    Originariamente inviato da boxer89
    ESERCIZIO 1 (4 punti)
    Inserire nei commenti l’output delle istruzioni printf(), immaginando che la funzione
    print_ar() stampi il contenuto di tutti gli elementi dell’array:
    int int_ar[] = {12,3,5,2};
    int *ip, *jp, **kpp;
    ip = jp = &int_ar[0];
    kpp = &ip;
    (*kpp)++;
    printf("**kpp = %d\n", **kpp); //____**kpp = 3_______
    printf("*++ip = %d\n", *++ip); //____*++ip = 5_______
    printf("**kpp = %d\n", **kpp); //____**kpp = 5_______
    print_ar(int_ar,4); //____ 12 3 5 2_______
    (*(*kpp-1))/=3;
    printf("*(*kpp-1) = %d\n", *(*kpp-1)); //____*(*kpp-1) = 1___
    print_ar(int_ar,4); //____ 12 1 5 2_______
    ++jp;
    *jp = (**kpp)/2;
    printf("**kpp = %d\n", **kpp); //____**kpp = 5_______
    printf("*jp = %d\n", *jp); //____*jp = 2_________
    int_ar è un array di 4 valori.
    ip e jp sono puntatori ad un array monodimensionale, kpp invece ad uno multidimensionale (se viene usato passando al primo operatore [] sempre 0, può puntare anche ad un array monodimensionale, come succede in questo caso).

    Con questa assegnazione ip = jp = &int_ar[0]; ip e jp contengono l'indirizzo del primo numero nell'array int_ar (di fatto sono come int_ar), e poi kpp = &ip; da a kpp[0] l'indirizzo di ip quindi è come se ip, jp e kpp[0] siano int_ar.

    Con (*kpp)++ incrementa il puntatore dalla posizione 0 alla posizione 1 di int_ar quindi stampa il secondo numero dell'array (3)
    Siccome kpp[0] contiene l'indirizzo di ip, incrementando il puntatore kpp, anche ip è stato incrementato, quindi la prossima istruzione
    printf("*++ip = %d\n", *++ip); //____*++ip = 5_______
    stampa il 3° numero dell'array (5), perchè viene incrementato di nuovo

    Sempre per lo stesso discorso, ora stampando
    printf("**kpp = %d\n", **kpp); //____**kpp = 5_______
    **kpp è 5

    Poi con questa istruzione:
    print_ar(int_ar,4); //____ 12 3 5 2_______
    stampa tutto l'array

    Con questa istruzione:
    (*(*kpp-1))/=3;
    kpp puntava a 5, ha decrementato l'indirizzo di 1, quindi ora punta a 3, prende il valore di quell'indirizzo che è 3 e lo divide per 3.
    Poi con il printf esce 1 (3/3 fa 1)

    Infatti stampando l'array:
    print_ar(int_ar,4); //____ 12 1 5 2_______
    al posto di 3 c'è 1
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    40
    ti ringrazio per avermi dato la spiegazione del'esercizio....cmq ti assicuro che quando ho dato gli esami su java,non mi ha nessuno insegnato a usare i puntatori,solo con il linguaggio C ho saputo della loro esistenza ..... ma quindi fammi capire un attimo il puntatore serve per puntare all'indirizzo e nn al contenuto? quindi se incremento il puntatore si passa all'indirizzo successivo? inoltre il puntatore bidimensionale a cosa punta? nel senso che differenza c'è?

  4. #4
    Originariamente inviato da boxer89
    ti ringrazio per avermi dato la spiegazione del'esercizio....cmq ti assicuro che quando ho dato gli esami su java,non mi ha nessuno insegnato a usare i puntatori,solo con il linguaggio C ho saputo della loro esistenza ..... ma quindi fammi capire un attimo il puntatore serve per puntare all'indirizzo e nn al contenuto? quindi se incremento il puntatore si passa all'indirizzo successivo? inoltre il puntatore bidimensionale a cosa punta? nel senso che differenza c'è?
    Sisi infatti con Java nessuno ti spiega i puntatori, ma ogni oggetto non di base è una reference (quindi un indirizzo, quindi implicitamente è un puntatore).

    Si i puntatori sono variabili che hanno 2 valori, l-value e r-value: l'lvalue è l'indirizzo dove punta, l'rvalue è il valore dove punta quell'indirizzo.

    l'lvalue lo riprendi normalmente usando nome_puntatore, mentre per l'rvalue ci vuole l'operatore di dereferenziazione (operator*).
    scrivendo nome_puntatore++ incrementi l'indirizzo, scrivendo *nome_puntatore++ incrementi il valore in quell'indirizzo (siccome la priorità degli operatori va da sinistra verso destra, prima c'è una dereferenziazione, e poi c'è l'operatore d'incremento (alla fine la devi vedere sempre così, come 2 operatori con una priorità)
    Quindi stesso discorso per *++nome_puntatore, prima incrementa nome_puntatore, poi dereferenzia, quindi sta volta non incrementa il valore, ma l'indirizzo quindi prende il valore all'indirizzo nome_puntatore + 1.

    Guardandola in quest'ottica, i puntatori bidimensionali li devi vedere come puntatore a puntatore (**puntatore), quindi puntatore[0] contiene un puntatore ecc..

    Non esistono array solo bidimensionali, ci sono anche i tridimensionali, quadridimensionali ecc.... (int ***tridimensionale, ****quadridimensionale), ma questa è un'altra storia .....
    lolide
    Java Programmer

    Informati

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    40
    ok grazie mille adesso la cosa è un pò più chiara

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 © 2025 vBulletin Solutions, Inc. All rights reserved.