Ev Kişisel Finans Diziler ve İşaretçiler C ++ - dummies

Diziler ve İşaretçiler C ++ - dummies

Video: C Programlama Dersleri 37 - Pointer Dizileri (Pointer Arrayleri) 2024

Video: C Programlama Dersleri 37 - Pointer Dizileri (Pointer Arrayleri) 2024
Anonim

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:

Dış işlev: Bayt cinsinden boyut 40 İç işlev: Bayt boyutu 4
İş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.

Dizileri bildirmek hafif bir aksilikle karşı karşıya. Belirli sayıda öğe vererek bir dizi bildirdiğinizde,

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];.

Diziler ve İşaretçiler C ++ - dummies

Editörün Seçimi

Kendi Excel 2007 Şablonlarınızı Oluşturun - mankenler

Kendi Excel 2007 Şablonlarınızı Oluşturun - mankenler

Hazır bir Excel 2007 şablonunu bulamazsanız faturaya uyuyor, oluşturduğunuz veya şirketinizin elinde bulunan örnek çalışma kitaplarından kendi şablonlarınızı oluşturuyor. Kendi şablonunuzu oluşturmanın en kolay yolu, gerçek bir çalışma kitabı prototipi oluşturmak ve dosyayı şablon dosyası biçimini kullanarak kaydedin ...

Kendi Excel 2010 Şablonlarınızı Oluşturma - mankenler

Kendi Excel 2010 Şablonlarınızı Oluşturma - mankenler

Hazır Excel 2010 şablonunu bulamazsanız faturaya uyuyor, oluşturduğunuz veya şirketinizin elinde bulunan örnek çalışma kitaplarından kendi şablonlarınızı oluşturuyor. Kendi şablonunuzu oluşturmanın en kolay yolu, gerçek bir çalışma kitabı prototipi oluşturmak ve dosyayı şablon dosyası biçimini kullanarak kaydedin ...

Excel 2007 Grafiğinin Tipini ve Stilini özelleştiren - aumluları

Excel 2007 Grafiğinin Tipini ve Stilini özelleştiren - aumluları

Bir grafik eklediğinizde bir Excel 2007 çalışma kitabı, Şeritte yeni bir Grafik Araçları Tasarım sekmesi görüntülenir. Grafik türünü ve stilini özelleştirmek için Grafik Araçları Tasarım sekmesindeki komut düğmelerini kullanabilirsiniz. Tasarım sekmesi aşağıdaki düğme gruplarını içerir: Tür grubu Değiştir Grafik Türü ...

Editörün Seçimi

ÜÇüncü Temel, Çalınma Evini ve Diğer Beyzbol Beyitlerini Çalın

ÜÇüncü Temel, Çalınma Evini ve Diğer Beyzbol Beyitlerini Çalın

ÜÇüncü temel çalmak genellikle ikinci çalmaktan daha kolaydır. Birçok atış çizmeden ilk önce olduğundan daha büyük bir yol alabilirsin. Zamanlamanız iyi ise, atıcı topu bırakmadan önce saniyelerden de çıkabilirsiniz. Sürahi genellikle koşucuları ikinci sıradan seçmek daha zor olur ...

Basketbol Takımınızda Bir Balo Domuzuyla

Basketbol Takımınızda Bir Balo Domuzuyla

Balo domuzu - asılı bir oyuncu uzun süreler boyunca topa vurur ve geçmek yerine her yere ateş etmeyi amaçlar - tüm takım için gerçek sorunlar yaratır. Örneğin, topu domuzu, takımın moralini zayıflatan ve öldüren puan almaya çalışan açık takım arkadaşlarını görmezden gelir ...

Editörün Seçimi

Canon EOS 6D'ye Yazar Adı Nasıl Eklenir Canon EOS 6D'ye Yazar Adı Nasıl Eklenir

Canon EOS 6D'ye Yazar Adı Nasıl Eklenir Canon EOS 6D'ye Yazar Adı Nasıl Eklenir

Adınızı aşağıdaki gibi ekleyebilirsiniz: Canon'la çektiğiniz her görüntünün yazarı. Bilgiler, çektiğiniz her resme EXIF ​​verisi olarak eklenir. Yazar bilgilerinizi kameraya kaydetmek için: Menü düğmesine basın. Daha önce kullanılan menü görüntülenir. Kamera Ayarları ... 4 ...

Rebel T6i / 750D'den Görüntülere Nasıl Temizleme Talimatları Ekleyeceksiniz - mankenler

Rebel T6i / 750D'den Görüntülere Nasıl Temizleme Talimatları Ekleyeceksiniz - mankenler

Küçük noktalar görüntülerinizde tutarlı bir şekilde görünüyorsa ve Rebel T6i / 750D'nin lensindeki kirin nedeni değilse - sensörünüzün temizlemeye ihtiyacı olabilir. Sensörü kendiniz temizlemeyin, çünkü ne yaptığınızı bilmiyorsanız makinenizi kolayca mahvedebilirsiniz. Bunun yerine, fotoğraf makinesini çekin ...