pointery C

Jan Waclawek konfera na efton.sk
Středa Květen 22 10:25:56 CEST 2013


Samozrejme, ze to nie je pravda. int bolo v K&R definovane ako prirodzene
slovo procesora, mysli sa tym slovo, ktore sa pouziva na aritmetiku:

int - an integer, typically reflecting the natural size of integers on the
host machine

v 2. vydani K&R bola pridana poziadavka na min. 16 bitov pre int.

Pointer je definovany v K&R ako
A pointer is a variable that contains the address of a variable. 

To je vsetko; ziadny blizsi vztah tam nie je, bodka.



Je castou chybou u uzivatelov C, ze sa zamiena konkretna implementacia
("pointre su obvykle ulozene ako obycajne celociselne premenne") s
poziadavkami na jazyk (a bohuzial, v niektorych pripadoch sa specifika
implementacie dostali aj do normy, co je presne to, kvoli comu C nemam
rad).

Vnutorna implementacia pointra je vec kompilatora; nielenze nemusi byt int,
nie je vobec predpisany jej tvar ci obsah ci umiestnenie. Kompilator musi
zabezpecit, ze sa na pointroch da robit pointrova aritmetika, dalej ze
niektore pointre su navzajom kompatibilne (t.j. sa daju volne priradovat),
dalej ze sa na nich daju robit nejake konverzie. Jedna zo zaujimavych
predpisov je, ze pointer na akykolvek objekt sa ma dat skonvertovat na
pointer na char, ktory ma spristupnovat byte s najnizsou adresou patriaci
tomuto objektu; ale to je dost vagne na to aby to bolo dobre len na nejake
memcpy() a spol.

Este je jedna vec, co by mohla byt v tejto suvislosti zaujimava, a to je
<stdint.h>, v ktorom mozu byt ("these types are optional") definovane typy
intptr_t a uintptr_t, ktore maju tu vlastnost, ze ak sa skonvertuje void*
do nich a naspat na void*, vysledkom je ten isty pointer. Kedze void* ma
tu istu vlastnost oproti vsetkym pointrom (t.j. ze po konverzii tam a
naspat sa pointer nezmeni), toto defacto znamena, ze je to typ, do ktoreho
sa da urcitym sposobom schovat kazdy mozny pointer (napr. na ucely prenosu
medzi rovnakymi systemami). Kedze je to optional, a kedze konverzia na iny
nez povodny pointer ma nedefinovane nasledky, je toto zaujimavy, avsak
dokonale neuzitocny fakt... ;-)

wek



----- Original Message ---------------

>Normu jsem neèetl, tøeba k tomu Jano nebo Ced dodají nìco zajímavého, 
>ale v praxi to není pravda, viz Debian AMD64:
>
>checking size of char... 1
>checking size of short... 2
>checking size of int... 4
>checking size of long... 8
>checking size of long long... 8
>checking size of void *... 8
>
>L.
>
>Pavel Hudecek napsal(a):
>> To je nìjaké divné. Pointer by mìl být v¾dy int, a» u¾ ukazuje na 
>> cokoli. Int je právì tak definován: Typ urèený k adresování na dané 
>> platformì, akorát navíc se znaménkem. Proto má na rùzných platformách 
>> rùzný poèet bitù.
>>
>> Ale tøeba je to v Hitecu jinak.
>>


Další informace o konferenci Hw-list