Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
Al MWC Qualcomm annuncia una coalizione industriale per lanciare il 6G entro il 2029 e introduce agenti IA per la gestione autonoma della RAN. Ericsson, presente sul palco, conferma la direzione: le reti del futuro saranno IA-native fin dalla progettazione
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air è un ultraleggero da 1 kg con Ryzen 5 6600H, display 14" 16:10 e 16 GB LPDDR5. Offre buona portabilità, autonomia discreta e costruzione in alluminio, ma storage PCIe 3.0 e RAM saldata limitano l'espandibilità. A 549 euro sfida brand più noti nella stessa fascia di mercato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-10-2012, 17:24   #1
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
[C] PUNTATORI help

Salve a tutti,non ho capito nulla dei puntatori,qualcuno potrebbe darmi una spiegazione molto facile per capire il concetto e la loro utilità pratica?

Ad esempio
se scrivo

int a,b,c;
a=&b ( Assegno alla variabile a l'indirizzo in memoria della variabile b?)
l'indirizzo in memoria è un numero esadecimale?
se scrivo:
c=*a (cosa vuol dire?)

ho molta confusione sui puntatori,chiaritemi un pò le idee
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2012, 17:46   #2
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Ho visto una guida dove c'era questo codice
#include <stdio.h>
#include <stdlib.h>

main()

{


int b,c;
int *a;

b=10;

a=&b;

c=*a;

printf("b%d\n",b);
printf("c%d\n",c);

return EXIT_SUCCESS;
}


Fatemi capire....
a b viene assegnato 10;

ad a viene assegnato l'indirizzo in memoria di b;

e a c viene assegnato il valore contenuto nell'indirizzo di memoria di b? dato che prima ho assegnato l'indirizzo di memoria di b ad a?

Quindi il puntatore mi dà due informazioni: Il valore di un'altra variabile (b) e il suo indirizzo in memoria (sempre di b) ?

Non ho capito però perchè nella dichiarazioni di variabile non viene dichiarata a, ma bensì *a..
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2012, 18:34   #3
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Era meglio programmare in pascal,almeno non esistevano sti problemi dato che il passaggio di parametri ad una funzione era sempre by reference
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2012, 18:37   #4
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Secondo me era meglio comprare un libro da studiare prima di scrivere del codice.
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2012, 18:55   #5
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Sto studiando da degli appunti,ma non riesco a capire appunto i puntatori,se qualcuno me li spiegasse ne sarei grato.
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2012, 21:15   #6
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Devi studiare dai libri non dagli appunti.

E comunque non si può spiegare un argomento così vasto su un forum.

Qui si dovrebbero fare domande precise per ottenere risposte precise.
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2012, 19:38   #7
goldorak
Senior Member
 
Iscritto dal: Apr 2003
Messaggi: 16462
Quote:
Originariamente inviato da Dbz Guarda i messaggi
Sto studiando da degli appunti,ma non riesco a capire appunto i puntatori,se qualcuno me li spiegasse ne sarei grato.
Un puntatore e' semplicemente una variabile il cui valore e' un indirizzo di memoria.


Ogni variable in C e' caratterizzata da determinati attributi tra cui :

- il nome
- lo scope
- il left value
- il right value
- il tipo

Il right value di una variable e' il suo valore. Il left value e' invece l'indirizzo di memoria della variabile. Tanto per fare un esempio :

Prendi due variabili a e b di tipo integer.

a = b questo e' un assegnamento. Questa istruzione corrisponde a prendere il right value di b (da qui deriva l'origine del termine right value, compare a destra di un assegnamento) ovverosia corrisponde a prendere il valore di b e lo memorizza nella variabile a (cioe' lo memorizza nel indirizzo di memoria che e' il left value di a).

Ora un puntatore e' una variabile, quindi ha sia il left value che il right value.
Ma siccome il right value di un puntatore e' un indirizzo di memoria, si puo' accedere al contenuto di quel indirizzo mediante l'operazione di dereferenziazzione.

Se a e' una variabile, &a e' il suo indirizzo.
Se a e' un puntatore, &a e' l'indirizzo del puntatore; a e' il valore del puntatore e (*a) e' il contenuto della cella di memoria il cui indirizzo e' il valore di a.

Per dichiarare un puntatore occorre sempre specificare a che tipo di dato punta.


Quindi se vuoi dichiarare un puntatore a interi o a char :

integer * a (a e' un puntatore a interi)
char * a (a e' un puntatore a char)
etc....

Se a e' un puntatore a integer e b e' una variabile di tipo integer allora scrivere

a = b non ha senso. Perche' non puoi assegnare un intero ad un una variabile puntatore. Puoi solo assegnare degli indirizzi (ricordati della definizione di puntatore, una variable il cui valore e' un indirizzo di memoria).
Quindi l'assegnamento va corretto in questo modo : a = &b. Ora e' giusto perche' &b e' l'indirizzo della variabile b, e questo lo puoi assegnare al puntatore a.

Se a e b sono puntatori dello stesso tipo allora puoi fare l'assegnamento
a=b. Perche' il right value di b e' un indirizzo (e' il valore del puntatore b) e visto che e' un indirizzo lo puoi assengare al puntatore a.

Ora supponiamo che

integer *a
integer b

b=5 (assegno il valore 5 a b)
a = &b (assegno l'indirizzo di b ad a)
se stampo a avro' un numero esadecimale che mi rappresenta l'indirizzo di b.
se stampo *a avro' invece il valore della variabile il cui indirizzo e' il valore di a. Quindi siccome il valore di a e' indirizzo di b, *a e' 5 (il valore di b).


Ma come altri ti hanno gia' consigliato, non studiare sugli appunti. Prendi un libro e studia quello. Chesso', il K&R, altrimenti un qualsiasi manuale sul C dovrebbe andare bene.
__________________
MICROSOFT : Violating your privacy is our priority
goldorak è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2012, 17:30   #8
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Grazie per la risposta,adesso mi ci metto con calma per capirli.
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2012, 18:17   #9
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Perfetto ora ho capito.

Però non riesco a capire perchè in una funzione che scambia due variabile che poi viene chiamata nel MAIN il passaggio dei parametri (by value) non Funziona.

Ultima modifica di Dbz : 01-11-2012 alle 19:36.
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2012, 20:09   #10
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Quote:
Originariamente inviato da Dbz Guarda i messaggi
Perfetto ora ho capito.
E' bastato poco ... dopo tante guide e tanta confusione sono bastate poche righe per farti capire ... un miracolo ...

Quote:
Però non riesco a capire perchè in una funzione che scambia due variabile che poi viene chiamata nel MAIN il passaggio dei parametri (by value) non Funziona.
Cioè? Cosa vuoi dire?
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2012, 21:21   #11
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Ho scritto questo codice:

Codice PHP:
#include <stdio.h>
#include <stdlib.h>
void scambia (int *n,int *m);
int main()

{
int a,b,*n,*m;



printf("dammi il valore della prima variabile");
scanf("%d",&a);
printf("dammi il valore della seconda variabile");
scanf("%d",&b);

n=&a;
m=&b;

scambia(n,m);

printf("%d\n",a);
printf("%d\n",b);

return 
EXIT_SUCCESS;
}
/*--------------------------------------------------------------------------*/


void scambia (int *n,int *m)
{
int temp;

temp=*n;
*
n=*m;
*
m=temp;


Praticamente la funzione scambia,scambia i valori delle due variabili per fare ciò ho usato un passaggo by reference ho passato i puntatori n,m alla funzione che rispettivamente puntano alla variabile a e b (ho assegnato a n ed m gli indirizzi di a e b)
il programma funziona.

Però Non ho capito perchè questo programma NON funziona se uso un passaggio by value. ovvero se passo alla funzione le variabili a e b e non uso alcun puntatore.

Ultima modifica di Dbz : 01-11-2012 alle 21:24.
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2012, 22:55   #12
Dânêl
Senior Member
 
Iscritto dal: Jul 2008
Messaggi: 485
non funziona perchè quando fai un passaggio by value non usi gli indirizzi di memoria dove sono memorizzate le variabili originali. Ogni volta che viene chiamata una funzione e vengono passate delle variabili by value, queste vengono copiate (detto in modo molto terra terra, invece di avere due variabili ne hai 4, a due a due uguali come valore, ma non come indirizzo). Ciò significa che uno scambia by value ti scambia le variabili solo all'interno della funzione e non a livello "globale". Usando i puntatori, e quindi un passaggio by ref, la funzione lavora direttamente sulle variabili "esterne" alla funzione.

Sperando che la spiegazione sia chiara, ribadisco quanto detto da altri: procurati un buon libro sul C. Ce ne sono migliaia e tutti chiariscono questi dettagli in modo molto chiaro (se non tutti, quantomeno la maggior parte).

Ultima modifica di Dânêl : 01-11-2012 alle 22:57.
Dânêl è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2012, 17:03   #13
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Ok Adesso mi è chiaro tutto.

Comunque devo realizzare un checkdate ovvero un programma che controlla le date è da 4 ore che ci provo ma non mi riesce nulla.

Pensavo di strutturare il mio programma così

-Il main legge la data immessa e tramite una stampa dice se è valida o meno.

-Creo una funzione che mi permette di controllare la validità della data

-Creo una funzione che mi permette di calcolare i giorni di un determinato mese

-Creo una funzione che mi permette di calcolare i giorni di Febbraio in base all'anno se è bisestile o meno.



Ho scritto il tutto ma non funziona una bega
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2012, 17:21   #14
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Codice PHP:
#include <stdio.h>
#include <stdlib.h>
int giorni_febbraio(int mint a);



int main()

{

 
int gma,ng;
 

   
printf ("Inserire la data (g m a): ");
   
scanf ("%d %d %d", &g, &m, &a);
   
   
ng=giorni_febbraio(m,a);
   
   
printf("%d",ng);
   
   
   return 
EXIT_SUCCESS;
   
   
   
   
   }
   
/*---------------------------------------------------------------------------------------------------------------------------------------------*/
/*Funzione che calcola i giorni di febbraio in base alla bisestilità*/


int giorni_febbraio(int mint a)
{
if(
m==2)
{
/* l'anno e` bisestile se:
        e` divisibile per 4 e non divisibile per 100
        oppure
        e` divisibile per 400
   */
if(((== 0) && (100 != 0)) || (400 == 0))


{

return 
29;

}

else
{
if(!(((
== 0) && (100 != 0)) || (400 == 0)))
{
return 
28;
}


}
}

else
{


/*Il mese immesso è !=2 quindi non è febbraio*/

printf("il mese immesso non è febbraio");
return;
}



Mi succede una cosa molto strana: Se metto una data come 2 3 2012 mi viene fuori una stampa con scritto "il mese immesso non è febbraio3"

Perchè viene fuori quell'3?

Non riesco a capire dov'è sta l'errore

Ultima modifica di Dbz : 02-11-2012 alle 17:44.
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2012, 17:30   #15
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Viene visualizzato da questa linea

printf("%d",ng);
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2012, 00:09   #16
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
si ma io non ho scritto un 3 nella printf perchè viane fuori quel 3?
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2012, 00:49   #17
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da Dbz Guarda i messaggi
si ma io non ho scritto un 3 nella printf perchè viane fuori quel 3?
Tu prima chiami la funzione:

ng=giorni_febbraio(m,a);

che ti stampa "il mese immesso non è febbraio".
Subito dopo chiami

printf("%d",ng);

come ti diceva Lorenzo, che ti stampa "3".
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2012, 14:47   #18
Dbz
Senior Member
 
L'Avatar di Dbz
 
Iscritto dal: Sep 2009
Città: Pordenone
Messaggi: 1449
Non riesco proprio a capire...Dov'è l'errore quindi?
Dbz è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2012, 15:09   #19
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Io ti consiglierei di seguire un percorso più graduale e lasciar stare i puntatori per ora, che sono un argomento delicato e per nulla banale (quando poi cominci a trattare l'allocazione dinamica diviene ancor più delicato).

Ultima modifica di [Kendall] : 03-11-2012 alle 15:45.
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2012, 01:17   #20
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Io ti consiglierei di seguire un percorso più graduale
Concordo ... il problema non sono i puntatori (non solo almeno).

Hai scritto

Codice:
ng=giorni_febbraio(m,a); 
printf("%d",ng);
quindi visualizzi *comunque* un valore (che è ng) e che viene restituito dalla funzione ... concordi?

Adesso entra in gioco il tuo compilatore che, stranamente, non dice nulla circa quel

Codice:
return;
solitario che hai scritto nella funzione e che restituisce, casualmente, il valore 3.

In realtà, non dovresti poter compilare il programma perché dovresti *comunque* restituire un valore dato che la funzione è fatta per restituirlo. Quindi, anche nell'ultimo caso dovresti scrivere

return qualcosa;

e quel qualcosa verrebbe visualizzato dalla printf.

Ecco perché concordo sul fatto che devi rivedere il percorso di apprendimento dato che non hai ancora chiaro neanche l'uso delle funzioni e i puntatori vengono molto dopo ...
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
Costo della memoria alle stelle? Non ave...
GPT-5.4 cambia il modo di usare ChatGPT:...
Centinaia di petabyte in una molecola: l...
Lenovo al MWC 2026: dal PC modulare all'...
Huawei presenta gli agenti di IA per le ...
Alla scoperta di GAIA, la piattaforma IA...
Crimson Desert alla ricerca dell'equilib...
Ray-Ban Meta, video privati visionati da...
Epic Games fa causa a un ex collaborator...
BYD Blade Battery di seconda generazione...
Pop Mart vs Bambu Lab: la battaglia lega...
Control Resonant entra nella fase alpha ...
1.040 Hz e tecnologia Mini LED: TCL sfid...
Smart retail: arrivano le soluzioni di H...
MOVA, guida all'acquisto per scegliere i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:05.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v