- Bir dizi tanımlamak, ona ilk değer vermek ve elemanlarını döngüyle işlemek
- Bir diziyi uzunluğuyla birlikte fonksiyona aktarmak
- Karakter dizisinin sonundaki
'\0'karakterinin rolünü açıklamak strlen,strcpy,strcatvestrcmpfonksiyonlarını arabellek taşmasına yol açmadan kullanmak
Bir sınıfta 25 öğrenci var ve her birinin notunu saklaman gerekiyor. 25 ayrı değişken (mark1, mark2, …, mark25) oluşturmak hem yorucu hem de kullanışsızdır: onları bir döngüyle dolaşamazsın. Bunun için dizi vardır: aynı türden değerlerin bellekte yan yana dizildiği bir sıra. C'de metin de bir dizidir, yalnızca karakterlerden oluşan bir dizi.
Diziler
Bir dizi tanımlarken türü, adı ve köşeli parantez içinde eleman sayısını yazarız: int marks[5];. Elemanlara indeksle erişilir ve indeksler 0'dan başlar: ilk eleman marks[0], sonuncusu marks[4]'tür. Başlangıç değerleri süslü parantez içinde verilebilir; daha az değer verilirse kalan elemanlar 0 olur. Örneğin int counts[10] = {0}; tüm elemanları sıfırlar.
#include <stdio.h>
int main(void) {
int marks[5] = {5, 4, 3, 5, 4};
int n = sizeof(marks) / sizeof(marks[0]);
int sum = 0;
int best = marks[0];
for (int i = 0; i < n; i++) {
sum += marks[i];
if (marks[i] > best) {
best = marks[i];
}
}
printf("Count: %d\n", n);
printf("First: %d, last: %d\n", marks[0], marks[n - 1]);
printf("Average: %.2f\n", (double) sum / n);
printf("Best: %d\n", best);
return 0;
}Count: 5 First: 5, last: 4 Average: 4.20 Best: 5
Bir diziyi fonksiyona aktardığında fonksiyon onun uzunluğunu bilmez; bu yüzden uzunluk ayrı bir parametre olarak verilir. Bir fark daha var: sıradan bir değişkenin aksine dizi kopyalanmaz; fonksiyon asıl elemanlarla çalışır ve onları değiştirebilir. Bunun nedenini bir sonraki derste işaretçilerle birlikte göreceksin. Diziyi değiştirmeyen bir fonksiyonun parametresine const yazmak iyi bir alışkanlıktır.
#include <stdio.h>
int find(const int arr[], int n, int target) {
for (int i = 0; i < n; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
void double_all(int arr[], int n) {
for (int i = 0; i < n; i++) {
arr[i] *= 2;
}
}
int main(void) {
int prices[4] = {3, 7, 1, 10};
printf("7 is at index %d\n", find(prices, 4, 7));
printf("5 is at index %d\n", find(prices, 4, 5));
double_all(prices, 4);
printf("After: %d %d %d %d\n", prices[0], prices[1], prices[2], prices[3]);
return 0;
}7 is at index 1 5 is at index -1 After: 6 14 2 20
find, değer bulunamazsa var olamayacak bir indeks olan −1'i döndürür. double_all ise asıl diziyi değiştirdi.find fonksiyonu tam olarak böyle çalışır: elemanları 0. indeksten başlayarak tek tek kontrol eder.Karakter dizileri: '\0' ile biten char dizileri
C'de ayrı bir karakter dizisi türü yoktur. Bir karakter dizisi (string), sonunda özel boş karakter '\0' bulunan bir char dizisidir. printf ve strlen gibi fonksiyonlar dizinin nerede bittiğini bu karakterden anlar. char word[] = "milk"; yazdığında derleyici 5 baytlık bir dizi oluşturur: 4 harf ve '\0'.
| İndeks | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
word[i] | 'm' | 'i' | 'l' | 'k' | '\0' |
"milk" dizisi bellekte böyle görünür: 4 harf ve sonda boş karakter.#include <stdio.h>
#include <string.h>
int main(void) {
char word[] = "milk";
printf("Word: %s\n", word);
printf("strlen: %zu\n", strlen(word));
printf("sizeof: %zu\n", sizeof(word));
printf("First letter: %c\n", word[0]);
word[0] = 's';
printf("Changed: %s\n", word);
return 0;
}Word: milk strlen: 4 sizeof: 5 First letter: m Changed: silk
strlen, '\0''dan önceki karakterleri sayar; sizeof ise dizinin tüm baytlarını.string.h fonksiyonları
Bir dizi başka bir diziye = ile atanamaz ve karakter dizileri == ile karşılaştırılamaz. Bunun için string.h başlığındaki fonksiyonlar kullanılır: strcpy(dest, src) diziyi kopyalar, strcat(dest, src) sona ekler, strcmp(a, b) ise karşılaştırır. strcmp, diziler aynıysa 0, a alfabetik sırada önce geliyorsa negatif, sonra geliyorsa pozitif bir sayı döndürür.
#include <stdio.h>
#include <string.h>
int main(void) {
char first[20] = "Baku";
char second[20];
strcpy(second, first);
printf("Copy: %s\n", second);
strcat(second, " city");
printf("Joined: %s (%zu chars)\n", second, strlen(second));
if (strcmp(first, "Baku") == 0) {
printf("Equal\n");
}
if (strcmp("apple", "banana") < 0) {
printf("apple comes first\n");
}
return 0;
}Copy: Baku Joined: Baku city (9 chars) Equal apple comes first
Önemli noktalar
- Bir dizi aynı türden değerleri yan yana saklar; indeksler 0'dan
n - 1'e kadardır. - C dizi sınırlarını denetlemez; bu sınırların dışına çıkmak ciddi bir hatadır.
- Bir diziyle birlikte uzunluğu da fonksiyona aktarılır; fonksiyon asıl elemanları değiştirebilir.
- Karakter dizisi
'\0'ile biten birchardizisidir:"milk"5 bayt kaplar,strlenise 4 verir. - Karakter dizilerini
strcpyile kopyala,strcmpile karşılaştır ve hedefin boyutunu her zaman denetle.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
int a[10]; dizisinin son elemanının indeksi kaçtır?