{"id":6437,"date":"2024-01-22T11:21:02","date_gmt":"2024-01-22T10:21:02","guid":{"rendered":"https:\/\/msxitalia.org\/?p=6437"},"modified":"2024-01-22T11:21:07","modified_gmt":"2024-01-22T10:21:07","slug":"linguaggio-c-per-msx-lezione-6","status":"publish","type":"post","link":"https:\/\/msxitalia.org\/en\/linguaggio-c-per-msx-lezione-6\/","title":{"rendered":"C language for MSX \u2013 lesson 6"},"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 6)<\/h2>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Array e Puntatori<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Array Multidimensionali<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Fino ad ora abbiamo considerato array monodimensionali, i quali richiedevano un solo indice per l\u2019individuazione di un elemento. Il C permette di definire anche array multidimensionali, in questo caso sono necessari almeno due indici per identificare un elemento desiderato.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><em>type<\/em> <em>identifier [constant-expressio] [constant-expressio] \u2026\u2026<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anche se un array multidimensionale viene memorizzato come una sequenza di elementi, questo pu\u00f2 essere manipolato come un array di array. Quindi per accedere ad un elemento di un array multidimensionale abbiamo bisogno di specificare tanti indici quante sono le dimensioni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nell\u2019esempio successivo abbiamo la dichiarazione dell\u2019array multidimensionale <em>numero <\/em>di tipo intero.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int numeri&#091;3]&#091;4] = {{10,0,12,-1}, {7,-3, 2, 5}, {-5,-2, 2, 9}};<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esistono diversi metodi per accedere ad un array multidimensionale, quello mediante gli indici \u00e8 sicuramente quello pi\u00f9 semplice e lo possiamo vedere nell\u2019esempio sottostante alla riga 1.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int a = numeri&#091;1]&#091;2];<br>int b = *(numeri&#091;1]+2);<br>int c = *(*(numeri+1)+2);<br>\/\/ in tutti e tre i casi il risultato dell\u2019assegnazione \u00e8 il valore 2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c8 comunque possibile accedere all\u2019array multidimensionale tramite puntatori, la sintassi \u00e8 sicuramente pi\u00f9 complessa e pu\u00f2 essere espressa come nell\u2019esempio alle righe 2 e 3.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ricordiamo che un array a due indici come quello dell&#8217;esempio ( <em>numeri<\/em>[<em>3][4]<\/em> ),  occupa in memoria 3 \u00d7 4 posizioni &#8220;contigue&#8221; e quindi, per certi versi, si potrebbe considerare come un array unidimensionale di lunghezza 12. Ricordo che l\u2019ordine di memorizzazione degli elementi dell\u2019array segue la regola per cui l\u2019indice pi\u00f9 a sinistra cresce pi\u00f9 lentamente. Quindi in memoria dopo l\u2019elemento <em>numeri[0][0]<\/em> abbiamo<em> numeri[0][1]<\/em>, poi <em>numeri[0][2] <\/em>e cos\u00ec via.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Possiamo pensare all\u2019array <em>numeri[3][4]<\/em> come a un array di 3 elementi, in cui ciascun elemento punta a  un array di 4 elementi. Se adottiamo questo punto di vista appare chiaro che il nome <em>numeri<\/em> oppure<em> numeri[0]<\/em> \u00e8 un puntatore al primo elemento dell\u2019array bidimensionale, cio\u00e8 al primo sotto-array di lunghezza 4; quindi <em>numeri + 1<\/em> o <em>numeri[1]<\/em> punta al secondo sotto-array di lunghezza 4 e cos\u00ec via.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"470\" height=\"365\" data-src=\"https:\/\/msxitalia.org\/wp-content\/uploads\/2024\/01\/array-bid.png\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"\" class=\"wp-image-6465 lazyload\" \/><noscript><img decoding=\"async\" width=\"470\" height=\"365\" src=\"https:\/\/msxitalia.org\/wp-content\/uploads\/2024\/01\/array-bid.png\" alt=\"\" class=\"wp-image-6465\" srcset=\"https:\/\/msxitalia.org\/wp-content\/uploads\/2024\/01\/array-bid.png 470w, https:\/\/msxitalia.org\/wp-content\/uploads\/2024\/01\/array-bid-300x233.png 300w, https:\/\/msxitalia.org\/wp-content\/uploads\/2024\/01\/array-bid-15x12.png 15w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/noscript><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019espressione <em>*(numeri + 1)<\/em> \u00e8 uguale al contenuto della locazione di memoria a cui punta <em>numeri + 1<\/em>; questa locazione contiene l\u2019indirizzo del secondo sotto-array, quindi <strong><em>*(numeri + 1)<\/em> non \u00e8 un elemento dell\u2019array ma \u00e8 ancora un puntatore<\/strong>. Per essere pi\u00f9 chiaro contiene l&#8217;indirizzo dell&#8217;sotto -array che contiene i valori {7,-3, 2, 5} .  E nello stesso modo \u00e8 ancora un puntatore l\u2019espressione <em>*(numeri + 1) + 2<\/em>, che \u00e8 l\u2019indirizzo del terzo elemento del secondo sotto-array.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E infine l\u2019espressione <em>*(*(numeri + 1))<\/em> deferenzia il puntatore <em>*(numeri + 1)<\/em> restituendo il contenuto della locazione di memoria puntata: tale contenuto corrisponde al primo elemento del secondo sotto-array, che, in termini di indici, possiamo scrivere <em>numeri[1][0]<\/em>, e nello stesso modo l\u2019espressione <em>*(*(numeri + 1) + 3)<\/em> \u00e8 uguale ad<em> numeri[1][3]<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spero che la dispensa sia sufficientemente chiara, nel seguito torneremo a parlare di array come parametro di funzioni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/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","protected":false},"excerpt":{"rendered":"<p>Linguaggio C per MSX Rubrica a cura di Nicola Brogelli (Parte 6) Array e Puntatori Array Multidimensionali \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Fino ad ora abbiamo considerato array monodimensionali, i quali richiedevano un solo indice per l\u2019individuazione di un elemento. Il C permette di definire anche array multidimensionali, in questo caso sono necessari almeno due indici per identificare un [&hellip;]<\/p>\n","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":"","_et_gb_content_width":"","footnotes":""},"categories":[4],"tags":[],"dipi_cpt_category":[],"class_list":["post-6437","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\/6437","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=6437"}],"version-history":[{"count":16,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/6437\/revisions"}],"predecessor-version":[{"id":6467,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/6437\/revisions\/6467"}],"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=6437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/categories?post=6437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/tags?post=6437"},{"taxonomy":"dipi_cpt_category","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/dipi_cpt_category?post=6437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}