Video: C Programlama Dersleri 37 - Pointer Dizileri (Pointer Arrayleri) 2024
Dizinin adı, dizinin kendisine işaret eden bir işaretçidir. dizi bellekte saklanan değişken dizisidir. dizi adı ilk öğeyi işaret eder.
İşaretçiler hakkında ilginç bir soru: Şu satır gibi bir işlev üstbilgisine sahip misiniz ve yalnızca dizi içinde kaç öğe belirlemek için sizeof kullanın? Eğer öyleyse, bu işlev arayan kişinin dizinin boyutunu belirtmesine gerek kalmaz.
int AddUp (int Numbers []) {Array01 örneğinde ve bu işlevi çağıran bir main () işlevinde bulunan bu işlevi düşünün: void ProcessArray (int Numbers []) { cout << "işlev içinde: bayt cinsinden boyut" << sizeof (Numbers) << endl;} int main (int argc, char * argv []) {int MyNumbers [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; cout << "dış işlev: Boyut (bayt cinsinden)"; cout << boyutof (Numaralarım) << endl; ProcessArray (MyNumbers); return 0;}
Bu uygulamayı çalıştırdığınızda, gördüğünüz şu:
İşlevin dışında kod, dizinin 40 bayt olduğunu bilir. Peki kod, dizinin içinden sonra 4 boyutunun neden olduğunu düşünüyor? Bunun nedeni, bir diziyi geçtiğinize benzese de, bir diziye
işaretçi 'ı gerçekten geçiriyorsunuzdur. İşaretçinin boyutu sadece 4'tür ve son cout çizgisinin bastığı şey de budur.
int MyNumbers [5];
derleyici bir dizininiz olduğunu bilir ve sizeof operatörünün tüm dizinin boyutunu verir. Ardından, dizi adı
hem hem de bir işaretçi ve bir dizi! Ancak, void ProcessArray (int Sayılar []) {
gibi bir dizi olmadan bir işlev başlığı bildirirseniz, derleyici bunu yalnızca bir
işaretçi olarak algılar ve başka bir şey yapmaz. Bu son satır aslında aşağıdaki satırla aynıdır: void ProcessArray (int * Sayılar) {
Dolayısıyla, satırın bildirdiği işlevler içinde aşağıdaki iki kod satırı
eşdeğerdir <: Sayılar [3] = 10; * (Sayılar + 3) = 10; Bu eşdeğerlik, bir dizi üzerinde extern bildirimi kullanırsanız, örneğin
extern int MyNumbers [];
ve daha sonra bu dizinin boyutunu alırsak, derleyici karıştıracaktır. İşte bir örnek: İki dosyanız varsa numaralarınız. cpp ve ana. cpp, sayıların nerede olduğu. cpp bir diziyi ve ana dizini bildirir. cpp harici olarak onu bildirir (Array02 örneğinde gösterildiği gibi) sizeof çağırırsanız bir derleyici hatası alırsınız:
#include ad alanı std; extern int MyNumbers []; int main (int argc, char * argv []) {cout << boyutof (MyNumbers) << endl;
hata: 'sizeof' eksik başvurusu 'int []'
için geçersiz bir uygulama. Çözüm
dizi parantez içinde.Sadece boyutun diğer kaynak kodu dosyasındaki ile aynı olduğundan emin olun! Numarayı değiştirerek derleyiciyi taklit edebilirsiniz ve
hata almazsınız. Ama bu kötü programlama tarzı ve sadece hatalar istiyor. Her ne kadar dizi
yalnızca birbirlerinin bellekte bitişik değişkenler dizisiyse de, bir dizinin ad gerçekten yalnızca dizideki ilk öğeye işaret eden bir işarettir. Adı işaretçi olarak kullanabilirsiniz. Bununla birlikte, bunu sadece bir gösterici ile gerçekten çalışmanız gerektiğinde yapın. Sonuçta, gerçekten şifreli olan kod yazmak için hiçbir nedenin yok * gibi (Numbers + 3) = 10;. Sohbet de doğrudur. Bu işleve bakın: void ProcessArray (int * Sayılar) {cout << numbers [1] << endl;}
Bu işlev, bir işaretçi parametre olarak alır; buna bir dizi olarak erişirsiniz. Yine, böyle bir kod yazmayın; Bunun yerine,
bunun gibi kodların neden
olduğunu anlamalısınız. Bu şekilde, diziler hakkında daha derin bir bilgi sahibi olur ve bilgisayarın içerisinde nasıl yaşıyorlar ve bu bilgiler düzgün çalışan kod yazmanıza yardımcı olabilir. Dizinin adı yalnızca bir işaretçi olsa da, bir tamsayı dizisinin adı, bir tamsayıya işaret eden işaretçi ile tam aynı şey değildir. Bu kod satırlarını kontrol edin (Array03 örneğinde bulunur): int LotsONumbers [50]; int x; LotsONumbers = & x;
LotsONumbers
işaretçisini
başka bir şeye yönlendirin: Bir tamsayı olarak bildirilen bir şey. Derleyici bunu yapmanıza izin vermiyor; bir hata edinin. LotsONumbers int * LotsONumbers olarak ilan edilirse durum böyle olmayacaktır; o zaman bu kod işe yarar. Ancak yazılı olarak, bu kod bir derleyici hatası verir. Kod:: Bloklar: hatası: 'int *' 'int [50]' atamasında uyumsuz türler Bu hata derleyicinin iki tür arasındaki kesin ayrım, int * ve int []. Bununla birlikte, dizi adı aslında bir işaretçi ve onu bir tane olarak kullanabilirsiniz; normal bir işaretçiyle elinizden gelen herşeyi yapamazsınız, örneğin, onu yeniden atayabilir.
Dizileri kullanırken, aşağıdaki ipuçlarına dikkat edin. Bunlar dizilerinizi böcekten uzak tutmanıza yardımcı olur:
Kodunuzun tutarlı olmasını sağlayın. Örneğin, bir tamsayý gösteren bir iþaretçiyi bildirirseniz, onu bir dizi olarak deðerlendirmeyin.
Kodunuzu açık ve anlaşılır tutun. İşaretçilerle çalışırsanız, ilk öğenin adresini almak için, & (MyNumbers [0]) 'da olduğu gibi, kodun daha net olmasını sağlayın, ancak yalnızca MyNumbers'a eşdeğerdir.
-
Bir dizi bildirirken, bir dizi alan bir işlev yazmadığınız sürece daima köşeli parantez içine bir sayı koymayı deneyin.
-
Bir diziyi bildirmek için extern anahtar kelimesini kullandığınızda, devam edin ve ayrıca dizi boyutunu parantez içine koyun. Tutarlı ol! Bir kez bir sayı ve başka bir zaman başka bir sayı kullanmayın. Tutarlı olmanın en kolay yolu, const int ArraySize = 10 gibi bir sabit kullanmaktır; ortak bir başlık dosyası ve daha sonra bu dizi bildiriminde kullanın: int MyArray [ArraySize];.