Ero sivun ”C” versioiden välillä

Poistettu sisältö Lisätty sisältö
Tronic (keskustelu | muokkaukset)
Tronic (keskustelu | muokkaukset)
Rivi 356:
/* alustetaan kaikki alkiot nolliksi */
int numeroita[5] = { 0 };
 
C-kielessä taulukot ja pointterit ovat hyvin läheistä sukua keskenään ja itse asiassa taulukon indeksointiin käytettävä lauseke <tt>numeroita[3]</tt> tekee aivan saman asian kuin <tt>*(numeroita + 3)</tt> ja itse asiassa myös saman kuin <tt>*(3 + numeroita)</tt> eli <tt>3[numeroita]</tt>. Tällaisten muotojen käyttöä ei voida pitää hyvänä ohjelmointityylinä, mutta taulukon pointteriluonne on hyvä tuntea. Edelliset lausekkeet toimivat, koska taulukko (muuttuja) <tt>numeroita</tt> muuntuu implisiittisesti <tt>int*</tt>-tyyppiseksi pointteriksi, joka osoittaa taulukon ensimmäiseen alkioon. Siis <tt>numeroita</tt> on sama kuin <tt>&numeroita[0]</tt> eli <tt>&*(numeroita + 0)</tt>.
 
Pointteriluonne mahdollistaa myös taulukoiden välittämisen funktioiden argumentteina:
 
#include <stdio.h>
void print(int* array, size_t size) {
// Tämä antaa pointterin koon - taulukon koko ei välity pointterin mukana
printf("sizeof(array) = %d\n", sizeof(array));
printf("%d != %d\n", sizeof(array) / sizeof(array[0]), size);
// Tulostetaan taulukon sisältö
for (size_t i = 0; i < size; ++i) printf("%d\n", array[i]);
}
 
void modify(int* array) { array[2] = -1234; }
int main(void) {
int numbers[] = { 4, 8, 15, 16, 23, 42 };
// Huom: sizeof(numbers) antaa taulukon koko sisällön koon tavuina ja
// sizeof(numbers[0]) yhden alkion koon, joten size on alkioiden lukumäärä
int size = sizeof(numbers) / sizeof(numbers[0]);
modify(numbers);
print(numbers, size);
}
 
Tällaisessa tilanteessa monelle ohjelmoijalle tulee kantapään kautta vastaan se, että pointterille sizeof antaa pointterin koon (yleensä 4 tai 8), mutta taulukolle taasen sen sisältämän tiedon koon. Tämä on hämäävää, koska C:ssä taulukko muuntuu implisiittisesti pointteriksi, melkein vahingossa, kuten esim. tässä funktiokutsun yhteydessä.
 
Myös <tt>malloc</tt>-funktiolla varattua muistia tai yleensäkin mitä tahansa pointteria voi käyttää taulukkona, koska indeksointi on todellisuudessa pelkkää pointteriaritmetiikkaa. Tätä tarvitaan jos halutaan esim. varata taulukko funktiossa ja antaa se paluuarvona, jolloin staattisesti varattu taulukko vapautettaisiin automaattisesti funktion päättyessä.
 
=== Moniulotteiset ===
Noudettu kohteesta ”https://fi.wikibooks.org/wiki/C