Bu yazıda, C programlama dilinin en güçlü özelliklerinden biri olan göstericilere değineceğiz. Göstericiler, C'nin yönetilmesi en zor yeteneklerinden biridir. Göstericiler, programların referansa göre çağırma yapmasını ve bağlı listeler, sıralar, yığınlar ve ağaçlar gibi büyüyüp küçülebilen dinamik veri yapılarının oluşturulmasıyla, yönetilmesini sağlar. Bu yazıda, temel gösterici kavramlarına değineceğiz. Hadi başlayalım :)



Gösterici DeÄŸiÅŸkenlerini Bildirmek 

Göstericiler, adres bilgilerini saklamak ve adreslerle ilgili işlemler yapmak için kullanılan nesnelerdir. Normalde bir değişken doğrudan kesin bir değer içerir. Göstericiler ise kesin bir değer tutan değişkenlerin adresini içerir. Bu durumda, bir değişken ismi bir değeri doğrudan belirtirken, göstericiler değerleri dolaylı yoldan belirtir.

Gösterici bildirimlerinin genel biçimi şöyledir:

<tür> * <gösterici_ismi>;

<tür> göstericinin (içerisindeki adresin) türüdür. char, floan, int ... gibi herhangi bir türdür.
Burada * göstericiyi ya da adresi temsil etmektedir.

int *sayiciPtr, sayici;
Biçiminde bir bildirim, sayiciPtr değişkenini int * (bir tamsayıyı gösteren gösterici) tipinde bildirir. Bu bildirim "sayiciPtr bir int göstericisidir" ya da "sayiciPtr, tamsayı tipinde bir nesneyi gösterir" biçiminde okunur. Ayrıca, sayici değişkeni de bir tamsayı olarak bildirilmiştir. Bildirim içindeki * yalnızca sayiciPtr'ye uygulanır

Örnek gösterici bildirimleri:

float *f;
char *s;
int *dizi;
...

Gösterici Operatörleri

& ya da adres operatörü, operandının adresini döndüren bir tekli operatördür. ÖrneÄŸin;

int y = 5;
int *yPtr;

bildirimlerini ele aldığımızda

yPtr = &y;

ifadesi, y değişkeninin adresini yPtr gösterici değişkenine atar. Buna, yPtr değişkeni y'yi göstermektedir denir.

Örnek:

#include <stdio.h> // Ekran girdi ve çıktılarını sağlamak için fonksiyon kütüphanemizi çağırıyoruz


    int main(){//ana fonksiyonumuzu baÅŸlatıyoruz.
        char degisken='a';
        char *gosterici=&degisken;

        printf("Ilk gosterici degeri : %X\n",gosterici);
        gosterici++;

        printf("Bir sonraki gosterici degeri : %X\n",gosterici);
        gosterici+=5;

        printf("Alti sonraki gosterici degeri : %X\n",gosterici);
        
        /*
        Ekran Çıktısı :
        Ilk gosterici degeri : 62FE17
        Bir sonraki gosterici degeri : 62FE18
        Alti sonraki gosterici degeri : 62FE1D
        */

        return 0; // programın sorusuz çalıştığını iÅŸletim sistemine bildiriyoruz.
    }

Fonksiyonları Referansa Göre Çağırmak

Bir fonksiyona argüman geçirmenin iki yolu vardır: deÄŸere göre ve referansa göre çağırma. Bir çok fonksiyon, çağırıcıdaki bir ya da birden Ã§ok deÄŸiÅŸkeni deÄŸiÅŸtirebilme yeteneÄŸine veya deÄŸere göre çağırmanın yükünden (bu nesnenin bir kopyasının oluÅŸturulmasını gerektirir) kurtulmak için büyük bir veri nesnesini gösteren göstericiyi geçirmeye ihtiyaç duyarlar. Bu amaçlar için C, referansa göre çağırma yeteneklerini sunar.

Örnek:

#include <stdio.h>
int degereGoreKup ( int ); /* prototip */

int main( ){

    int sayi = 5;

    printf( "Sayının esas deÄŸeri %d", sayi);
    sayi = degereGoreKup ( sayi );
    printf( "\nSayının yeni deÄŸeri %d\n", sayi);

    return 0;
}
int degereGoreKup( int n )
{
    return n * n * n; /* yerel deÄŸiÅŸken n’in küpünü al*/
}

Çıktı:

Sayının esas değeri 5
Sayının yeni değeri 125


Göstericilerin Artırılması ve Eksiltilmesi

Göstericiler *,/,%,... gibi aritmetik operatörlerle ve bit operatörleriyle kullanılmazlar. Fakat, bir gösterici tamsayılı artırılabilir ya da eksiltilebilir. Örneğin p bir gösterici olmak üzere aşağıdaki ifadelerin hepsi geçerlidir.

++p;
p = p - 2;
p += 4;
p -= 10;
--p;
...

Göstericiler yalnızca tamsayılı sabitleri ile değil tamsayı değişkenleriyle de artırılıp azaltılabilir.

char *p;
int a;
...
p = p + a;
p = p - 2;
p += a;
p = p + a + 10;

Göstericiler ve Diziler Arasındaki İliÅŸki   

Diziler ve göstericiler, C‘de özel bir biçimde iliÅŸkilidirler ve birbirleri yerine hemen hemen
her yerde kullanılabilirler. Bir dizi ismi, sabit bir gösterici olarak düşünülebilir. Göstericiler,
dizilerin belirteçlerle gösterimi de dahil olmak üzere her işlemde kullanılabilir.

b[5] tamsayı dizisinin ve bPtr tamsayı göstericisinin bildirildiğini varsayalım. Bir belirteç
kullanmayan dizi isminin, dizinin ilk elemanını gösteren bir gösterici olduğunu bildiğimize
göre, bPtr ‘yi b dizisinin ilk elemanına aÅŸağıdaki ifade ile eÅŸitleyebiliriz.

bPtr =b;

Bu ifade, dizinin ilk elemanının adresini aşağıdaki biçimde almakla eşdeğerdir.

bPtr = &b[0];

b[3] dizi elemanı, alternatif bir biçimde;

*(bPtr+3)

gösterici deyimi ile belirtilebilir.

Yukarıdaki deyimde 3, göstericinin offsetidir. Gösterici, dizinin başlangıç adresini
gösterirken, offset dizinin hangi elemanının kullanılacağını belirtir ve offset değeri dizi
belirteciyle eştir. Az önceki gösterime gösterici/offset gösterimi denir. Parantezler gereklidir
çünkü * operatörünün önceliği + operatörünün önceliğinden yüksektir. Parantezler olmadan
yukarıdaki ifade, *bPtr‘ye 3 eklerdi. (yani, bPtr‘nin dizinin baÅŸlangıcını gösterdiÄŸi
düşünülürse, b[0] 'a 3 eklenirdi.) Dizi elemanlarının, gösterici deyimleri ile belirtilebilmesi
gibi

&b[3]
adresi de

bPtr+3

biçimindeki gösterici deyimi ile belirtilebilir.
Dizinin kendisine de bir gösterici olarak davranılabilir ve göstericiği aritmetiğinde
kullanılabilir. Örneğin,

*(b+3)

deyimi de b[3] dizi elemanını belirtir. Genelde belirteç kullanan tüm dizi deyimleri, gösterici
ve offset ile yazılabilir. Bu durumda, gösterici/offset gösterimi, dizinin ismini gösterici olarak
kullanır. Az önceki ifadenin, dizinin ismini değiştirmediğine dikkat ediniz. b, hala dizinin ilk
elemanını göstermektedir.
Göstericiler de diziler gibi belirteçlerle kullanılabilir. Örneğin,

bPtr[1]

deyimi, b[1] dizi elemanını belirtir. Buna, gösterici/belirteç gösterimi denir.

Dizi isminin, her zaman dizinin başlangıcını gösteren sabit bir gösterici olduğunu hatırlayınız.
Bu sebepten,

b+=3

deyimi geçersizdir çünkü dizi isminin değerini, gösterici aritmetiği kullanarak değiştirmeye
çalışmaktadır.

Örnek:

#include <stdio.h>

int main( )
{
int b[ ] = { 10, 20, 30, 40 };
int *bPtr = b; /* bPtr b dizisini göstersin */
int i, offset;
printf( "b dizisi asağıdaki metodla yazılmıstır:\n"
"Dizi belirteçleri yöntemi\n" );
for ( i = 0; i < 4; i++ )
printf( "b[ %d ] = %d\n", i, b[ i ] );

printf( "\nGösterici/offset yöntemi,\n"
"gösterici dizinin ismidir\n" );

for ( offset = 0; offset < 4; offset++ )
printf( "*( b + %d ) = %d\n", offset, *( b + offset ) );

printf( "\nGösterici belirteç yöntemi\n" );

for ( i = 0; i < 4; i++ )
printf( " bPtr[ %d ] = %d\n", i, bPtr[ i ] );
printf( "\nGösterici/offset yöntemi\n" );

for ( offset = 0; offset < 4; offset++ )
printf( "*( bPtr + %d ) = %d\n", offset, *( bPtr + offset ) );
return 0;
}

Çıktı:

b dizisi aĢağıdaki metodla yazılmıĢtır:
Dizi belirteçleri yöntemi
b[0] = 10
b[1] = 20
b[2] = 30
b[3] = 40
Gösterici/offset yöntemi
gösterici dizinin ismidir
*(b + 0) = 10
*(b + 1) = 20
*(b + 2) = 30
*(b + 3) = 40
Gösterici belirteç yöntemi
bPtr[0] = 10
bPtr[0] = 20
bPtr[0] = 30
bPtr[0] = 40
Gösterici/offset yöntemi
*(bPtr + 0) = 10
*(bPtr + 1) = 20
*(bPtr + 1) = 30
*(bPtr + 1) = 40


C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:

Kaynaklar:
A'dan Z'ye C Kılavuzu 
Deitel C/C++
 Bu yazıda HC-SR04 ultrasonik sensörün nasıl çalıştığını ve Arduino ile nasıl kullanılacağına deÄŸineceÄŸiz. Bu sensör, Arduino ile mesafeyi ölçmek ve engellerden kaçınan robotlar yapmak için en popüler sensördür.

HC-SR04 Donanıma Genel Bakış

HC-SR04, 2 cm ila 400 cm (yaklaşık bir inç ila 13 fit) aralığına sahip, uygun fiyatlı ve kullanımı kolay bir mesafe ölçüm sensörüdür.

Sensör, iki ultrasonik dönüştürücüden oluşur. Biri ultrasonik ses darbeleri veren verici, diğeri ise yansıyan dalgaları dinleyen alıcıdır. Temel olarak denizaltılarda su altı nesnelerini tespit etmek için kullanılan bir SONAR'dır.


İşte ana özellikleri:

Operating Voltage5V DC
Operating Current15mA
Operating Frequency40KHz
Min Range2cm / 1 inch
Max Range400cm / 13 feet
Accuracy3mm
Measuring Angle<15°
Dimension45 x 20 x 15mm

HC-SR04 Ultrasonik Sensör Pinleri

İşte sensörün pin çıkışı:



Sensörün 4 pini vardır. VCC ve GND, Arduino'daki 5V ve GND pinlerine, Trig ve Echo ise herhangi bir dijital Arduino pinine gider. Trig pinini kullanarak vericiden ultrason dalgasını göndeririz ve Echo pini ile yansıyan sinyali dinleriz.

HC-SR04 Ultrasonik Sensör Arduino Kodu

İşte HC-SR04 ultrasonik sensör ve Arduino kullanarak mesafeyi ölçmek için bir kod.

// defines pins numbers const int trigPin = 9; const int echoPin = 10; // defines variables long duration; int distance; void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(9600); // Starts the serial communication } void loop() { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculating the distance distance = duration * 0.034 / 2 ;
// Prints the distance on the Serial Monitor Serial.print("Distance: "); Serial.println(distance); }

Kod Açıklama

Öncelikle Trig ve Echo pinlerini tanımlamamız gerekiyor. Bu durumda Arduino Board üzerindeki 9 ve 10 numaralı pinlerdir ve trigPin ve echoPin olarak adlandırılırlar. Ardından sensörden alacağımız seyahat süresi için “duration” adında bir long deÄŸiÅŸkenine ve mesafe için bir tamsayı deÄŸiÅŸkenine ihtiyacımız var.

// defines pins numbers const int trigPin = 9; const int echoPin = 10; // defines variables long duration; int distance;

Kurulumda trigPin'i çıkış olarak ve echoPin'i Giriş olarak tanımlamalı ve sonuçları seri monitörde göstermek için seri iletişimi başlatmalıyız.

void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(9600); // Starts the serial communication }

Döngüde ilk önce trigPin'in temiz olduğundan emin olmalıyız, bu nedenle bu pimi sadece 2 µs için LOW Duruma ayarlamanız gerekir. Şimdi Ultra ses dalgasını oluşturmak için trigPin'i 10 µs için HIGH Duruma ayarlamamız gerekiyor.

// Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);

pulseIn() iÅŸlevini kullanarak seyahat süresini okuruz ve bu deÄŸeri “duration” deÄŸiÅŸkenine koyarız. Bu fonksiyonun 2 parametresi vardır, birincisi Echo pininin adı, ikincisi ise okuduÄŸumuz darbenin LOW veya HIGH durumudur.

// Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH);

Mesafeyi bulmak için süreyi 0.034 ile çarpacağız ve daha önce bu denklemi açıkladığımız gibi 2'ye böleceğiz.

// Calculating the distance distance= duration*0.034/2; // Prints the distance on the Serial Monitor Serial.print("Distance: "); Serial.println(distance);

Sonunda mesafenin değerini Seri Monitöre yazdıracağız.


Kaynak:
https://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/
https://www.tutorialspoint.com/arduino/arduino_ultrasonic_sensor.htm#


Bu yazıda, programlama dillerinin en önemli veri yapıları olan arrays(diziler) inceleyeceğiz. C programlama dilinde dizi veri yapısının nasıl oluşturulduğunu ve nasıl kullanıldığına değineceğiz.

Adres Kavramı

Adres hem donanıma hem de yazılıma ilişkin bir kavramdır. Donanımsal olarak bellekte yer gösteren bir sayıdan ibarettir. Mikroişlemci bellekte bir bölgeye ancak o bölgenin adres bilgisiyle erişebilir. Oysa yazılımsal olarak adres, yalnızca bellek bölgesinin yerini gösteren bir sayıdan ibaret değildir; aynı zamanda o bellek bölgesinde bulunan bilginin nasıl ele alınacağını belirten bir tür bilgisini de içermektedir.

Bellekteki her byte diÄŸerinden farklı bir adresle temsil edilir. Sıfırdan baÅŸlayarak her byte’a artan sırada bir sayı karşılık getirerek elde edilen adresleme sistemine doÄŸrusal adresleme sistemi, bu sistem kullanılarak elde edilen adreslere de doÄŸrusal adresler (linear address) denilmektedir.

Diziler (Arrays)

Dizi, birden çok değer depolayabilen bir değişkendir. Örneğin 100 tane tamsayı saklamak istiyorsanız bunu dizilerle yapabilirsiniz. Yani bellekte sürekli bir biçimde bulunan aynı türden nesnelerin oluşturduğu kümeye dizi diyoruz. Tanımdan da anlaşılacağı gibi diziyi dizi yapan iki temel özellik vardır:

  •        Elemanlarının bellekte sürekli bir biçimde bulunması
  •        Elemanların aynı türden nesneler olması

Dizi bildirim işleminin genel biçimi aşağıdaki gibidir:

<Tür> <Dizi_İsmi>[<Eleman_Sayısı>]

Örnek dizi bildirimleri:

char s[30];
float real[10];
double max[100];

Dizilere değer eklemek için küme parantezleri içinde virgülle ayrılmış bir liste kullanılır:

int myNumbers[] = {25, 50, 75, 100};

Şimdi dört tamsayıdan oluşan bir dizi tanımladık.


Dizi Elemanlarına Erişim


Dizi elemanlarına erişebilmek için indeks operatörü kullanılır. İndeks operatörü aslında bir gösterici(pointer) operatörüdür.
Dizi indeksleri 0 ile başlar: [0] ilk elemandır, [1] ikinci elemandır vb.

Örnek:

#include <stdio.h>
int main() {
  int myNumbers[] = {25, 50, 75, 100};
  printf("%d", myNumbers[0]);
}

Çıktı:

25

Dizi Elemanının Değiştirilmesi

Belirli bir elemanın değerini değiştirmek için indeks numarasının bilmesi gerekiyor:

myNumbers[0] = 33;

bu şekilde 0. İndeksteki elemanın değeri 33 ile değiştirilir.

Örnek:

#include <stdio.h>
int main() {
  int myNumbers[] = {25, 50, 75, 100};
  myNumbers[0] = 33;
  printf("%d", myNumbers[0]);
}

Çıktı:

33

For döngüsü kullanılarak dizi elemanlarına ulaşılabilir.

#include <stdio.h>
int main() {
  int myNumbers[] = {25, 50, 75, 100};
  int i;
  for (i = 0; i < 4; i++) {
    printf("%d\n", myNumbers[i]);
  }
}

Çıktı:

25
50
75
100

Örnek:

#include <stdio.h>
int main() {
  int myNumbers[4];
  myNumbers[0] = 25;
  myNumbers[1] = 50;
  myNumbers[2] = 75;
  myNumbers[3] = 100;
  printf("%d\n", myNumbers[0]);
}

Çıktı:

25


Çok Boyutlu Diziler

C’de çok boyutlu diziler içsel olarak tek boyutlu dizi biçiminde saklanır. Çok boyutlu dizi bildirimlerinin genel biçimi aÅŸağıdaki gibidir:

<tür> [n1 ],[n2],[n3],…

Boyut uzunluklarını belirten n1,n2,n3,… sabit ifadeler olmak zorundadır. ÖrneÄŸin:

int x[10][20];

Burada x iki boyutlu int türünden bir dizidir. Boyut uzunlukları sırasıyla 10 ve 20’dir.

double n[5] [10] [15];

n üç boyutlu double türünde bir dizidir. Boyut uzunlukları sırasıyla 5,10,15’dir.
Burada x, iki boyutlu bir dizidir. Dizi 12 eleman tutabilir. Diziyi 3 satırlı ve her satırda
4 sütunlu bir tablo olarak düşünebilirsiniz.

float x [3][4];



Çok Boyutlu Bir Diziyi Başlatma

İki boyutlu ve üç boyutlu dizileri şu şekilde başlatabilirsiniz:

int c[2][3] = {{1, 3, 0}, {-1, 5, 9}};
        
int c[][3] = {{1, 3, 0}, {-1, 5, 9}};
               
int c[2][3] = {1, 3, 0, -1, 5, 9};
 
int test[2][3][4] = {
    {{3, 4, 2, 3}, {0, -3, 9, 11}, {23, 12, 23, 2}},
    {{13, 4, 56, 3}, {5, 9, 3, 5}, {3, 1, 4, 9}}};
 
Örnek: 

Değerleri saklamak ve yazdırmak için iki boyutlu dizi:

// C program to store temperature of two cities of a week and display it.
#include <stdio.h>
const int CITY = 2;
const int WEEK = 7;
int main()
{
  int temperature[CITY][WEEK];
 
  // Using nested loop to store values in a 2d array
  for (int i = 0; i < CITY; ++i)
  {
    for (int j = 0; j < WEEK; ++j)
    {
      printf("City %d, Day %d: ", i + 1, j + 1);
      scanf("%d", &temperature[i][j]);
    }
  }
  printf("\nDisplaying values: \n\n");
 
  // Using nested loop to display vlues of a 2d array
  for (int i = 0; i < CITY; ++i)
  {
    for (int j = 0; j < WEEK; ++j)
    {
      printf("City %d, Day %d = %d\n", i + 1, j + 1, temperature[i][j]);
    }
  }
  return 0;
}

Çıktı:

City 1, Day 1: 33
City 1, Day 2: 34
City 1, Day 3: 35
City 1, Day 4: 33
City 1, Day 5: 32
City 1, Day 6: 31
City 1, Day 7: 30
City 2, Day 1: 23
City 2, Day 2: 22
City 2, Day 3: 21
City 2, Day 4: 24
City 2, Day 5: 22
City 2, Day 6: 25
City 2, Day 7: 26

 
Displaying values:
 
City 1, Day 1 = 33
City 1, Day 2 = 34
City 1, Day 3 = 35
City 1, Day 4 = 33
City 1, Day 5 = 32
City 1, Day 6 = 31
City 1, Day 7 = 30
City 2, Day 1 = 23
City 2, Day 2 = 22
City 2, Day 3 = 21
City 2, Day 4 = 24
City 2, Day 5 = 22
City 2, Day 6 = 25
City 2, Day 7 = 26

 


Örnek: 

iki matrisin toplamı:


// C program to find the sum of two matrices of order 2*2
 
#include <stdio.h>
int main()
{
  float a[2][2], b[2][2], result[2][2];
 
  // Taking input using nested for loop
  printf("Enter elements of 1st matrix\n");
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("Enter a%d%d: ", i + 1, j + 1);
      scanf("%f", &a[i][j]);
    }
 
  // Taking input using nested for loop
  printf("Enter elements of 2nd matrix\n");
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("Enter b%d%d: ", i + 1, j + 1);
      scanf("%f", &b[i][j]);
    }
 
  // adding corresponding elements of two arrays
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      result[i][j] = a[i][j] + b[i][j];
    }
 
  // Displaying the sum
  printf("\nSum Of Matrix:");
 
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("%.1f\t", result[i][j]);
 
      if (j == 1)
        printf("\n");
    }
  return 0;
}

Çıktı:

Enter elements of 1st matrix
Enter a11: 2;
Enter a12: 0.5;
Enter a21: -1.1;
Enter a22: 2;
Enter elements of 2nd matrix
Enter b11: 0.2;
Enter b12: 0;
Enter b21: 0.23;
Enter b22: 23;
 
Sum Of Matrix:
2.2     0.5
-0.9    25.0
 

Örnek:

Üç boyutlu dizi:


// C Program to store and print 12 values entered by the user
 
#include <stdio.h>
int main()
{
  int test[2][3][2];
 
  printf("Enter 12 values: \n");
 
  for (int i = 0; i < 2; ++i)
  {
    for (int j = 0; j < 3; ++j)
    {
      for (int k = 0; k < 2; ++k)
      {
        scanf("%d", &test[i][j][k]);
      }
    }
  }
 
  // Printing values with the proper index.
 
  printf("\nDisplaying values:\n");
  for (int i = 0; i < 2; ++i)
  {
    for (int j = 0; j < 3; ++j)
    {
      for (int k = 0; k < 2; ++k)
      {
        printf("test[%d][%d][%d] = %d\n", i, j, k, test[i][j][k]);
      }
    }
  }
 
  return 0;
}

Çıktı:

Enter 12 values:
1
2
3
4
5
6
7
8
9
10
11
12
 
Displaying Values:
test[0][0][0] = 1
test[0][0][1] = 2
test[0][1][0] = 3
test[0][1][1] = 4
test[0][2][0] = 5
test[0][2][1] = 6
test[1][0][0] = 7
test[1][0][1] = 8
test[1][1][0] = 9
test[1][1][1] = 10
test[1][2][0] = 11
test[1][2][1] = 12
 

C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:

Kaynaklar:
https://www.programiz.com/c-programming/c-arrays
A'dan Z'ye C Kılavuzu 
https://www.w3schools.com/c/c_arrays.php
https://www.programiz.com/c-programming/c-multi-dimensional-arrays