Do mufloních vemen, vy tomu dáváte... '\0' má velikost charu, NULL má velikost ukazatele; to tu nikdo nerozporoval. Pokud je přetypuješ na stejný typ - což ten Mlocikův kód, který tuhle dávící soutěž odstartoval implicitně dělá, protože je napsán v C - bude mít výsledek pro oba přesně stejnou hodnotu i velikost. To je, oč tu celou dobu šlo. Jasné, soudruzi?
Ty jsi někde na mufloním vemenu měl neviditelně natisknutý ANCI S standard, že tak mudruješ?
1) Víš, jak funguje v C standardní string? Je to pole znaků v paměti, kde jsou za sebou ASCII znaky a poslední je NUL* (hodnota 0). Pokud je string prázdný, tak znak[0] == 0.
2) Víš, jak dostaneš string do funkce? Dáš mu odkaz na znak[0], konec si najde tak, že prostě narazí na 0. Hotovo.
3) NULL má hodnotu 0 proto, že v podmínce se jednoduše pozná, jestli je pointer platný**
No a teď příklad. Něco jednoduchýho, C na Z80. Program zaříná na adrese 0, skočí třeba na adresu 0x200. Takže od adresy 0x0 máš C3-00-20-... Pak máme třeba v RAMce (adresa řekněme 0x9876) pole pro string, který je prázdný ( byte s adresou 0x9876 == 0).
Pokud chci vrátit prázdný string, vrátím 0x9876. Funkce dereferuje pointer, vidí 0 a nic nedělá.
Pokud mu vrátím nulu (jako pointer), funkce vidí pole 0xC3-0x00 - zpracuje nesmyslný znak nebo nepozná, že jde o prázdný string a spustí nějakou akci.
Takže je úplně šumák, jestli NULL == NUL == 0. Jde o to, kdo, kde a jak to použije. char* str = 0 není prázdný string, ale nepatný string!!!***-------
* Je to NUL proto, že ASCII používá tři znaky pro označení, například zvonek u dálnopisu - bell - má označení BEL. Stejně tak první znak je null, ale autoři ASCII to stáhli na NUL.
** C nemá booleovský typ, kontroluje jenom je/není 0 - mrknout na zero flag CPU je jednoduchý a efektivní
*** takže třeba já osobně ho používám jenom jako indikaci selhání - v debugu neprojde asercí