اشاره گرها
Csharp Pointer
سی شارپ به کاربران خود اجازه استفاده از اشاره گر ها را در توابع و بلاک های برنامه میدهد.کد نا امن یا مدیریت نشده در واقع بلاک کدی است که در آن از اشاره گر ها استفاده شود. در ابتدا لازم به ذکر است که برای اجرای کدهایی که در ادامه خواهید دید باید تنظیمات ویژوال استودیوی خود را تغییر دهید. در منوی project به قسمت properties رفته و در سر برگ build تیک گزینه allow unsafe code را بزنید.
یک اشاره گر متغیری است که مقدار آن آدرس مستقیم متغیر دیگر در حافظه است. همانند سایر متغیر ها یا Constant ها شما باید یک اشاره گر را قبل از استفاده ابتدا تعریف کنید تا بتوانید آدرس ها را در آن ذخیره کنید. در حالت کلی تعریف یک اشاره گر به صورت زیر است :
1 | type *variable-name; |
اشاره گر ها انواع مختلفی دارند که در زیر نمونه هایی از آن را مشاهده میکنید :
1 2 3 4 | int *ip; /* pointer to an integer double *dp; /* pointer to a double float *fp; /* pointer to a float char *ch /* pointer to a character |
مثال زیر نحوه استاده از اشاره گر ها را نشان میدهد که با تعدیل کننده (modifier) unsafe اجرا میشوند :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using System; namespace ZeroToHero { class Program { static unsafe void Main(string[] args) { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} ", var); Console.WriteLine("Address is: {0}", (int)p); Console.ReadKey(); } } } |
(به تعدیل کننده unsafe در کنار نام متد main دقت شود).
خروجی کد بالا به صورت زیر خواهد بود :
1 2 | Data is: 20 Address is: 99215364 |
همچنین میتوانید به جای اینکه کل متد خود را در بلاک unsafe بگذارید، قسمتی از برنامه را که در آن از اشاره گر استفاده میکنید در بلاک unsafe بگذارید. مثال بعدی بیانگر این مورد است. میتوان با استفاده از اشاره گر داده موجود در آدرس مورد نظر از حافظه را خواند. به مثال زیر توجه کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using System; namespace ZeroToHero { class Program { public static void Main() { unsafe { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} " , var); Console.WriteLine("Data is: {0} " , p->ToString()); Console.WriteLine("Address is: {0} " , (int)p); } Console.ReadKey(); } } } |
خروجی کد بالا به صورت زیر است :
1 2 3 | Data is: 20 Data is: 20 Address is: 77128984 |
همچنین میتوان از اشاره گر ها به عنوان آرگومان برای متدها استفاده کرد. ینی به جای اینکه مقدار داده را برای تابع بفرستیم آدرس داده مورد نظر خود را ارسال کنیم. در مثال زیر نحوه استفاده از اشاره گر به عنوان آرگومان را ملاحظه میکنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using System; namespace ZeroToHero { class TestPointer { public unsafe void swap(int* p, int *q) { int temp = *p; *p = *q; *q = temp; } public unsafe static void Main() { TestPointer p = new TestPointer(); int var1 = 10; int var2 = 20; int* x = &var1; int* y = &var2; Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2); p.swap(x, y); Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2); Console.ReadKey(); } } } |