Megosztás a következőn keresztül:


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:

mutató a null és a nem null értékek között változik

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.