Endorfin35+
Kayıtsız Üye
- Katılım
- 1 Mayıs 2020
- Mesajlar
- 4,409
Bu başlık altında C dilince dizi tanımlama, pointerlar ve ilişkileri hakkında öğrendiğim bilgileri toparlayarak paylaşacağım. Hatalı bilgiler görürseniz bildiriniz.
Kaynak : https://www.geeksforgeeks.org/
Bellek (Ram) :
Programın çalışma zamanında veriler rem üzerinde oluşturulur ve saklanır. Rem 8 bit/1 bayt kapasiteli depolama alanlarından oluşur.
Bu veri depoalama alanlarına ulaşabilmek için her alan bir adrese sahiptir. Rem adresleri genellkile 16 sayı tabanında gösterilirler. Sisteminde ram kapasitesi kadar adres bulunur.
Değişkenler:
Herhangi bir değişken tanımlandığı anda c dili bizim için rem üzerinde tanımlanan türün kapasitesi kadar yer ayırır.
Örneğin integer türünde bir değişken tanımladığımızda,
int a; tanımlamasını (declaretion) yaptığımızda, C dili (aslında işletim sistemi) Ram üzerinde şu an bilmediğimiz herhangi bir yerde (adreste) bizim için int türünün kapasitesi kadar bellek alanı ayırır. int türü genellikle 4 byte kapasiteli olmakla beraber bu durum kullanılan sisteme göre değişiklik gösterebilir. Tanımladığımız değişkenin kapasiteni öğrenmek için sizeof() fonksiyonu kullanılabilir.
int türü için 4 byte kullanıldığını doğruladık ve int a tanımlaması için ramde yukarıda turuncu renki alanın bizim a değişkenimiz içn ayrıldığını söyeleyebiliriz.
5 adet in türü değişken tanımlayarak değer atamadan mevcut değerlerine bakalım;
Değer olarak anlık hafızanın ayrılan bölümünde ne değer var ise onu alıyoruz. Tesadüfen o alan boş ise veriler sıfır olarakta dönebilir...
Peki birde a ya değer atayalım... (Değişkenlere ilk defa değer atanmasına ilklendirme / initializing denir.)
Bize ayrılan hafıza alanında artık sadece atadığımız 65 değeri var. artık verileri silerek üzerine 65 yazdık...
Peki sistem a değişkenin remin neresinde olduğunu nereden biliyor..? a değişkenin bulunduğu pozisyonun bir adresi var. a değişkenimiz bu adresi temsil ediyor. Biz a üzerinde bir işlem yaptığımızda aslında a nın sahip olduğu adreste işlem yapıyoruz.
a nın adresini öğrenelim...
a değişkenimiz aslında 0x7fffffffdd64 adresini temsil ediyor...
Normalde program içersinde birden çok farklı türlerde değişkenlerimiz bulunur. Sistem bu değişkenler kendi uygun gördüğü (bize göre rastegele görünen) adreslerde depolar. Biz sadece o alandaki içeriği değiştiririz.
birkaç farklı değişken tanımlayalaım.
Değişkenlerimizin rem üzerine yukarıdaki tablodaki gibi yerleştiğini görüyoruz. Buradaki yerleşim düzeninden bir anlam çıkarmamalıyız bu yerleşim düzeni bizim kontrolümüzün dışında...
Birde dizi tanımlayarak dumuna bakalım.
Burada ise bizim için önemli bir detay var. Dizi tanımlandığı zaman dizi elemanları ram üzerinde sıralı olarak yerleştiriliyor. Bu yerleşimlerin faydalarını pointer konusunda daha detaylı anlayacağız. şimdilik yerleşimleri zihnimizde görselleştirmek adına bir aşama sağladık...
Kaynak : https://www.geeksforgeeks.org/
Öncelikle yukarıdaki tabloyu paylşamak istiyorum. Tablo C dilinde değer (veri) taşıyan öğeleri gruplandırarak göstermekte. Soldaki birinci grup temel değişkenleri kapsamakta ve bu gurupta hepimizin bir şekilde bildiği ineteger, float, boolean gibi değişkenler yer almakta. Ortadaki grup fonksiyonlar, diziler, pointerlar ı kapsamakta ve son grup ise kullanıcı tarafından oluşturulan veri türlerini kapasamakta. Şimdi düşündüğüm zaman soldaki temel değişkenler diğer grupların içerisinde de yer almakta. Değişken var ise veri vardır. Veri var ise bellek kullanımı vardır...
Bellek (Ram) :
Programın çalışma zamanında veriler rem üzerinde oluşturulur ve saklanır. Rem 8 bit/1 bayt kapasiteli depolama alanlarından oluşur.
Bu veri depoalama alanlarına ulaşabilmek için her alan bir adrese sahiptir. Rem adresleri genellkile 16 sayı tabanında gösterilirler. Sisteminde ram kapasitesi kadar adres bulunur.
Değişkenler:
Herhangi bir değişken tanımlandığı anda c dili bizim için rem üzerinde tanımlanan türün kapasitesi kadar yer ayırır.
Örneğin integer türünde bir değişken tanımladığımızda,
C:
int a;
int a; tanımlamasını (declaretion) yaptığımızda, C dili (aslında işletim sistemi) Ram üzerinde şu an bilmediğimiz herhangi bir yerde (adreste) bizim için int türünün kapasitesi kadar bellek alanı ayırır. int türü genellikle 4 byte kapasiteli olmakla beraber bu durum kullanılan sisteme göre değişiklik gösterebilir. Tanımladığımız değişkenin kapasiteni öğrenmek için sizeof() fonksiyonu kullanılabilir.
C:
#include <stdio.h>
int main()
{
int a;
printf("%lu \n",sizeof(a));
}
Program Çıktısı:
4
int türü için 4 byte kullanıldığını doğruladık ve int a tanımlaması için ramde yukarıda turuncu renki alanın bizim a değişkenimiz içn ayrıldığını söyeleyebiliriz.
5 adet in türü değişken tanımlayarak değer atamadan mevcut değerlerine bakalım;
C:
#include <stdio.h>
int main()
{
int a,b,c,d,e;
printf("%d \n",a);
printf("%d \n",b);
printf("%d \n",c);
printf("%d \n",d);
printf("%d \n",e);
}
Program Çıktısı:
21845
-8608
32767
0
0
Değer olarak anlık hafızanın ayrılan bölümünde ne değer var ise onu alıyoruz. Tesadüfen o alan boş ise veriler sıfır olarakta dönebilir...
Peki birde a ya değer atayalım... (Değişkenlere ilk defa değer atanmasına ilklendirme / initializing denir.)
C:
int a=65;
Bize ayrılan hafıza alanında artık sadece atadığımız 65 değeri var. artık verileri silerek üzerine 65 yazdık...
Peki sistem a değişkenin remin neresinde olduğunu nereden biliyor..? a değişkenin bulunduğu pozisyonun bir adresi var. a değişkenimiz bu adresi temsil ediyor. Biz a üzerinde bir işlem yaptığımızda aslında a nın sahip olduğu adreste işlem yapıyoruz.
a nın adresini öğrenelim...
C:
#include <stdio.h>
int main()
{
int a=65;
printf("%d \n",a);
printf("%p \n",&a); // değişkenin adresini "&" işareti ile öğreniyoruz.
}
Program Çıktısı:
65
0x7fffffffdd64
a değişkenimiz aslında 0x7fffffffdd64 adresini temsil ediyor...
Normalde program içersinde birden çok farklı türlerde değişkenlerimiz bulunur. Sistem bu değişkenler kendi uygun gördüğü (bize göre rastegele görünen) adreslerde depolar. Biz sadece o alandaki içeriği değiştiririz.
birkaç farklı değişken tanımlayalaım.
C:
#include <stdio.h>
int main()
{
int a=65;
bool b=false;
char c='A';
int d=66;
int e=67;
float f=3.12;
printf("a değişkenin adresi : %p \t kapladigi alan : %lu byte \n",&a,sizeof(a));
printf("b değişkenin adresi : %p \t kapladigi alan : %lu byte \n",&b,sizeof(b));
printf("c değişkenin adresi : %p \t kapladigi alan : %lu byte \n",&c,sizeof(c));
printf("d değişkenin adresi : %p \t kapladigi alan : %lu byte \n",&d,sizeof(d));
printf("e değişkenin adresi : %p \t kapladigi alan : %lu byte \n",&e,sizeof(e));
printf("f değişkenin adresi : %p \t kapladigi alan : %lu byte \n",&f,sizeof(f));
}
Program Çıktısı:
a değişkenin adresi : 0x7fffffffdd58 kapladigi alan : 4 byte
b değişkenin adresi : 0x7fffffffdd56 kapladigi alan : 1 byte
c değişkenin adresi : 0x7fffffffdd57 kapladigi alan : 1 byte
d değişkenin adresi : 0x7fffffffdd5c kapladigi alan : 4 byte
e değişkenin adresi : 0x7fffffffdd60 kapladigi alan : 4 byte
f değişkenin adresi : 0x7fffffffdd64 kapladigi alan : 4 byte
Değişkenlerimizin rem üzerine yukarıdaki tablodaki gibi yerleştiğini görüyoruz. Buradaki yerleşim düzeninden bir anlam çıkarmamalıyız bu yerleşim düzeni bizim kontrolümüzün dışında...
Birde dizi tanımlayarak dumuna bakalım.
C:
#include <stdio.h>
int main()
{
int a[3]={10,11,12};
printf("a dizisinin adresi : %p \t kapladigi alan : %lu byte \n\n",a,sizeof(a));
printf("a dizisinin 1.elemanın adresi : %p \n", &a[0]);
printf("a dizisinin 2.elemanın adresi : %p \n", &a[1]);
printf("a dizisinin 3.elemanın adresi : %p \n", &a[2]);
}
Program Çıktısı:
a dizisinin adresi : 0x7fffffffdd5c kapladigi alan : 12 byte
a dizisinin 1.elemanın adresi : 0x7fffffffdd5c
a dizisinin 2.elemanın adresi : 0x7fffffffdd60
a dizisinin 3.elemanın adresi : 0x7fffffffdd64
Burada ise bizim için önemli bir detay var. Dizi tanımlandığı zaman dizi elemanları ram üzerinde sıralı olarak yerleştiriliyor. Bu yerleşimlerin faydalarını pointer konusunda daha detaylı anlayacağız. şimdilik yerleşimleri zihnimizde görselleştirmek adına bir aşama sağladık...
Ekler
Son düzenleme: