{"id":294,"date":"2015-02-19T01:08:04","date_gmt":"2015-02-18T23:08:04","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=294"},"modified":"2015-02-19T01:08:04","modified_gmt":"2015-02-18T23:08:04","slug":"gomulu-sistemler-23-gomulu-c-isaretciler","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=294","title":{"rendered":"G\u00f6m\u00fcl\u00fc C &#8211; 13 : \u0130\u015faret\u00e7iler"},"content":{"rendered":"<p>Tekrardan merhabalar. Bu g\u00fcn C dilinde pointer olarak adland\u0131r\u0131lan konu \u00fczerine bir yaz\u0131 yazmaya \u00e7al\u0131\u015faca\u011f\u0131m. Yine di\u011fer yaz\u0131larda ufaktan da olsa bahsetti\u011fim i\u015faret\u00e7iler(pointers) hakk\u0131nda fark\u00a0yaratabilece\u011fini\u00a0\u00a0d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm bilgileri payla\u015fmaya \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<p>Epeyce bir s\u00fcredir, ne yaz\u0131k ki yeni bir yaz\u0131 yay\u0131mlayamad\u0131m. \u00dclkemizde ya\u015fanan \u00e7ok \u00e7ok \u00fcz\u00fcc\u00fc olaylar, hayat\u0131n d\u00f6nem d\u00f6nem hepimizi vuran yo\u011funlu\u011fu gibi sebeplerle sessiz bir d\u00f6nem ge\u00e7irdim. Ancak ne olursa olsun, ba\u015flad\u0131\u011f\u0131m\u0131z i\u015fleri bitirmekte fayda var. Bu vesileyle bu yaz\u0131m\u0131n temas\u0131n\u0131 &#8220;vicdan&#8221; olarak belirliyorum.<\/p>\n<p>C dilinin belki de en zor konusudur i\u015faret\u00e7iler (pointers). Nedendir hikmeti tam bilinmez, bir t\u00fcrl\u00fc a\u00e7\u0131k se\u00e7ik a\u00e7\u0131klanamam\u0131\u015ft\u0131r. Benim yorumum \u015fu; i\u015faret\u00e7iler \u00e7o\u011fu zaman basit kurgulanm\u0131\u015f bir yap\u0131 olmad\u0131\u011f\u0131ndan, anlamas\u0131 da \u00e7ok basit de\u011fil. Bu yorumuma kat\u0131lan, kat\u0131lmayan olabilir ancak sebeplerimi kendimce s\u0131ralay\u0131p ard\u0131ndan olay\u0131 a\u00e7\u0131k \u015fekilde anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m. Zira olay\u0131n asl\u0131 olduk\u00e7a basit.<\/p>\n<p>\u0130\u015faret\u00e7iler belle\u011fe kestirme yollardan eri\u015fmeyi sa\u011flar diyebiliriz. \u0130\u015faret\u00e7iler, t\u00fcrl\u00fc potansiyel sorunlar\u0131 beraberinde getirdi\u011finden baz\u0131 dillerde kullan\u0131m\u0131 yasaklanm\u0131\u015ft\u0131r. \u00d6rne\u011fin C#&#8217;da pointer kullan\u0131m\u0131n\u0131 a\u00e7mak i\u00e7in kodu g\u00fcvenilmez (unsafe) yazd\u0131\u011f\u0131n\u0131z\u0131 kabul etmeniz beklenmektedir. Y\u00fcksek seviyeli dillerde belle\u011fe do\u011frudan eri\u015fim hakikaten g\u00fcvenilmez kodlar do\u011furabilir ancak C gibi orta seviyeli bir dilde i\u015faret\u00e7i kullanarak bellek eri\u015fimi yapmak, do\u011fru tasar\u0131m kal\u0131plar\u0131 ve prensipler izlendi\u011finde olduk\u00e7a verimli olabilir. Bizim de niyetimiz, i\u015faret\u00e7ileri do\u011fru kullanarak C dilinin g\u00fc\u00e7l\u00fc olan bu yan\u0131na h\u00fckmedebilmek bu sayede de g\u00fczel kodlar yazabilmek.\u00a0S\u0131rf i\u015faret\u00e7iler\u00a0risk unsurlar\u0131 yaratabilir diye, onlara kem g\u00f6zlerle bakmak, onlar\u0131 k\u00f6t\u00fc kullanmak vicdans\u0131zl\u0131k olur diye d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<div class=\"su-box su-box-style-default\" id=\"\" style=\"border-color:#000000;border-radius:3px;\"><div class=\"su-box-title\" style=\"background-color:#333333;color:#FFFFFF;border-top-left-radius:1px;border-top-right-radius:1px\">\u00d6nemli Nokta<\/div><div class=\"su-box-content su-u-clearfix su-u-trim\" style=\"border-bottom-left-radius:1px;border-bottom-right-radius:1px\">\u0130\u015faret\u00e7ilerin temel i\u015flevi: bellekteki bir adres i\u00e7indeki bir dataya eri\u015fim (* operat\u00f6r\u00fc ile) ya da bir de\u011fi\u015fkenin bellekteki adresine eri\u015fim (&amp; operat\u00f6r\u00fc ile) oldu\u011fundan \u00f6nce bir bellek hususunu vicdanlar\u0131n \u00f6n\u00fcne sersek iyi olur diye d\u00fc\u015f\u00fcn\u00fcyorum.<\/div><\/div>\n<p><strong>Bellek Hakk\u0131nda<\/strong><\/p>\n<p>Bildi\u011finiz \u00fczere bellek dedi\u011fimiz esasen fiziksel bir bilgi deposu oluyor. Bu z\u0131mb\u0131rt\u0131n\u0131n veriyi saklama bi\u00e7imine g\u00f6re iki temel \u00e7e\u015fidi var. Birincisi Volatile Memory denilen &#8220;Ge\u00e7ici Haf\u0131za&#8221;. Birisi de Non-Volatile Memory(NVM) denilen &#8220;Kal\u0131c\u0131 Haf\u0131za&#8221;. Efendim ne g\u00f6re ge\u00e7ici ya da kal\u0131c\u0131? Elektrik gitti\u011finde g\u00f6sterdi\u011fi davran\u0131\u015fa g\u00f6re. Elektri\u011fi kessek \u00a0(ya da cihaza hard reset atsak) dahi, geri verdi\u011fimizde veriler saklan\u0131yorsa NVM, saklanm\u0131yorsa VM. Misal RAM bir VM&#8217;dir yani ge\u00e7ici bellektir. Hard disk veya flash memory ise NVM yani kal\u0131c\u0131 bellektir.<\/p>\n<p><strong>Pointer (\u0130\u015faret\u00e7i) Nedir?<\/strong><\/p>\n<p>Biz i\u015faret\u00e7iler ile hem kal\u0131c\u0131 bellekteki hem de ge\u00e7ici bellekteki verilere eri\u015febiliyoruz. \u00c7ok \u00f6nemli oldu\u011fu i\u00e7in tekrar edece\u011fim. Bir i\u015faret\u00e7i iki operat\u00f6r ile ifade edilebilir.<\/p>\n<pre class=\"lang:default decode:true \">*\u00a0Opeta\u00f6r\u00fc: Bellekteki bir adres i\u00e7indeki veriye eri\u015fim. Kullan\u0131m: DegiskeninDegeri=*Adres.\n\n&amp; Operat\u00f6r\u00fc: Bir de\u011fi\u015fkenin adresine eri\u015fim. Kullan\u0131m: Adres = &amp;Degisken;<\/pre>\n<p>&nbsp;<\/p>\n<p>Arkada\u015flar C dilinde her \u015fey bir de\u011fi\u015fken gibi de\u011ferlendirilebilir demi\u015ftik. Pointer\u00a0da benzer muameleye tabi oldu\u011fundan, onun da bir tipi vard\u0131r. \u00d6rne\u011fin<\/p>\n<pre class=\"lang:c decode:true \">uint8_t *dataPtr;<\/pre>\n<p>yukar\u0131daki dataPtr&#8217;nin tipi uint8_t* oldu\u011fundan, bu i\u015faret\u00e7i g\u00f6sterdi\u011fi bellek alan\u0131ndaki bilgiyi uint8_t olarak yorumlayacakt\u0131r. Benzer bir yorum farkl\u0131 veri tipleri i\u00e7in de yap\u0131labilir. Misal float* tipindeki bir de\u011fi\u015fken, g\u00f6sterece\u011fi adres i\u00e7indeki veriyi float olarak yorumlayacakt\u0131r. Bu bilgiyi daha detayl\u0131ca a\u00e7\u0131klayaca\u011f\u0131m.<\/p>\n<p>\u0130\u015faret\u00e7ileri anlatman\u0131n en iyi yolu \u00f6rnekler \u00fczerinden gitmektir. \u00d6yleyse a\u015fa\u011f\u0131daki \u00f6rnek \u00fczerinden ba\u015flayal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">#include &lt;stdint.h&gt;\n\nint32_t main()\n{\nint32_t num;\nint32_t *ptr;\nreturn 0;\n}<\/pre>\n<p>Bir de\u011fi\u015fken tan\u0131mland\u0131\u011f\u0131nda, ona uygun bir bellek g\u00f6z\u00fc (ya da bellek g\u00f6zleri) tahsis edilir. Hangi bellek olaca\u011f\u0131 i\u015fletim sisteminin ve derleme ortam\u0131n\u0131n takdirindedir. Yukar\u0131daki de\u011fi\u015fkenler farz\u0131 misal 0x2015 adresinden ba\u015flayarak yerle\u015fsin.<\/p>\n<pre class=\"\">        |-----|\n  0x2014|     |   num; 32 bit geni\u015fli\u011finde yer kaplayan bir de\u011fi\u015fkendir.\n        |-----|\n  0x2018|     |   ptr; 32 bit geni\u015fli\u011finde yer kaplayan bir i\u015faret\u00e7idir. \n        |-----|\n  0x201C|     |   belle\u011fin geri kalan\u0131...\n        |-----|\n           :\n<\/pre>\n<p>\u015eimdi kodun bir yerlerinde C dilinde \u015funlar\u0131 dersek:<\/p>\n<pre class=\"lang:default decode:true\">num = 42;\nptr = &amp;num;\n<\/pre>\n<p>Bunlar\u0131n insan dilinde okunu\u015fu \u015f\u00f6yle olur: &#8220;num de\u011fi\u015fkeninin de\u011feri 42&#8217;dir. ptr i\u015faret\u00e7isi ise num de\u011fi\u015fkeninin adresine e\u015fittir.&#8221;<\/p>\n<p>Tan\u0131mland\u0131\u011f\u0131nda num de\u011fi\u015fkeni 0x2014 numaral\u0131 bellek g\u00f6z\u00fcnde yer almaktayd\u0131 hat\u0131rlay\u0131n. Buna g\u00f6re ptr=0x2014 olmas\u0131 gerekir \u00e7\u00fcnk\u00fc num de\u011fi\u015fkeninin adresi budur. \u00d6teyandan ptr de\u011fi\u015fkeninin adresi 0x2018 oldu\u011fundan, ptr&#8217;nin de\u011feri bu adreste saklan\u0131r. Buna g\u00f6re 0x2014 numaral\u0131 bellek g\u00f6z\u00fcnde 42 yazacak, 0x2018 numaral\u0131 bellek g\u00f6z\u00fcnde ise 0x2014 yazacakt\u0131r. Haydi az\u0131c\u0131k zahmet edip \u00e7izelim.<\/p>\n<pre class=\"\">        |------|\n  0x2014| 42   |   num; 32 bit geni\u015fli\u011finde yer kaplayan bir de\u011fi\u015fkendir.\n        |------|\n  0x2018|0x2014|   ptr; 32 bit geni\u015fli\u011finde yer kaplayan bir i\u015faret\u00e7idir. \n        |------|\n  0x201C|      |   belle\u011fin geri kalan\u0131...\n        |------|\n           :\n<\/pre>\n<p>&nbsp;<\/p>\n<p>\u015eimdi bu ibretlik bilgiyi s\u0131nayabilece\u011finiz tam bir kodu payla\u015fal\u0131m.<\/p>\n<pre class=\"lang:c decode:true\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\nint32_t main()\n{\n    int32_t num=42;\n    int32_t* ptr;\n    ptr = &amp;num;\n    \n    \n    printf(\"num'un adresi: %x n\", &amp;num);\n    printf(\"ptr'nin degeri: %x n\", ptr);\n    \n    printf(\"num'un degeri: %d n\", num);\n    printf(\"ptr'gosterdigi deger: %d n\", *ptr);\n    \n    printf(\"ptr'nin adresi: %x n\", &amp;ptr);\n    \n    getchar();\n\n        return 0;\n    \n}\n<\/pre>\n<p>Efendim bu kodun benim bilgisayar\u0131mdaki \u00e7\u0131kt\u0131s\u0131 \u015f\u00f6yle:<\/p>\n<div class=\"su-note\"  style=\"border-color:#e5b24c;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\"><div class=\"su-note-inner su-u-clearfix su-u-trim\" style=\"background-color:#ffcc66;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">num&#8217;un adresi: 22fe4c<br \/>\nptr&#8217;nin degeri: 22fe4c<br \/>\nnum&#8217;un degeri: 42<br \/>\nptr&#8217;gosterdigi deger: 42<br \/>\nptr&#8217;nin adresi: 22fe40<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\nProcess exited with return value 0<br \/>\nPress any key to continue . . .<br \/>\n<\/div><\/div>\n<ul>\n<li>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, num&#8217;un adresi hakikaten ptr&#8217;nin degerine e\u015fit.<\/li>\n<li>Ptr&#8217;nin\u00a0g\u00f6sterdigi deger hakikaten num&#8217;un degerine e\u015fit.<\/li>\n<li>Ve hakikaten ptr, bir degisken olarak\u00a0bellekte saklaniyor ve adresi num&#8217;un adresinden farkl\u0131.<\/li>\n<\/ul>\n<p>Mevzuyu a\u00e7\u0131k se\u00e7ik g\u00f6sterdik diye d\u00fc\u015f\u00fcn\u00fcyorum. \u015eimdi benzer bir olay\u0131 diziler \u00fczerinde anlatal\u0131m ki ba\u015fka p\u00fcf noktalar\u0131 g\u00f6relim.<\/p>\n<pre class=\"lang:c decode:true\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\nint32_t main()\n{\nint8_t name[] = \"Ozge\";\nint8_t *p8;\nint32_t *p32;\n\np8 = name;\np32 = (int32_t *)name;\n\n    printf(\"name'in adresi: %x rn\", name);\n    printf(\"p8'in degeri: %x rn\", p8);\n    printf(\"p32'nin degeri: %x rn\", p32);\n    \n    printf(\"p8'in gosterdigi deger: %d [%c] rn\", *p8,*p8);\n    printf(\"p32'nin gosterdigi deger: %d [%x] rn\", *p32, *p32);\n    \n    printf(\"p8'in adresi: %x rn\", &amp;p8);\n    printf(\"p32'nin adresi: %x rn\", &amp;p32);\n\n ++p8;\n ++p32;\n    printf(\"rnisaretci degerleri arttiktan sonra!!!rn\");\n    printf(\"p8'in degeri: %x rn\", p8);\n    printf(\"p32'nin degeri: %x rn\", p32);\n \n    printf(\"p8'in gosterdigi deger: %d [%c] rn\", *p8,*p8);\n    printf(\"p32'nin gosterdigi deger: %d [%x] rn\", *p32, *p32);\n    \n    printf(\"p8'in adresi: %x rn\", &amp;p8);\n    printf(\"p32'nin adresi: %x rn\", &amp;p32);\n    \ngetchar();\n}<\/pre>\n<p>\u00d6ncelikle kodu okuyarak anlamaya \u00e7al\u0131\u015f\u0131n\u0131z.<\/p>\n<p>\u015eimdi bu \u00e7\u0131kt\u0131lar\u0131 teker teker yorumlayal\u0131m. Ancak \u00f6nce dizinin ve i\u015faret\u00e7ilerin belle\u011fe nas\u0131l yerle\u015fti\u011fini farz-\u0131 misal bir a\u00e7\u0131kalayal\u0131m.<\/p>\n<pre class=\"\">        |---|\n 0x2014 |'O'|  \"name\", tanimlanan dizinin adresidir ve bu ornekte 0x2014'dur.\n        |---|\n 0x2015 |'z'|  int8_t(char): 1 byte\n        |---|\n 0x2016 |'g'|  int8_t(char): 1 byte\n        |---|\n 0x2017 |'e'|  int8_t(char): 1 byte\n        |---|\n 0x2018 |\u0000 |  int8_t(char): 1 byte\n        |---|\n 0x2019 |   |  p8 bir isaretci: adres yolu genisligi kadar\n        |---|\n 0x201D |   |  p32 bir isaretci adres yolu genisligi kadar\n        |---|<\/pre>\n<p>Bu kodun benim bilgisayar\u0131mdaki \u00e7\u0131kt\u0131s\u0131 a\u015fa\u011f\u0131daki gibi oluyor.<\/p>\n<div class=\"su-note\"  style=\"border-color:#e5b24c;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\"><div class=\"su-note-inner su-u-clearfix su-u-trim\" style=\"background-color:#ffcc66;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">name&#8217;in adresi: 22fe40<br \/>\np8&#8217;in degeri: 22fe40<br \/>\np32&#8217;nin degeri: 22fe40<br \/>\np8&#8217;in gosterdigi deger: 79 [O]\np32&#8217;nin gosterdigi deger: 1701280335 [65677a4f]\np8&#8217;in adresi: 22fe38<br \/>\np32&#8217;nin adresi: 22fe30<\/p>\n<p>isaretci degerleri arttiktan sonra!!!<\/p>\n<p>p8&#8217;in degeri: 22fe41<br \/>\np32&#8217;nin degeri: 22fe44<br \/>\np8&#8217;in gosterdigi deger: 122 [z]\np32&#8217;nin gosterdigi deger: 0 [0]\np8&#8217;in adresi: 22fe38<br \/>\np32&#8217;nin adresi: 22fe30<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\nProcess exited with return value 0<br \/>\nPress any key to continue . . .<br \/>\n<\/div><\/div>\n<p>\u015eimdi bu \u00e7\u0131kt\u0131lar\u0131 tek tek yorumlay\u0131p ibretleri beynimize indirelim.<\/p>\n<p>&#8220;name&#8221; ile tan\u0131mlanan dizinin ba\u015flang\u0131\u00e7 adresini benim bilgisayar\u0131m 0x22fe40 olarak atam\u0131\u015f. p8 ve p32 i\u015faret\u00e7ilerine name dizisinin ba\u015flang\u0131\u00e7 adresini atad\u0131\u011f\u0131mdan, hakikaten bu iki isaretcinin degeri name dizisinin baslang\u0131\u00e7\u00a0adresi yani 0x22fe40 olmu\u015f. Buraya kadar g\u00fczel, zaten konu\u015ftu\u011fumuz \u015feyler.<\/p>\n<p>p8&#8217;in g\u00f6sterdi\u011fi de\u011fer &#8216;O&#8217; karakteri yani 79 say\u0131s\u0131 olmu\u015f. Bu normal \u00e7\u00fcnk\u00fc p8&#8217;in de\u011feri zaten name dizisinin ba\u015flang\u0131\u00e7 adresi idi ve o adresin i\u00e7indeki verinin int8 olarak anlamland\u0131r\u0131lmas\u0131 hakikaten &#8216;O&#8217; karakteri.<\/p>\n<p>p32&#8217;nin durumu biraz daha karma\u015f\u0131k duruyor ama asl\u0131nda olay \u00e7ok basit. Big endian little endian olay\u0131n\u0131 hat\u0131rlars\u0131n\u0131z. <a href=\"http:\/\/www.asciitable.com\/\" target=\"_blank\">Ascii table<\/a>\u00a0konusunu da konu\u015fmu\u015ftuk onu da akl\u0131m\u0131z\u0131n bir k\u00f6\u015fesinde tutal\u0131m. Ve sihirli say\u0131y\u0131 analiz edelim. 0x65677a4f. 0x4F asl\u0131nda &#8216;O&#8217; karakteri [bkz: ASCII table]. 0x7a=&#8217;z&#8217;, 0x67=&#8217;g&#8217;, 0x65=&#8217;e&#8217;. Aaaa, asl\u0131nda bu bizim name dizisindeki ismin int32_t olarak yorumlanm\u0131\u015f hali. \u0130\u015fte i\u015faret\u00e7inin tipi burada devreye giriyor. Ayn\u0131 bellekteki bilgi int32_t olarak (yani 4 byte) i\u015faret ediliyor. Her \u015fey \u015fimdi ayd\u0131nland\u0131.<\/p>\n<p>p8++ dedi\u011fimizde basit\u00e7e p8&#8217;in de\u011feri kendi cinsinden art\u0131r\u0131l\u0131yor. Peki \u00a0p8\u00a0neye e\u015fitti? name dizisinin ba\u015flang\u0131\u00e7 adresine. int8_t tipi 1 byte oldu\u011fundan bu p8&#8217;in yeni de\u011feri name dizisinin ba\u015flang\u0131\u00e7 adresinin 1 fazlas\u0131 oldu.<\/p>\n<p>p32++ dedi\u011fimizde basit\u00e7e p8&#8217;in de\u011feri kendi cinsinden art\u0131r\u0131l\u0131yor. Peki \u00a0p32 neye e\u015fitti? name dizisinin ba\u015flang\u0131\u00e7 adresine. int32_t tipi 4\u00a0byte oldu\u011fundan bu p32&#8217;nin yeni de\u011feri name dizisinin ba\u015flang\u0131\u00e7 adresinin 4\u00a0fazlas\u0131 oldu.<\/p>\n<p>Gerisini yorumlamay\u0131 size b\u0131rak\u0131yorum. Eksik bir nokta olursa \u00e7ekinmeden sorabilirsiniz, payla\u015fabilirsiniz.<\/p>\n<p>Bu arada &amp; ile * birbirlerinin tersidir farketmi\u015fsinizdir. \u00d6rne\u011fin<\/p>\n<pre class=\"lang:autoit decode:true \">*(&amp;p8)<\/pre>\n<p>&nbsp;<\/p>\n<p>dedi\u011fimiz nane asl\u0131nda p8&#8217;nin kendisidir \u00e7\u00fcnk\u00fc * ile &amp; birbirini g\u00f6t\u00fcr\u00fcr. Yine<\/p>\n<pre class=\"lang:c decode:true \">&amp;(*p8)<\/pre>\n<p>&nbsp;<\/p>\n<p>nanesi de\u00a0p8&#8217;in kendisidir ayn\u0131 sebepten.<\/p>\n<p>Sizlere nacizane tavsiyem i\u015faret\u00e7ilerle m\u00fcmk\u00fcn mertebe oynaman\u0131z. \u00a0\u0130\u015faret\u00e7ilerin temeli budur. Bir dahaki yaz\u0131da u\u00e7 noktalara de\u011finece\u011fiz.<\/p>\n<p>Yaz\u0131lar\u0131 be\u011fendiyseniz e\u011fer, \u00a0faydalanabilecek arkada\u015flar\u0131n\u0131zla da payla\u015fabilirseniz sevinirim.<\/p>\n<p>\u015eimdi devam&#8230;<\/p>\n<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=286\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-o-left\" style=\"font-size:13px;color:#FFFFFF\"><\/i> \u00d6nceki Sayfa<\/span><\/a> \u00a0<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=305\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-right\" style=\"font-size:13px;color:#FFFFFF\"><\/i> Sonraki Sayfa<\/span><\/a>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tekrardan merhabalar. Bu g\u00fcn C dilinde pointer olarak adland\u0131r\u0131lan konu \u00fczerine bir yaz\u0131 yazmaya \u00e7al\u0131\u015faca\u011f\u0131m. Yine di\u011fer yaz\u0131larda ufaktan da olsa bahsetti\u011fim i\u015faret\u00e7iler(pointers) hakk\u0131nda fark\u00a0yaratabilece\u011fini\u00a0\u00a0d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm bilgileri payla\u015fmaya \u00e7al\u0131\u015faca\u011f\u0131m. Epeyce bir s\u00fcredir, ne yaz\u0131k ki yeni bir yaz\u0131 yay\u0131mlayamad\u0131m. \u00dclkemizde ya\u015fanan \u00e7ok \u00e7ok \u00fcz\u00fcc\u00fc olaylar, hayat\u0131n d\u00f6nem d\u00f6nem hepimizi vuran yo\u011funlu\u011fu gibi sebeplerle sessiz bir d\u00f6nem <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=294\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_tr_post_content":"Tekrardan merhabalar. Bu g\u00fcn C dilinde pointer olarak adland\u0131r\u0131lan konu \u00fczerine bir yaz\u0131 yazmaya \u00e7al\u0131\u015faca\u011f\u0131m. Yine di\u011fer yaz\u0131larda ufaktan da olsa bahsetti\u011fim i\u015faret\u00e7iler(pointers) hakk\u0131nda fark\u00a0yaratabilece\u011fini\u00a0\u00a0d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm bilgileri payla\u015fmaya \u00e7al\u0131\u015faca\u011f\u0131m.\n\nEpeyce bir s\u00fcredir, ne yaz\u0131k ki yeni bir yaz\u0131 yay\u0131mlayamad\u0131m. \u00dclkemizde ya\u015fanan \u00e7ok \u00e7ok \u00fcz\u00fcc\u00fc olaylar, hayat\u0131n d\u00f6nem d\u00f6nem hepimizi vuran yo\u011funlu\u011fu gibi sebeplerle sessiz bir d\u00f6nem ge\u00e7irdim. Ancak ne olursa olsun, ba\u015flad\u0131\u011f\u0131m\u0131z i\u015fleri bitirmekte fayda var. Bu vesileyle bu yaz\u0131m\u0131n temas\u0131n\u0131 \"vicdan\" olarak belirliyorum.\n\nC dilinin belki de en zor konusudur i\u015faret\u00e7iler (pointers). Nedendir hikmeti tam bilinmez, bir t\u00fcrl\u00fc a\u00e7\u0131k se\u00e7ik a\u00e7\u0131klanamam\u0131\u015ft\u0131r. Benim yorumum \u015fu; i\u015faret\u00e7iler \u00e7o\u011fu zaman basit kurgulanm\u0131\u015f bir yap\u0131 olmad\u0131\u011f\u0131ndan, anlamas\u0131 da \u00e7ok basit de\u011fil. Bu yorumuma kat\u0131lan, kat\u0131lmayan olabilir ancak sebeplerimi kendimce s\u0131ralay\u0131p ard\u0131ndan olay\u0131 a\u00e7\u0131k \u015fekilde anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m. Zira olay\u0131n asl\u0131 olduk\u00e7a basit.\n\n\u0130\u015faret\u00e7iler belle\u011fe kestirme yollardan eri\u015fmeyi sa\u011flar diyebiliriz. \u0130\u015faret\u00e7iler, t\u00fcrl\u00fc potansiyel sorunlar\u0131 beraberinde getirdi\u011finden baz\u0131 dillerde kullan\u0131m\u0131 yasaklanm\u0131\u015ft\u0131r. \u00d6rne\u011fin C#'da pointer kullan\u0131m\u0131n\u0131 a\u00e7mak i\u00e7in kodu g\u00fcvenilmez (unsafe) yazd\u0131\u011f\u0131n\u0131z\u0131 kabul etmeniz beklenmektedir. Y\u00fcksek seviyeli dillerde belle\u011fe do\u011frudan eri\u015fim hakikaten g\u00fcvenilmez kodlar do\u011furabilir ancak C gibi orta seviyeli bir dilde i\u015faret\u00e7i kullanarak bellek eri\u015fimi yapmak, do\u011fru tasar\u0131m kal\u0131plar\u0131 ve prensipler izlendi\u011finde olduk\u00e7a verimli olabilir. Bizim de niyetimiz, i\u015faret\u00e7ileri do\u011fru kullanarak C dilinin g\u00fc\u00e7l\u00fc olan bu yan\u0131na h\u00fckmedebilmek bu sayede de g\u00fczel kodlar yazabilmek.\u00a0S\u0131rf i\u015faret\u00e7iler\u00a0risk unsurlar\u0131 yaratabilir diye, onlara kem g\u00f6zlerle bakmak, onlar\u0131 k\u00f6t\u00fc kullanmak vicdans\u0131zl\u0131k olur diye d\u00fc\u015f\u00fcn\u00fcyorum.\n\n[su_box title=\"\u00d6nemli Nokta\"]\u0130\u015faret\u00e7ilerin temel i\u015flevi: bellekteki bir adres i\u00e7indeki bir dataya eri\u015fim (* operat\u00f6r\u00fc ile) ya da bir de\u011fi\u015fkenin bellekteki adresine eri\u015fim (&amp; operat\u00f6r\u00fc ile) oldu\u011fundan \u00f6nce bir bellek hususunu vicdanlar\u0131n \u00f6n\u00fcne sersek iyi olur diye d\u00fc\u015f\u00fcn\u00fcyorum.[\/su_box]\n\n<strong>Bellek Hakk\u0131nda<\/strong>\n\nBildi\u011finiz \u00fczere bellek dedi\u011fimiz esasen fiziksel bir bilgi deposu oluyor. Bu z\u0131mb\u0131rt\u0131n\u0131n veriyi saklama bi\u00e7imine g\u00f6re iki temel \u00e7e\u015fidi var. Birincisi Volatile Memory denilen \"Ge\u00e7ici Haf\u0131za\". Birisi de Non-Volatile Memory(NVM) denilen \"Kal\u0131c\u0131 Haf\u0131za\". Efendim ne g\u00f6re ge\u00e7ici ya da kal\u0131c\u0131? Elektrik gitti\u011finde g\u00f6sterdi\u011fi davran\u0131\u015fa g\u00f6re. Elektri\u011fi kessek \u00a0(ya da cihaza hard reset atsak) dahi, geri verdi\u011fimizde veriler saklan\u0131yorsa NVM, saklanm\u0131yorsa VM. Misal RAM bir VM'dir yani ge\u00e7ici bellektir. Hard disk veya flash memory ise NVM yani kal\u0131c\u0131 bellektir.\n\n<strong>Pointer (\u0130\u015faret\u00e7i) Nedir?<\/strong>\n\nBiz i\u015faret\u00e7iler ile hem kal\u0131c\u0131 bellekteki hem de ge\u00e7ici bellekteki verilere eri\u015febiliyoruz. \u00c7ok \u00f6nemli oldu\u011fu i\u00e7in tekrar edece\u011fim. Bir i\u015faret\u00e7i iki operat\u00f6r ile ifade edilebilir.\n\n<pre class=\"lang:default decode:true \">*\u00a0Opeta\u00f6r\u00fc: Bellekteki bir adres i\u00e7indeki veriye eri\u015fim. Kullan\u0131m: DegiskeninDegeri=*Adres.\n\n&amp; Operat\u00f6r\u00fc: Bir de\u011fi\u015fkenin adresine eri\u015fim. Kullan\u0131m: Adres = &amp;Degisken;<\/pre>\n\n&nbsp;\n\nArkada\u015flar C dilinde her \u015fey bir de\u011fi\u015fken gibi de\u011ferlendirilebilir demi\u015ftik. Pointer\u00a0da benzer muameleye tabi oldu\u011fundan, onun da bir tipi vard\u0131r. \u00d6rne\u011fin\n\n<pre class=\"lang:c decode:true \">uint8_t *dataPtr;<\/pre>\n\nyukar\u0131daki dataPtr'nin tipi uint8_t* oldu\u011fundan, bu i\u015faret\u00e7i g\u00f6sterdi\u011fi bellek alan\u0131ndaki bilgiyi uint8_t olarak yorumlayacakt\u0131r. Benzer bir yorum farkl\u0131 veri tipleri i\u00e7in de yap\u0131labilir. Misal float* tipindeki bir de\u011fi\u015fken, g\u00f6sterece\u011fi adres i\u00e7indeki veriyi float olarak yorumlayacakt\u0131r. Bu bilgiyi daha detayl\u0131ca a\u00e7\u0131klayaca\u011f\u0131m.\n\n\u0130\u015faret\u00e7ileri anlatman\u0131n en iyi yolu \u00f6rnekler \u00fczerinden gitmektir. \u00d6yleyse a\u015fa\u011f\u0131daki \u00f6rnek \u00fczerinden ba\u015flayal\u0131m.\n\n<pre class=\"lang:default decode:true\">#include &lt;stdint.h&gt;\n\nint32_t main()\n{\nint32_t num;\nint32_t *ptr;\nreturn 0;\n}<\/pre>\n\nBir de\u011fi\u015fken tan\u0131mland\u0131\u011f\u0131nda, ona uygun bir bellek g\u00f6z\u00fc (ya da bellek g\u00f6zleri) tahsis edilir. Hangi bellek olaca\u011f\u0131 i\u015fletim sisteminin ve derleme ortam\u0131n\u0131n takdirindedir. Yukar\u0131daki de\u011fi\u015fkenler farz\u0131 misal 0x2015 adresinden ba\u015flayarak yerle\u015fsin.\n\n<pre class=\"\">        |-----|\n  0x2014|     |   num; 32 bit geni\u015fli\u011finde yer kaplayan bir de\u011fi\u015fkendir.\n        |-----|\n  0x2018|     |   ptr; 32 bit geni\u015fli\u011finde yer kaplayan bir i\u015faret\u00e7idir. \n        |-----|\n  0x201C|     |   belle\u011fin geri kalan\u0131...\n        |-----|\n           :\n<\/pre>\n\n\u015eimdi kodun bir yerlerinde C dilinde \u015funlar\u0131 dersek:\n\n<pre class=\"lang:default decode:true\">num = 42;\nptr = &amp;num;\n<\/pre>\n\nBunlar\u0131n insan dilinde okunu\u015fu \u015f\u00f6yle olur: \"num de\u011fi\u015fkeninin de\u011feri 42'dir. ptr i\u015faret\u00e7isi ise num de\u011fi\u015fkeninin adresine e\u015fittir.\"\n\nTan\u0131mland\u0131\u011f\u0131nda num de\u011fi\u015fkeni 0x2014 numaral\u0131 bellek g\u00f6z\u00fcnde yer almaktayd\u0131 hat\u0131rlay\u0131n. Buna g\u00f6re ptr=0x2014 olmas\u0131 gerekir \u00e7\u00fcnk\u00fc num de\u011fi\u015fkeninin adresi budur. \u00d6teyandan ptr de\u011fi\u015fkeninin adresi 0x2018 oldu\u011fundan, ptr'nin de\u011feri bu adreste saklan\u0131r. Buna g\u00f6re 0x2014 numaral\u0131 bellek g\u00f6z\u00fcnde 42 yazacak, 0x2018 numaral\u0131 bellek g\u00f6z\u00fcnde ise 0x2014 yazacakt\u0131r. Haydi az\u0131c\u0131k zahmet edip \u00e7izelim.\n\n<pre class=\"\">        |------|\n  0x2014| 42   |   num; 32 bit geni\u015fli\u011finde yer kaplayan bir de\u011fi\u015fkendir.\n        |------|\n  0x2018|0x2014|   ptr; 32 bit geni\u015fli\u011finde yer kaplayan bir i\u015faret\u00e7idir. \n        |------|\n  0x201C|      |   belle\u011fin geri kalan\u0131...\n        |------|\n           :\n<\/pre>\n\n&nbsp;\n\n\u015eimdi bu ibretlik bilgiyi s\u0131nayabilece\u011finiz tam bir kodu payla\u015fal\u0131m.\n\n<pre class=\"lang:c decode:true\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\nint32_t main()\n{\n    int32_t num=42;\n    int32_t* ptr;\n    ptr = &amp;num;\n    \n    \n    printf(\"num'un adresi: %x n\", &amp;num);\n    printf(\"ptr'nin degeri: %x n\", ptr);\n    \n    printf(\"num'un degeri: %d n\", num);\n    printf(\"ptr'gosterdigi deger: %d n\", *ptr);\n    \n    printf(\"ptr'nin adresi: %x n\", &amp;ptr);\n    \n    getchar();\n\n        return 0;\n    \n}\n<\/pre>\n\nEfendim bu kodun benim bilgisayar\u0131mdaki \u00e7\u0131kt\u0131s\u0131 \u015f\u00f6yle:\n\n[su_note note_color=\"#ffcc66\"]num'un adresi: 22fe4c\nptr'nin degeri: 22fe4c\nnum'un degeri: 42\nptr'gosterdigi deger: 42\nptr'nin adresi: 22fe40\n\n--------------------------------\nProcess exited with return value 0\nPress any key to continue . . .\n[\/su_note]\n\n<ul>\n    <li>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, num'un adresi hakikaten ptr'nin degerine e\u015fit.<\/li>\n    <li>Ptr'nin\u00a0g\u00f6sterdigi deger hakikaten num'un degerine e\u015fit.<\/li>\n    <li>Ve hakikaten ptr, bir degisken olarak\u00a0bellekte saklaniyor ve adresi num'un adresinden farkl\u0131.<\/li>\n<\/ul>\n\nMevzuyu a\u00e7\u0131k se\u00e7ik g\u00f6sterdik diye d\u00fc\u015f\u00fcn\u00fcyorum. \u015eimdi benzer bir olay\u0131 diziler \u00fczerinde anlatal\u0131m ki ba\u015fka p\u00fcf noktalar\u0131 g\u00f6relim.\n\n<pre class=\"lang:c decode:true\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\nint32_t main()\n{\nint8_t name[] = \"Ozge\";\nint8_t *p8;\nint32_t *p32;\n\np8 = name;\np32 = (int32_t *)name;\n\n    printf(\"name'in adresi: %x rn\", name);\n    printf(\"p8'in degeri: %x rn\", p8);\n    printf(\"p32'nin degeri: %x rn\", p32);\n    \n    printf(\"p8'in gosterdigi deger: %d [%c] rn\", *p8,*p8);\n    printf(\"p32'nin gosterdigi deger: %d [%x] rn\", *p32, *p32);\n    \n    printf(\"p8'in adresi: %x rn\", &amp;p8);\n    printf(\"p32'nin adresi: %x rn\", &amp;p32);\n\n ++p8;\n ++p32;\n    printf(\"rnisaretci degerleri arttiktan sonra!!!rn\");\n    printf(\"p8'in degeri: %x rn\", p8);\n    printf(\"p32'nin degeri: %x rn\", p32);\n \n    printf(\"p8'in gosterdigi deger: %d [%c] rn\", *p8,*p8);\n    printf(\"p32'nin gosterdigi deger: %d [%x] rn\", *p32, *p32);\n    \n    printf(\"p8'in adresi: %x rn\", &amp;p8);\n    printf(\"p32'nin adresi: %x rn\", &amp;p32);\n    \ngetchar();\n}<\/pre>\n\n\u00d6ncelikle kodu okuyarak anlamaya \u00e7al\u0131\u015f\u0131n\u0131z.\n\n\u015eimdi bu \u00e7\u0131kt\u0131lar\u0131 teker teker yorumlayal\u0131m. Ancak \u00f6nce dizinin ve i\u015faret\u00e7ilerin belle\u011fe nas\u0131l yerle\u015fti\u011fini farz-\u0131 misal bir a\u00e7\u0131kalayal\u0131m.\n\n<pre class=\"\">        |---|\n 0x2014 |'O'|  \"name\", tanimlanan dizinin adresidir ve bu ornekte 0x2014'dur.\n        |---|\n 0x2015 |'z'|  int8_t(char): 1 byte\n        |---|\n 0x2016 |'g'|  int8_t(char): 1 byte\n        |---|\n 0x2017 |'e'|  int8_t(char): 1 byte\n        |---|\n 0x2018 |\u0000 |  int8_t(char): 1 byte\n        |---|\n 0x2019 |   |  p8 bir isaretci: adres yolu genisligi kadar\n        |---|\n 0x201D |   |  p32 bir isaretci adres yolu genisligi kadar\n        |---|<\/pre>\n\nBu kodun benim bilgisayar\u0131mdaki \u00e7\u0131kt\u0131s\u0131 a\u015fa\u011f\u0131daki gibi oluyor.\n\n[su_note note_color=\"#ffcc66\"]name'in adresi: 22fe40\np8'in degeri: 22fe40\np32'nin degeri: 22fe40\np8'in gosterdigi deger: 79 [O]\np32'nin gosterdigi deger: 1701280335 [65677a4f]\np8'in adresi: 22fe38\np32'nin adresi: 22fe30\n\nisaretci degerleri arttiktan sonra!!!\n\np8'in degeri: 22fe41\np32'nin degeri: 22fe44\np8'in gosterdigi deger: 122 [z]\np32'nin gosterdigi deger: 0 [0]\np8'in adresi: 22fe38\np32'nin adresi: 22fe30\n\n--------------------------------\nProcess exited with return value 0\nPress any key to continue . . .\n[\/su_note]\n\n\u015eimdi bu \u00e7\u0131kt\u0131lar\u0131 tek tek yorumlay\u0131p ibretleri beynimize indirelim.\n\n\"name\" ile tan\u0131mlanan dizinin ba\u015flang\u0131\u00e7 adresini benim bilgisayar\u0131m 0x22fe40 olarak atam\u0131\u015f. p8 ve p32 i\u015faret\u00e7ilerine name dizisinin ba\u015flang\u0131\u00e7 adresini atad\u0131\u011f\u0131mdan, hakikaten bu iki isaretcinin degeri name dizisinin baslang\u0131\u00e7\u00a0adresi yani 0x22fe40 olmu\u015f. Buraya kadar g\u00fczel, zaten konu\u015ftu\u011fumuz \u015feyler.\n\np8'in g\u00f6sterdi\u011fi de\u011fer 'O' karakteri yani 79 say\u0131s\u0131 olmu\u015f. Bu normal \u00e7\u00fcnk\u00fc p8'in de\u011feri zaten name dizisinin ba\u015flang\u0131\u00e7 adresi idi ve o adresin i\u00e7indeki verinin int8 olarak anlamland\u0131r\u0131lmas\u0131 hakikaten 'O' karakteri.\n\np32'nin durumu biraz daha karma\u015f\u0131k duruyor ama asl\u0131nda olay \u00e7ok basit. Big endian little endian olay\u0131n\u0131 hat\u0131rlars\u0131n\u0131z. <a href=\"http:\/\/www.asciitable.com\/\" target=\"_blank\">Ascii table<\/a>\u00a0konusunu da konu\u015fmu\u015ftuk onu da akl\u0131m\u0131z\u0131n bir k\u00f6\u015fesinde tutal\u0131m. Ve sihirli say\u0131y\u0131 analiz edelim. 0x65677a4f. 0x4F asl\u0131nda 'O' karakteri [bkz: ASCII table]. 0x7a='z', 0x67='g', 0x65='e'. Aaaa, asl\u0131nda bu bizim name dizisindeki ismin int32_t olarak yorumlanm\u0131\u015f hali. \u0130\u015fte i\u015faret\u00e7inin tipi burada devreye giriyor. Ayn\u0131 bellekteki bilgi int32_t olarak (yani 4 byte) i\u015faret ediliyor. Her \u015fey \u015fimdi ayd\u0131nland\u0131.\n\np8++ dedi\u011fimizde basit\u00e7e p8'in de\u011feri kendi cinsinden art\u0131r\u0131l\u0131yor. Peki \u00a0p8\u00a0neye e\u015fitti? name dizisinin ba\u015flang\u0131\u00e7 adresine. int8_t tipi 1 byte oldu\u011fundan bu p8'in yeni de\u011feri name dizisinin ba\u015flang\u0131\u00e7 adresinin 1 fazlas\u0131 oldu.\n\np32++ dedi\u011fimizde basit\u00e7e p8'in de\u011feri kendi cinsinden art\u0131r\u0131l\u0131yor. Peki \u00a0p32 neye e\u015fitti? name dizisinin ba\u015flang\u0131\u00e7 adresine. int32_t tipi 4\u00a0byte oldu\u011fundan bu p32'nin yeni de\u011feri name dizisinin ba\u015flang\u0131\u00e7 adresinin 4\u00a0fazlas\u0131 oldu.\n\nGerisini yorumlamay\u0131 size b\u0131rak\u0131yorum. Eksik bir nokta olursa \u00e7ekinmeden sorabilirsiniz, payla\u015fabilirsiniz.\n\nBu arada &amp; ile * birbirlerinin tersidir farketmi\u015fsinizdir. \u00d6rne\u011fin\n\n<pre class=\"lang:autoit decode:true \">*(&amp;p8)<\/pre>\n\n&nbsp;\n\ndedi\u011fimiz nane asl\u0131nda p8'nin kendisidir \u00e7\u00fcnk\u00fc * ile &amp; birbirini g\u00f6t\u00fcr\u00fcr. Yine\n\n<pre class=\"lang:c decode:true \">&amp;(*p8)<\/pre>\n\n&nbsp;\n\nnanesi de\u00a0p8'in kendisidir ayn\u0131 sebepten.\n\nSizlere nacizane tavsiyem i\u015faret\u00e7ilerle m\u00fcmk\u00fcn mertebe oynaman\u0131z. \u00a0\u0130\u015faret\u00e7ilerin temeli budur. Bir dahaki yaz\u0131da u\u00e7 noktalara de\u011finece\u011fiz.\n\nYaz\u0131lar\u0131 be\u011fendiyseniz e\u011fer, \u00a0faydalanabilecek arkada\u015flar\u0131n\u0131zla da payla\u015fabilirseniz sevinirim.\n\n\u015eimdi devam...\n\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=286\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=305\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]\n\n&nbsp;","_tr_post_name":"gomulu-sistemler-23-gomulu-c-isaretciler","_tr_post_excerpt":"","_tr_post_title":"G\u00f6m\u00fcl\u00fc C - 13 : \u0130\u015faret\u00e7iler","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"tr","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[2,3],"tags":[],"class_list":["post-294","post","type-post","status-publish","format-standard","hentry","category-elektronik","category-gomulu-sistemler"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-4K","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=294"}],"version-history":[{"count":1,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/294\/revisions"}],"predecessor-version":[{"id":568,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/294\/revisions\/568"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=294"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}