{"id":6272,"date":"2023-12-17T11:09:16","date_gmt":"2023-12-17T10:09:16","guid":{"rendered":"https:\/\/msxitalia.org\/?p=6272"},"modified":"2023-12-17T11:18:33","modified_gmt":"2023-12-17T10:18:33","slug":"linguaggio-c-per-msx-lezione-4","status":"publish","type":"post","link":"https:\/\/msxitalia.org\/en\/linguaggio-c-per-msx-lezione-4\/","title":{"rendered":"C language for MSX \u2013 lesson 4"},"content":{"rendered":"\n<h2 class=\"wp-block-heading has-text-align-center\">Linguaggio C per MSX<\/h2>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Rubrica a cura di Nicola Brogelli (Parte 4)<\/h2>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Puntatori<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In questa dispensa accenneremo cosa sono i puntatori. Queste informazioni saranno utili per le dispense successive dove andremmo a parlare dell\u2019aritmetica dei puntatori legata agli array, di come realizzare il passaggio di parametri per riferimento ecc.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Accenni ai puntatori<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dai tipi fondamentali che abbiamo incontrato nella prima dispenda si possono derivare altri tipi di dato. Per esempio da un tipo int possiamo derivare un puntatore a int e cos\u00ec via per tutti gli altri tipi. Ora ci possiamo chiedere che cosa \u00e8 un puntatore. Possiamo dire che una variabile appartenente a questo tipo \u00e8 un oggetto il cui valore \u00e8 un indirizzo di memoria. Quindi un oggetto di tipo puntatore ha come valore l\u2019indirizzo di un altro oggetto o di una funzione (in questa dispensa non tratteremo i puntatori a funzione).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La pi\u00f9 semplice forma di dichiarazione di un puntatore \u00e8 la seguente:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>tipo variabile *nome_variabile<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nell\u2019esempio seguente possiamo vedere la dichiarazione di variabili di tipo puntatore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int *p;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">double *d;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">float *f;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ad un puntatore possiamo assegnare dei valori, se gli assegniamo 0 o NULL, otterremo un puntatore nullo. Il puntatore nullo non si riferisce a nessun oggetto e quindi il tentativo di deferenziarlo porter\u00e0 ad un errore a tempo di esecuzione. Oppure potremmo assegnare al puntatore l\u2019indirizzo di memoria di una variabile. Questo \u00e8 possibile tramite l\u2019uso dell\u2019operatore &amp; (<strong>operatore di indirizzo<\/strong>). L\u2019operatore &amp; \u00e8 unario e prefisso, restituisce l\u2019indirizzo di memoria del suo operando. Nell\u2018 esempio seguente dichiariamo una variabile di tipo int e le assegniamo il valore 5, successivamente dichiariamo una variabile puntatore a int e contestualmente le assegniamo l\u2019indirizzo di memoria di i.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int i = 5;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int *pi = &amp;i;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per accedere ad una variabile puntatore si utilizza l\u2019operatore * (<strong>deferenziazione o indirezione<\/strong>). Anche questo operatore \u00e8 unario e prefisso e restituisce il valore della variabile puntata dal puntatore.<br>L\u2019esempio seguente stampa il valore della variabile i e cio\u00e8 5.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">printf(\u201c%d\u201d, *pi);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In alcuni casi particolari potremmo voler specificare che un dato puntatore non deve essere usato per modificare l\u2019oggetto a cui punta, questo potremmo ottenerlo tramite la parola chiave <strong>const<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int i;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const int *pi = &amp;i;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In seguito a questa dichiarazione tutte le istruzioni successive che tenteranno di cambiare il valore i usando il puntatore pi verranno segnalate come errore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">*pi = 5; \/\/ non lecito<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Puntatori a void<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo detto che la dichiarazione di un puntatore specifica il tipo dell\u2019oggetto riferito. In alcuni casi pu\u00f2 essere utile che una variabile possa contenere puntatori a tipi di oggetti diversi. In questo caso la variabile viene definita come puntatore a <strong>void. <\/strong>Prima di essere deferenziato un puntatore a void deve essere convertito mediante un cast al tipo opportuno. Con un semplice esempio vediamo come un puntatore a void viene utilizzato per accedere prima a un numero intero e poi a un carattere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int i;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int *pi = &amp;i;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int c;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">int *pc = &amp;c;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">void *vp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vp = pi;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">*(int*)vp = 3;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vp = pc;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">*(char*)vp = \u2018c\u2019;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per chi fosse interessato l\u2019<a href=\"https:\/\/www.facebook.com\/Associazione.MSX.Italia?__cft__[0]=AZWtW1kbPNs-h0X85XLUtlSKwrS2h0EfGuNwjtd0M1PViiWRP1v-ecIHfthHvkFXOWHq94BEStwCld8Sjyxph5HZV4pPzclIzcfMyJIWrb9R-3V_FjjkVgcWyg5bavYJbeQZX-I3whyOQrf4Qant6h10WsQDbiQVQEyQIPwa7IigJywispZTopKR03G8R5dvPlVM89QzLX0uMinZyfKrpw6A&amp;__tn__=-]K-y-R\">Associazione MSX Italia<\/a>\u00a0ha creato un gruppo di lavoro di Ricerca e sviluppo sulla programmazione C per MSX. Per maggiori info:\u00a0associazioneMSXitalia@gmail.com<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pointers are a powerful tool that the C language makes available to programmers.<\/p>","protected":false},"author":3,"featured_media":6286,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"<!-- wp:divi\/placeholder \/-->","_et_gb_content_width":"","footnotes":""},"categories":[4],"tags":[],"dipi_cpt_category":[],"class_list":["post-6272","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linguaggio-c"],"_links":{"self":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/6272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/comments?post=6272"}],"version-history":[{"count":20,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/6272\/revisions"}],"predecessor-version":[{"id":6303,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/6272\/revisions\/6303"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/media\/6286"}],"wp:attachment":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/media?parent=6272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/categories?post=6272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/tags?post=6272"},{"taxonomy":"dipi_cpt_category","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/dipi_cpt_category?post=6272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}