Merhaba, tekrar hoş geldiniz.
Şunlar için bir çözüm sunmak istiyorum bu derste bir önceki meydan okuma.
Nasıl çalıştığınızı gösteren bir yapı içinde eleman olarak işaretçilere sahip
olabilir ve ayrıca yapı olan iki fonksiyonun işaretçileri arasında
geçiş yapar.
Öyleyse kodu getirelim bloklarını kullanarak yeni bir proje oluşturun.
Bu bir konsol olacak. uygulamasını kullanacağız ve bu yapı işaretçileri
örneğini adlandıracağız.
Ve eğer hatırlarsanız bunun için gereksinimler,
bu temelde sadece bir ürün tipiydi bir öğe adı, bir miktar, bir fiyat ve bir tutar
depolayan yapı.
Ve öğenin adı şöyle olacaktı bir karakter işaretçisi olması gerekir.
Bu gece miktarının fiyatla çarpılmasıyla
elde edilir.
Ve sonra iki fonksiyonumuz vardı parametre olarak bir
struct'a işaretçi alır.
Yani ilk yapacağımız şey yapımızı
oluşturacağız.
Bundan daha önce de bahsetmiştim ama yapıyı küresel
olarak oluşturmak iyidir çünkü eğer birden fazla işlevde kullanın.
Yapının oluşturulması onu gerçekten tanımlıyor.
Hiç bellek ayırmıyorsunuz.
Yani bir zararı yok. küresel olarak koymak.
Ve genellikle içeri girerler başlık dosyası zaten.
Yani bir yapı oluşturmak için, sadece yapısal diyoruz.
Bu öğeyi çağıracağız ve dört unsurumuz olacak.
Bir karakterimiz olacak işaretçisi, ki biz buna sadece
öğe adı diyeceğiz.
Bir miktar alacağız.
Bir şamandıramız olacak. fiyat için ve miktar için
bir değişkenimiz olacak.
Ve bu şekilde tanımlayabiliriz yapımız, oldukça basit.
Şimdi ana fonksiyonumuzun içinde yapı türü için bir değişken ve ayrıca bir işaretçi oluşturmak
ister.
Yani yapmak istediğimiz ilk şey sadece yapının adı ile struct item
demek istiyoruz ve o zaman bu öğeyi çağıracağız.
Ve bu sadece garip bir işaretçi oluşturuyor.
Bu bellek ayıracak dört değişken ve yapı içindeki
elemanlar için.
Ve böylece işaretçimizi oluşturmak istiyoruz şimdi, ve biz sadece yapısal öğe diyebiliriz.
P öğesi diyeceğiz çünkü işaretçilerimizi genellikle
p önekiyle adlandırırız.
Bu yüzden yıldız işareti koyuyoruz, ve p öğesi diyoruz.
Ve sonra bir sonraki satırda, sadece
işaretçi öğemize, öğemize atamak istiyoruz.
Yani kullanmamız gereken adresi ve madde diyoruz.
Ve işte burada hafızamız var işaretçimiz için yapımızdaki elemanlar için
ayrılmıştır.
Hiç hafızamız yok. öğe adımız olan karakter işaretçimiz
için ayrılmıştır, Yani bir sonraki adım bu olacak.
Şimdi neden ihtiyacımız olduğunu sorabilirsiniz öğe yapısını oluşturmak için.
Gerçekten bilmiyoruz.
Sadece işaretçiyi oluşturabiliriz ve işaretçi yalnızca o struct öğesi işaretçisi
için bellek oluşturacaktır.
için bellek ayıracaktır. int ve float'ları kullanabiliriz,
ancak yine de öğe adı tahsisini yapmamız gerekir.
Bunu yapmayı seviyorum çünkü bu genellikle iyi bir uygulamadır.
Tipik olarak aşağıdakilerle yapacağınız şey ilk öğe yapısını başlatırsınız
ve böylece bazı başlatma işlemlerine sahip olacaktır.
Ama bunu yapmamıza gerek yok.
Bu yüzden yapmak istediğimiz ilk şey öğe adımız için bellek ayırın.
Yani temel olarak bir bir işaretçi ise öğelere erişmek için
özel operatör.
Unutmayın, aşağıdaki yapılar için işaretçilerdir, tire sonra büyüktür sembolüne
sahip olursunuz. öğelere erişmek için kullanabilir.
Aksi takdirde, referansı kaldırmanız gerekir öğelere erişmek için işaretçi.
Şöyle bir şey yapabiliriz bu parantez içinde.
İşaretçiyi referans dışı bırakabiliriz,
Bu yüzden yıldız p öğesi gibi bir şey yapmalı ve sonra öğelere erişmek için nokta.
Bu tamamen geçerli böyle bir şey yapmak için.
Ama bu biraz fazladan sözdizimi gerçekten ihtiyacınız olmayan şeyler.
Yani c'nin özel bir sözdizimi vardır yapınız bir işaretçi olduğunda kullanabilirsiniz.
öğelere erişmek istiyorum.
Temel olarak sadece adını söyleyebilirsiniz p öğesi olan işaretçinin tire işaretini
kullanın ve sonra büyüktür.
Ve bu durumda, biz istiyoruz öğe adı için bellek ayırın.
Bu yüzden ona ne olduğunu atayacağız malloc işlevinden döndürülür.
Unutmayın, malloc fonksiyonu bir void işaretçi döndürür.
Bu yüzden onu atmak zorundayız bir karakter yıldızına.
Ama malloc'u çağırabiliriz, sadece malloc deyin ve ardından oluşturmak istediğimiz
baytların boyutunu girin.
Bu durumda, sadece 30 diyeceğiz, ve char'ın büyüklüğü ile çarpacağız, sadece
char'ın bir farklı bilgisayarlarda farklı boyutta.
Ve bu da öğe adımız için bellek.
Bunu yapmamız gerekiyor çünkü öğe adı yapının içinde bir işaretçidir.
Hafızası yok. başka bir yapıya atadığınızda
bunun için tahsis edilir.
Bu yüzden bunu yapmak zorundayız.
Şimdi istediğin ilk şey Bellek ayırdıktan sonra
yapmanız gereken malloc'u kontrol etmektir.
Bu yüzden burada null olup olmadığını kontrol etmek istiyoruz.
Sadece diyeceğiz ki eğer p öğesi, eğer boş olduğunu söyler.
Aksi takdirde, diyeceksiniz ki sadece return ya da exit demek muhtemelen daha iyi olacaktır, eğer programdan
çıkarsak bellek ayıramadığını ve bunu negatif olana geçirebileceğinizi
unutmayın.
Aksi takdirde, bir öğesi, bu yüzden bir fonksiyon oluşturmak istiyoruz.
Gideceğimiz fonksiyon oluşturulacak öğeye okuma öğesi denir.
Bir fonksiyon bildirimi yapalım burada yapının üstünde.
Sadece verileri okuyacak ona aktardığımız yapının içine.
Herhangi bir veri döndürmeyecektir.
Yani sadece oku diyebiliriz ve bir struct alır ve bu bir işaretçi olacaktır.
Yani bu bir yapı kalemi, yıldız işareti I.
Şimdi bunu bir sabit yapabiliriz Yani değerler değişiyor ama
biz değerleri değiştiriyoruz.
Ama sabit yapı diyebiliriz. değerler, işaret ettiği işaretçi
için değişemeyecektir.
Sonra sabit yapsaydık yıldız işareti, adresin değiştirilemeyeceğini veya doğru
yıldız işaretinden önce isimden sonra bunun gibi
bir şey.
Bu da adresin değişir, ancak bu gereksizdir
çünkü kopya değeri ile geçiyoruz.
Okunmuş ürünümüz var.
Ve ben buradayken baskı ürünümü de yapacağım.
Bu sadece bir işlev olacak bildirimi, işlev prototipi.
Burada, çok olacak benzer şekilde, bir işaretçi de alın.
İsterseniz bir alanınız olabilir yıldız işaretinden sonra mı değil mi?
Şimdi okumamızı tanımlayabiliriz ana yöntemimizin altındaki öğe.
Ve bu okunacak değerlerini girin ve ardından toplam
tutarı hesaplayın.
Bu yüzden geçersiz okuma diyebiliriz işaretçimiz var.
Ve burada, biz sadece istiyoruz gerçekten biraz scanfs kullanmak için.
Bazı mesajlar yazdıracağız kullanıcıya bilgi girmesini söylemek için.
Bu yüzden gir diyeceğiz ürün adı, ve sonra onu okuyacağız.
Bu yüzden scanf diyeceğiz, ve bir struct'a işaretçimiz var, böylece ona erişebiliriz
tire kullanarak daha büyüktür.
Scanf için okumak istediğimiz ürün adı bir karakter tamponudur.
Yani yüzde s demek istiyoruz ve sonra I diyeceğiz, bunu öğe adında
saklayacağız.
Ve biz geri dönüp intellisense sadece öğe adına gider.
Biz kullanmak zorunda değilsiniz bir karakter işaretçisi olduğu
için operatörün adresi.
Daha sonra çıktı almak istiyoruz ve fiyatı girin, muhtemelen
buraya bazı satır beslemeleri eklemek istersiniz, fiyatı girin.
Depolayacağız bu yapıda.
Yani yine de fiyat bir şamandıra.
Bu yüzden yüzde f diyeceğim ama bir işaretçi olduğu için ona da erişeceğiz, yine de tire işaretini
kullanın, sonra büyüktür.
Bu sefer hariç, biz gidiyoruz fiyatını söyleyeceğiz ve adresini almamız gerekiyor, bu yüzden
önüne bir ve işareti koyun çünkü fiyat bir işaretçi
değildir.
Ve sonra da Aynı şey miktar için de geçerli.
Yani miktar bir tam sayıdır.
Yani yüzde d diyebiliriz, hala ihtiyacımız var adresini almak için, ancak
bunu farklı bir öğede saklamak istiyoruz, bunu miktar olarak saklamak istiyoruz.
Artık depoladığımıza veya sorduğumuza göre kullanıcının üç öğe bilgi
girmesi için, şimdi şunları yapabiliriz aslında miktarı hesaplar, miktarın içinde
bir şey depolar.
Miktar sadece miktar çarpı fiyat.
Bu yüzden hala yapısını sözdizimimizi kullanarak dökmek istiyoruz,
imzalamak istiyoruz miktar çarpı fiyat.
Bu da öğe okuma işlevidir.
Bir yapı işaretçisi alır.
Ve böylece bu işaretçiyi değiştirdiğimizde okuma öğesinin içindeyse,
işlevin dışında değiştirilecektir.
Yani hangi yapıda olursak olalım bu işleve aktarıldığında, değiştirilecektir.
Tüm verileri depolayacak. öğeleri, öğe adı, fiyatı
ve miktarı ve tutarı.
Böylece veriler okunur.
Bu noktada, şunları yapmak istersiniz test etmek ve muhtemelen bundan önce
derlemek ve test etmek istersiniz.
Ama şimdi okuma öğesini çağırabiliriz metodunu main'imizde yukarı kaldırın ve oluşturduğumuz
yapının içine aktarın.
Bu yüzden oku diyebiliriz, ve sadece p öğesi diyebiliriz.
Geçmek zorunda değiliz. çünkü bu bir işaretçidir, bu yüzden
sadece yapımızı geçiririz.
Ve sonra bir sonraki şey bunu yazdırabiliriz.
Ve bunun size göstereceği şey verilerin kaydedildiği, p öğesinin fonksiyon
içinde değiştirildiği ve fonksiyonun dışına kaydediliyor, ana fonksiyon
aslında bu değerleri kaydetmiştir.
Yani yazdırma öğesinin geçtiğini söyleyebiliriz işaretçisine tekrar girdikten sonra yazdırma öğesi işlevini
tanımlayabiliriz.
Baskı öğesi oldukça basittir.
Hiçbir şey dönmüyor, bu yüzden void diyoruz ve print öğesinin
bir işaretçi aldığını söylüyoruz.
Bu yüzden sadece struct item star diyoruz Ben, adını ne koyarsan koy.
Ve sonra sadece verileri yazdırıyoruz aktarılan yapı için.
Yani şöyle bir şey yapabiliriz printf ad yüzde s, I ürün adı, I fiyat, I miktar ve I
miktarını belirler ve ardından verileri biçimlendiririz.
Elimizdeki son şey ne? Verileri yazdırdıktan
sonra main'de yapmamız gereken gerçekten önemli bir serbest fonksiyon.
Ücretsiz aramalıyız çünkü öğe adı için ayırdığımız belleği boşaltmak
istiyoruz.
Yani sadece ücretsiz p öğesi diyebiliriz ve ardından öğe adına erişin.
Tüm dünyayı serbest bırakmak istemiyoruz.
yapısında tüm yapı silineceği için işlev döndüğünde yığın.
Sadece malloc ettiğimiz şeyi serbest bırakmak istiyoruz.
Sadece öğe için malloced bu yüzden onu serbest bırakıyoruz ve sonra ana
sistemden geri dönüyoruz.
Öyleyse devam edelim ve bunu inşa etmeye çalış.
Ve bir hata var.
Bakalım yapısal öğe yıldızı diyor.
Bu yüzden bir hata yaptık. fonksiyonlar yapının üzerinde tanımlanmıştır.
Ancak, bir parametresini bir struct türü olarak seçin.
Bu yüzden bir yapıya sahip olmalıyız. yukarıda kullandığımız yerde tanımlanmıştır.
Bu yüzden fonksiyonları taşıyorum 12. ve 13. satırlara kadar.
Şimdi derleyebiliyoruz.
Devam edelim ve bunu çalıştıralım.
Bakalım burada ne bulacağız.
Bir hatamız daha var.
Emin olmalısın p öğesini null için kontrol edin.
Eğer sadece p öğesi için Doğru, her zaman doğru olacak.
Bu yüzden ya şunu kontrol edebilirsiniz not sembolü ile doğru değil,
yani boş değil veya siz null olup olmadığını kontrol edebilir.
Ben de oraya null ekledim.
Şimdi onu çalıştırıyoruz. Gitmek için iyi olmalı.
Ürün adını girebiliriz.
Seri diyeceğiz ve fiyatın 1 olduğunu varsayalım. 99.
Ve bunlardan beş tane var diyelim.
Şimdi de çıktısını alıyoruz, ve biz seri 99 dolar diyoruz.
5, toplam tutar 9'dur. 95.
Fiyatı hoşuma gitmese de fiyatın nasıl yazdırıldığı.
Hadi bunu düzeltelim.
Baskı öğemizde, sadece şunu söyleyebiliriz 2 f şamandıra için fiyat, şimdi
biraz daha iyi görüneceğiz ve çalıştıracağız.
Biz biraz alacağız biraz daha iyi bir format.
Dört tane ve şimdi biraz daha iyi görünüyor
ve her şey yolunda.
Yani yine, temel program kullanarak yapılar ve işaretçiler.
En tepedeki yapıyı biz oluşturduk.
Şunları içeren bir üyemiz var bir işaretçi, bunu yapmak
çok verimlidir çünkü karakter dizilerinin aksine sadece kopyalama
ve adresler.
İki func bildirimimiz var, işaretçi alan öğeyi oku
öğeyi yazdır yok eder.
Ve sonra işaretçiyi yaratıyoruz ve ana yapımızın içindeki düzenli
bir yapıya atayın.
Belleği 22. satırda ayırıyoruz.
Hafızanın şu şekilde olduğundan emin oluruz başarılı bir şekilde tahsis edilmediyse
programdan çıkarız.
Ve sonra bizim iki yapılara işaretçi alan işlevler,
bunları içeri aktarır.
Ve son olarak, belleği boşaltırız ve sonra programdan
çıkarız.
Ve fonksiyonlar şunlardır oldukça açık.
İşaretçiyi sen al.
İşaretçiye şu şekilde erişirsiniz tire sonra büyüktür.
Ve şu adresi alırsınız eleman olarak işaretçi içermeyen
scanf'ler için.
Ve temelde hepsi bu.
Bu programı kaydedeceğim, bir göz atarsın.
Herhangi bir sorunuz olursa bana haber verin. Teşekkür ederim.