Egyedi mutatók
A C programokban egynél több mutató tartalmazhatja az adatok címét. Az egérmutatók azt mondják, hogy létrehoznak egy aliast az adatokhoz. Az aliasok akkor is létrejönnek, ha a mutatók deklarált változókra mutatnak. Az alábbi kódrészlet az aliasálás mindkét módszerét szemlélteti:
int iAnInteger=50;
// The next statement makes ipAnIntegerPointer an
// alias for iAnInteger.
int *ipAnIntegerPointer = &iAnInteger;
// This statement creates an alias for ipAnIntegerPointer.
int *ipAnotherIntegerPointer = ipAnIntegerPointer;
Egy tipikus C programban a következő definícióval adhat meg egy bináris fát:
typedef struct _treetype
{
long lValue;
struct _treetype * left;
struct _treetype * right;
} TREETYPE;
TREETYPE * troot;
Egynél több mutató is hozzáférhet egy facsomópont tartalmához. Ez általában rendben van a nem diszkontált alkalmazások esetében. Ez a programstílus azonban bonyolultabb RPC-támogatási kódot hoz létre. Az ügyfél- és kiszolgálócsomóponthoz további kód szükséges az adatok és a mutatók kezeléséhez. A mögöttes csonkkódnak fel kell oldania a címekre mutató különböző mutatókat, és meg kell határoznia, hogy az adatok melyik példánya felel meg a legújabb verziónak.
A feldolgozás mennyisége csökkenthető, ha garantálja, hogy az egérmutató az egyetlen módja annak, hogy az alkalmazás hozzáférhessen az adott memóriaterülethez. A mutató továbbra is rendelkezhet a C mutató számos funkcióval. Módosíthatja például null és a nemnull értékek között, vagy változatlan marad. Az alábbi példa ezt szemlélteti. Az egérmutató null a hívás előtt, és egy érvényes sztringre mutat a hívás után:
Alapértelmezés szerint a MIDL-fordító a [egyedi] mutatóattribútumot alkalmazza az összes olyan mutatóra, amely nem paraméter. Ez az alapértelmezett beállítás a [ pointer_default] attribútummal módosítható.
Az egyedi mutató a következő jellemzőkkel rendelkezik:
- Értéke lehet null.
- A hívás során null értékről nemnull válthat. Ha az érték nemnullértékre változik, a rendszer új memóriát foglal le.
- A hívás során a nemnull értékről null értékre válthat. Ha az érték NULLértékre változik, az alkalmazás feladata a memória felszabadítása.
- Az érték egy nemnull értékről egy másikra változhat.
- Az egyedi mutatóra mutató tárolót a művelet más mutatója vagy neve nem érheti el.
- A visszatérési adatok akkor lesznek beírva a meglévő tárolóba, ha a mutató értéke nem null.
Az alábbi példa bemutatja, hogyan definiálhat egyedi mutatót.
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface RefPtrInterface
{
void RemoteFn([in, unique] char *ach);
}
Ebben a példában a ach paraméter egy egyedi mutató a karakteradatokra, amelyeket a rendszer a RemoteFn-rutinnal feldolgozandó kiszolgálónak küld.