char *p = "Kissa", jono[10] = "Kissa";mutta näiden ero on siinä, että *p on osoitin johonkin merkkiin ja jono 10- paikkaisen merkkijonon 1. merkkiin. Osoitin p on alustettu osoittamaan vakiomerkkijonoa jossa sisältönä on "Kissa" ja 10- paikkainen merkkijono on sisällöltään alustettu arvoksi "Kissa". Osoittimen p arvoa voidaan muuttaa, osoittimen jono arvoa sen sijaan ei voida muuttaa!
Esimerkiksi seuraava selvältä näyttävä ohjelma saattaisi tuottaa yllätyksen:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *p="IsoKissa", jono[10];
strcpy(p,"Koira"); /* Tämä on tyhmää!!! */
strcpy(jono,"Kissa");
printf("p: %s jono: %s\n",p,jono);
return 0;
}
Ohjelma saattaa (kääntäjän optioista,
kääntäjästä ja laiteympäristöstä
riippuen) tulostaa:
p: Koira jono: raMiksikö? Koska "IsoKissa" on vakiomerkkijono, jonka alkuun osoitin p alustetaan. Tänne osoitteeseen kopioidaan teksti "Koira". Koska kääntäjän mielestä "IsoKissa" on vakiojono ja lauseessa strcpy(jono,"Kissa") tarvitaan vakiojonoa "Kissa", päättää kääntäjä antaa käännösaikana strcpy- funktiolle osoitteen "IsoKissa" - merkkijonon sisältä!
osoitin "Koira"-------------------------+
osoitin "Kissa"-------------+ |
osoitin "IsoKissa"----+ | |
v v v
+-----------------------------+
alustus *p="IsoKissa" p---->|I|s|o|K|i|s|s|a|0|K|o|i|r|a|0|
+-----------------------------+
osoitin "Kissa"-------------+
v
+-----------------------------+
kopiointi strcpy(p,"Koira") p---->|K|o|i|r|a|0|s|a|0|K|o|i|r|a|0|
+-----------------------------+
+-------------------------+
| v
| +-----------------------------+
kopiointi strcpy(jono,"Kissa") p---->|K|o|i|r|a|0|s|a|0|K|o|i|r|a|0|
+---------------+ +-----------------------------+
v
+-------------------+
|r|a|0|?|?|?|?|?|?|?|
+-------------------+
Edellisessä esimerkissä sijoitus
p = jono; /* OIKEIN */on sallittu, muttei sijoitus
jono = p; /* VÄÄRIN */Myös sijoitus
p = "Koira";olisi sallittu, mutta ei suinkaan sijoita osoitteeseen p jonoa "Koira", vaan sijoittaa osoittimen p osoittamaan vakiomerkkijonoon "Koira".
Eroa käsitellään vielä lisää sizeof - operaattorin kohdalla.