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.