C Proqramlaşdırmasında başlatma və göstəricilərə giriş

İndiyə qədər fərqli növ göstəriciləri necə elan edəcəyimizi gördük. Onları necə işə salacağını - başqa bir dəyişənin ünvanını göstərməsini və onlara necə daxil olacağını görək.

Tutaq ki, intX tam tam tipli normal bir dəyişəndir və intPtrX, intX-ə işarə edən bir göstərici dəyişənidir. İntPtrX intX ünvanına işarə etməli olsa, intPtrX-i intX ünvanına başlamaq lazımdır. Hər hansı bir dəyişənin ünvanı dəyişən adından əvvəl '&' (ünvan operatoru) əlavə etməklə əldə edilir.

& intX = BD0023

Beləliklə, intPtrX-ni işə salmaq aşağıdakı kimi olacaqdır.

intPtrX = & intX; // bu intX ünvanını intPtrX-ə verir.

 

İndi göstərici dəyişən intPtrX yuxarıda göstərildiyi kimi intX ünvanını ehtiva edir. Tutaq ki, indi göstəricidən istifadə edərək intX-də mövcud olan məlumat dəyərinə çatmaq istəyirik. Sonra işarə etdiyi dəyişənin dəyərini almaq üçün göstərici dəyişəninin adından əvvəl '*' istifadə edirik. '*' Operatoru ayırma operatoru kimi tanınır.

printf (“IntX dəyəri% d”, * intPtrX); // intX dəyəri 50-dir

Bir göstərici dəyişənini tərifləmə operatoru olmadan istifadə etdikdə, içərisində saxlanan ünvanı verir (göstərici dəyişəninin məzmunu). Ondan əvvəl ünvan operatoruna istinad edildikdə öz ünvanını verir.

printf (“The address of y is: %d\n”, &intPtrX); // The address of intPtrX is: AB2012
printf (“The address stored at y is: %d\n”, intPtrX); // The address stored at intPtrX is: BD0023
printf (“The value of *y (as a pointer) is: %d\n”, *intPtrX); // The value of *intPtrX (as a pointer) is: 50

Yuxarıda göstərilən nümunədən aydın olur ki, göstəricinin dəyişməsi digər normal dəyişənlə eyni fəaliyyət göstərir, yalnız fərqləndirmə operatoru istifadə edildikdə yalnız fərqlidir.

Dəyişən intX dəyərini dəyişdirmək istəyiriksə, dəyəri birbaşa * intPtrX-ə təyin edə bilərik.

* intPtrX = 100; // bu intX = 100 təyin etməklə eynidir;

 

Aşağıdakı əməliyyatlara baxın və fərqli addımlarda dəyərləri necə dəyişdirdiklərini müşahidə edin.

#include <stdio.h>
int main()
{
	int   intX, intY;
	int   *intPtrX;
	intX = 25;
	intPtrX = &intX; // intPtrX points to intX
	intY = *intPtrX; // intY gets the value that intPtrX is pointing to  = 25
	intPtrX = &intY; // pointer intPtrX is changed to point to intY
	*intPtrX = 60;   // intY value is changed to 60
	return 0;
}

Daha yaxşı başa düşmək üçün yuxarıdakı kodun müxtəlif addımlarda diaqram şəklində təqdimatına baxın.

intPtrX = & intX; // intPtrX intX-ə işarə edir

intY = * intPtrX; // intY, intPtrX-nin = 25-ə işarə etdiyi dəyəri alır: Göstəricinin intY-yə işarə etmədiyinə diqqət yetirin; yalnız intPtrX göstəricisi intY-yə kopyalanır.


intPtrX = & intY; // intPtrX göstəricisi intY-yə işarə olaraq dəyişdirildi: İndi intPtrX göstəricisinin intY ünvanı var və indi intX-yə işarə etmir.

* intPtrX = 60; // intY dəyəri 60-a dəyişdirildi: IntPtrX göstərici dəyişəninin indi intY-yə işarə etdiyi üçün intY 60-a dəyişdirildikdə dəyər. İntX dəyəri dəyişməz olaraq qalır.


Yuxarıdakı kimi float, double, karakter göstəricilərini işə sala və əldə edə bilərik.

 

flPtrY = &fltY; // Initializing a float pointer
dblPtrS = &dblS; // Initializing a double pointer
chrPtrZ = &chrZ; // Initializing a character pointer
*flPtrY = 3.14; // Assigning the value to a float pointer; hence to the float variable that it is pointing to.

Zaman quruluş göstəriciləri bir proqramda istifadə edildikdə, elementləri aşağıdakı kimi işə salınır və istinad edilir.
#include <stdio.h>
struct structExample {
	int intX;
	char chrY;
};

int main()
{
	Struct structExample structX;
	struct structExample *structPtr;
	char chrZ;

	structPtr = &structX; // Points to the structure structX – initializing structure pointer
	*structPtr.intX = 25; // Assigning values to intX of structX
	structPtr->chrY = ‘C’; // Another method of assigning value

	chrZ = *structPtr.chrZ; // Assigning the value of structure element to character variable
	return 0;
}

'*' İlə tərifləmə operatoru kimi əlavə olaraq, strukturlarda '→' nı tərifləmə operatoru kimi istifadə edə bilərik. Göstəricilərlə '→' istifadə ediriksə, göstərici dəyişkənliyindən əvvəl '*' istifadə olunmur.

Translate »
1