Aracılığıyla paylaş


Benzersiz İşaretçiler

C programlarında, birden çok işaretçi veri adresini içerebilir. İşaretçilerin veriler için bir diğer ad oluşturduğu söylenir. İşaretçiler bildirilen değişkenleri işaret ettiğinde de diğer adlar oluşturulur. Aşağıdaki kod parçası, bu diğer ad oluşturma yöntemlerinin ikisini de gösterir:

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;

Tipik bir C programında, aşağıdaki tanımı kullanarak bir ikili ağaç belirtebilirsiniz:

typedef struct _treetype 
{
    long               lValue;
    struct _treetype * left;
    struct _treetype * right;
} TREETYPE;

TREETYPE * troot;

Bir ağaç düğümünün içeriğine birden fazla işaretçi erişebilir. Bu genellikle dağıtılmayan uygulamalar için uygundur. Ancak, bu programlama stili daha karmaşık RPC destek kodu oluşturur. İstemci ve sunucu saptamaları, verileri ve işaretçileri yönetmek için ek kodu gerektirir. Temel alınan saplama kodu, adreslere yönelik çeşitli işaretçileri çözümlemeli ve verilerin hangi kopyasının en son sürümü temsil ettiği belirlenmelidir.

İşaretçinizin uygulamanın bu bellek alanına erişmesinin tek yolu olduğunu garanti ederseniz işlem miktarı azaltılabilir. İşaretçi, C işaretçisinin özelliklerinin çoğuna sahip olmaya devam edebilir. Örneğin, null ileolmayan null değerleri arasında değişebilir veya aynı kalabilir. Aşağıdaki örnekte bu gösterilmektedir. İşaretçi, çağrıdan önce null ve çağrıdan sonra geçerli bir dizeyi gösterir:

null ve null olmayan değerler arasında değişen işaretçisi

Varsayılan olarak, MIDL derleyicisi parametre olmayan tüm işaretçilere [ benzersiz] işaretçi özniteliğini uygular. Bu varsayılan ayar [ pointer_default] özniteliğiyle değiştirilebilir.

Benzersiz bir işaretçi aşağıdaki özelliklere sahiptir:

  • null değerine sahip olabilir.
  • Çağrı sırasında nullolmayan null olarak değişebilir. Değerolmayan nulldeğiştiğinde, dönüşte yeni bellek ayrılır.
  • Çağrı sırasında null olmayannullnull olarak değişebilir. Değer NULLolarak değiştiğinde, uygulama belleği boşaltmaktan sorumludur.
  • Değer,olmayan bir null değerinden diğerine değişebilir.
  • Benzersiz bir işaretçinin işaret ettiği depolamaya işlemdeki başka bir işaretçi veya ad tarafından erişilemez.
  • İşaretçi null değerine sahip değilse, dönüş verileri var olan depolama alanına yazılır.

Aşağıdaki örnekte benzersiz bir işaretçinin nasıl tanımlanacağı gösterilmektedir.

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0)
]
interface RefPtrInterface
{
  void RemoteFn([in, unique] char *ach);
}

Bu örnekte, parametresi, RemoteFn yordamıyla işlenmek üzere bir sunucuya gönderilen karakter verilerine benzersiz bir işaretçidir.