﻿
{"id":6127,"date":"2017-04-26T17:29:59","date_gmt":"2017-04-26T17:29:59","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=6127"},"modified":"2017-04-26T17:29:59","modified_gmt":"2017-04-26T17:29:59","slug":"cta-gostericipointer-gosterici-bildirimi-ve-gosterici-operatorleri-iii","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-gostericipointer-gosterici-bildirimi-ve-gosterici-operatorleri-iii\/","title":{"rendered":"C#\u2019ta G\u00f6sterici(Pointer) &#8211; G\u00f6sterici Bildirimi ve G\u00f6sterici Operat\u00f6rleri &#8211; III"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>\u00d6nceki yaz\u0131lar\u0131mdan olan <a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-gostericipointer-nedir-i\/\" target=\"_blank\" rel=\"noopener noreferrer\">C#\u2019ta G\u00f6sterici(Pointer) Nedir? \u2013 I<\/a> ve <a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-gostericipointer-unsafe-komutu-ii\/\" target=\"_blank\" rel=\"noopener noreferrer\">C#\u2019ta G\u00f6sterici(Pointer) \u2013 unsafe Komutu \u2013 II<\/a> ba\u015fl\u0131kl\u0131 makalelerimde s\u0131ras\u0131yla C# programlama dilinde g\u00f6stericilere dair unsafe komutuna kadar temellendirmede bulunmu\u015ftuk. \u015eimdi ise g\u00f6sterici bildirimi ve g\u00f6sterici operat\u00f6rleri \u00fczerine bir i\u00e7erik olu\u015fturaca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle C# programlama dilinde g\u00f6stericilere dair teorik bilgimize katk\u0131da bulunarak sarmal bir \u015fekilde ilerleyelim.<\/p>\n<p>\u0130lk olarak bilmenizi istedi\u011fim, g\u00f6sterici dedi\u011fimiz yap\u0131 normal de\u011fi\u015fkenler gibi tan\u0131mlansada C#&#8217;ta ayr\u0131 bir veri t\u00fcr\u00fcd\u00fcrler. Yani demek istedi\u011fim o ki; &#8220;int&#8221; tipinden de\u011fi\u015fkenler say\u0131sal de\u011ferleri, &#8220;char&#8221; tipinden de\u011fi\u015fkenler karakterleri yahut &#8220;bool&#8221; tipinden de\u011fi\u015fkenlerin ise mant\u0131ksal de\u011ferleri tutmas\u0131 nas\u0131l onlar\u0131 de\u011fer tipli de\u011fi\u015fken yap\u0131yorsa, g\u00f6sterici t\u00fcrleride nesnelerin bellekteki adreslerini tuttuklar\u0131 i\u00e7in kendi ba\u015flar\u0131na ayr\u0131 bir veri t\u00fcr\u00fcn\u00fc nitelendirmektedirler.<\/p>\n<p>Her ne kadar g\u00f6stericiler ayr\u0131 veri t\u00fcr\u00fc olsalarda birazdan g\u00f6rece\u011fimiz \u00fczere t\u00fcm de\u011fer tipleri ile tan\u0131mlanabilmektedirler.<em>(sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool vs.)<\/em> Bunun yan\u0131nda struct(yap\u0131lar)&#8217;da de\u011fer tipinden olduklar\u0131ndan dolay\u0131 haliyle struct \u00fczerinde de g\u00f6stericileri kullanabilir, tan\u0131mlayabiliriz.<\/p>\n<p>De\u011fer t\u00fcrlerinin d\u0131\u015f\u0131nda enumeration-enum yap\u0131lar\u0131 ile birlikte &#8220;void&#8221; keyword\u00fc ilede g\u00f6stericiler tan\u0131mlanabilmektedirler. E\u011fer i\u015faret\u00e7iyi \u00f6zel bir veri t\u00fcr\u00fcne tan\u0131mlamak istemiyorsak &#8220;void&#8221; anahtar s\u00f6zc\u00fc\u011f\u00fc kullan\u0131lmaktad\u0131r. B\u00f6ylece ilgili i\u015faret\u00e7i herhangi bir veri t\u00fcr\u00fcnden de\u011fer i\u00e7in adres tutabilir.<\/p>\n<p>class yap\u0131lar\u0131na gelirsek e\u011fer referans tipinden olduklar\u0131ndan dolay\u0131 zaten nesnelerin referanslar\u0131 bellekteki adresleri refere etti\u011finden\/i\u015faretledi\u011finden\/kulland\u0131\u011f\u0131ndan dolay\u0131 g\u00f6sterici kullan\u0131m\u0131na izin verilmemektedir.<\/p>\n<p>Son olarak g\u00f6stericiler &#8220;object&#8221; s\u0131n\u0131f\u0131ndan t\u00fcremedikleri i\u00e7in g\u00f6sterici t\u00fcrleri ile object aras\u0131nda t\u00fcr d\u00f6n\u00fc\u015f\u00fcm\u00fc yap\u0131lamaz. Ayr\u0131ca boxing ve unboxing i\u015flemlerini de desteklemez.<\/p>\n<p>Bu kadar teorik bilgiden sonra art\u0131k g\u00f6stericinin nas\u0131l tan\u0131mland\u0131\u011f\u0131na daha do\u011frusu bildirildi\u011fine g\u00f6z atal\u0131m.<\/p>\n<h3>G\u00f6sterici Bildirimi(*)<\/h3>\n<p>C#&#8217;ta, C ve C++ dillerinde oldu\u011fu gibi g\u00f6sterici tan\u0131mlayabilmek i\u00e7in g\u00f6stericinin t\u00fcr\u00fcn\u00fcn yan\u0131na *(asterisk\/y\u0131ld\u0131z) karakteri eklenmelidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class MyClass\r\n    {\r\n        enum MyEnum { }\r\n        struct MyStruct { }\r\n        public MyClass()\r\n        {\r\n            unsafe\r\n            {\r\n                int* x;\r\n                bool* y;\r\n                char* z;\r\n                MyStruct* w;\r\n                MyEnum* q;\r\n                void* t;\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8220;int&#8221;, &#8220;bool&#8221; ve &#8220;char&#8221; de\u011fer tiplerinden g\u00f6stericiler tan\u0131mlanm\u0131\u015ft\u0131r. Ayriyetten &#8220;MyStruct&#8221; isminde olu\u015fturulan struct tipinden ve &#8220;MyEnum&#8221; isminde olu\u015fturulan enum tipinden birer g\u00f6stericide tan\u0131mlanm\u0131\u015ft\u0131r. Sonuncu g\u00f6stericimiz ise &#8220;void&#8221; tipinde bir t\u00fcre ba\u011fl\u0131 olmaks\u0131z\u0131n tan\u0131mlanm\u0131\u015ft\u0131r. Dikkat ederseniz tan\u0131mlamalarda tiplerin yan\u0131ndaki * ifadesini kald\u0131r\u0131rsak bunlar normal de\u011fi\u015fken olacakt\u0131r. * ifadesi sayesinde de\u011fi\u015fken de\u011fil g\u00f6sterici(pointer) olmaktad\u0131rlar.<\/p>\n<blockquote><p><strong><em>* karakteri tipin yan\u0131nda belirtiliyorsa o tan\u0131mlaman\u0131n bir g\u00f6sterici oldu\u011funu belirtir.<\/em><\/strong><\/p><\/blockquote>\n<p>E\u011fer ki birden fazla g\u00f6sterici ayn\u0131 t\u00fcrden olacaksa a\u015fa\u011f\u0131daki gibi tan\u0131mlama yapabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* x, y, z;\r\n            }\r\n<\/pre>\n<p>C# dilinde g\u00f6stericiler tamamen ayr\u0131 bir veri t\u00fcr\u00fc olarak ele al\u0131nd\u0131\u011f\u0131 i\u00e7in yukar\u0131daki deyim ile asl\u0131nda a\u015fa\u011f\u0131daki gibi \u00fc\u00e7 farkl\u0131 g\u00f6sterici bildirmi\u015f bulunmaktay\u0131z.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* x;\r\n                int* y;\r\n                int* z;\r\n            }\r\n<\/pre>\n<p>Bir g\u00f6stericinin i\u015faret edece\u011fi bellek adresini sabit bir \u015fekilde verebiliriz. \u00d6rne\u011fin; bellekteki &#8220;231242&#8221; adresini herhangi bir g\u00f6sterici ile i\u015faret ettirmek istiyorsak a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                decimal* i = (decimal*)231242;\r\n            }\r\n<\/pre>\n<p>Bu tarz bir bildirim \u00e7ok ama \u00e7ok tehlikelidir. \u00c7\u00fcnk\u00fc sabit olarak belirtilen adreste ne oldu\u011funu bilmiyoruz. D\u00fc\u015f\u00fcnsenize&#8230; Elimizdeki i\u00e7eri\u011fi ne oldu\u011fu belli olmayan bu adres i\u00e7erisinde i\u015fletim sisteminin kulland\u0131\u011f\u0131 bellek b\u00f6lgesi olabilir yahut bilgisayar\u0131n o anki korumal\u0131 ya da s\u0131f\u0131r korumal\u0131 bilgileri bar\u0131nd\u0131ran hassas bir bellek noktas\u0131 olabilir. O y\u00fczden sabit olarak belirtilen bellek adreslerini kurcalamaktan m\u00fcmk\u00fcn mertebe \u00e7ekinmenizi tavsiye ederim.<\/p>\n<p>\u015eimdi ise bildiklerimizden yola \u00e7\u0131karak bir genellemeye varmak i\u00e7in a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* i;\r\n            }\r\n<\/pre>\n<p>Bu tan\u0131mlama neyi g\u00f6steriyordu? &#8220;int&#8221; tipinden bir pointer\u0131. Yani &#8220;int&#8221; tipinden de\u011fi\u015fkenleri g\u00f6sterecek\/i\u015faretleyecek bir pointer\u0131.<\/p>\n<p>Peki tamam&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int** i;\r\n            }\r\n<\/pre>\n<p>O halde bu tan\u0131mlama neyi g\u00f6steriyor? &#8220;int&#8221; tipinden bir g\u00f6stericiyi i\u015faretleyen bir pointer\u0131. Yani anlayaca\u011f\u0131n\u0131z g\u00f6stericiler, g\u00f6stericileri i\u015faretleyebiliyor. Burada bir sonraki konuya ithafen dikkat etmenizi istedi\u011fim husus, bu \u015fekilde g\u00f6stericilerin birbirlerini i\u015faretledi\u011fi durumlarda bu g\u00f6stericilerin i\u015faretledikleri bellek adreslerindeki nihai de\u011feri elde etmek i\u00e7in birazdaha kompleks bir kullan\u0131mda bulunaca\u011f\u0131z. Tabi yeri ve zaman\u0131 gelince bu noktay\u0131 size hat\u0131rlataca\u011f\u0131m&#8230;<\/p>\n<p>Bu konuya de\u011fin ak\u0131lda kalmas\u0131 maksatl\u0131 \u015fu \u00f6rne\u011fide incelemekte fayda var.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int*** i;\r\n            }\r\n<\/pre>\n<p>&#8220;int&#8221; tipinden bir g\u00f6stericiyi(<span style=\"color: #ff0000;\">int*<\/span>**) i\u015faret eden bir ba\u015fka g\u00f6stericiyi(<span style=\"color: #ff0000;\">int**<\/span>*) i\u015faret eden pointer(<span style=\"color: #ff0000;\">int***<\/span>) tan\u0131mlanm\u0131\u015ft\u0131r.<\/p>\n<p>Son olarakta bir i\u015faret\u00e7i dizisi nas\u0131l tan\u0131mlan\u0131r sorusunun cevab\u0131n\u0131 verip konumuzu burada noktalayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int*&#x5B;] dizi;\r\n            }\r\n<\/pre>\n<p>Evet&#8230; Bu \u015fekilde de bir i\u015faret\u00e7i dizisi tan\u0131mlanabilmektedir.<\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere g\u00f6sterici bildirimini tam teferruat\u0131yla ele alm\u0131\u015f bulunmaktay\u0131z. <\/p>\n<p>Sevgili okurlar\u0131m&#8230;<br \/>\nMakalemizin k\u00e2h ba\u015fl\u0131\u011f\u0131nda k\u00e2h ilk giri\u015finde belirtti\u011fimiz gibi g\u00f6sterici bildirimi ve g\u00f6sterici operat\u00f6rlerinden bahsedece\u011fimizi belirtmi\u015ftim. Ama g\u00f6r\u00fcyorsunuz ki g\u00f6sterici bildirimlerini noktalad\u0131\u011f\u0131m\u0131z anda makalemiz olduk\u00e7a \u015fi\u015fmi\u015f bulunmaktad\u0131r. O y\u00fczden g\u00f6sterici operat\u00f6rlerini sonraki makalemizde ele alma karar\u0131n\u0131 vermi\u015f bulunmaktay\u0131m.<\/p>\n<p>O halde bir sonraki devam niteli\u011findeki makalemizde g\u00f6r\u00fc\u015fmek \u00fczere diyorum&#8230;<br \/>\nHo\u015f\u00e7akal\u0131n&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, \u00d6nceki yaz\u0131lar\u0131mdan olan C#\u2019ta G\u00f6sterici(Pointer) Nedir? \u2013 I ve C#\u2019ta G\u00f6sterici(Pointer) \u2013 unsafe Komutu \u2013 II ba\u015fl\u0131kl\u0131 makalelerimde s\u0131ras\u0131yla C# programlama dilinde g\u00f6stericilere dair unsafe komutuna kadar temellendirmede bulunmu\u015ftuk. \u015eimdi ise g\u00f6sterici bildirimi&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[1772,1773,27,1758,1774,1747,1770,1771,1746,1767,1768,1769,1748],"class_list":["post-6127","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-asterisk","tag-asterisk-operatoru","tag-c","tag-c-operatoru","tag-c-asterisk-operatoru","tag-c-gosterici","tag-c-gosterici-bildirimi","tag-c-gosterici-operatoru","tag-c-pointer","tag-gosterici","tag-gosterici-bildirimi","tag-gosterici-operatorleri","tag-pointer"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/6127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=6127"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/6127\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=6127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=6127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=6127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}