Hallo, en welkom terug. Laten we doorgaan met onze discussie over
structuren en praten over hoe ze gerelateerd zijn aan arrays.
We hebben het gehad over hoe structuren vergelijkbaar zijn met arrays en dat je meer dan één
waarde kunt opslaan, maar ze zijn verschillend omdat je verschillende gegevenstypen kunt hebben en
ze op die manier kunt groeperen.
Maar je kunt ook soortgelijke arrays van structuren hebben.
Dus je hebt gezien hoe nuttig structuur is en je in staat stelt om gerelateerde elementen logisch te
groeperen, dat hebben we gezien. We weten hoe we een
structuur met verschillende elementen moeten definiëren met behulp van het struct-sleutelwoord, met behulp
van een tagnaam.
En we weten ook hoe we een variabele van dat type moeten maken.
Want wat een structuur in wezen is, is dat het een nieuw type gegevens is dat u kunt gebruiken.
En dan heb je toegang tot elementen van een struct met behulp van de lidselectie-operator.
Welnu, hoe zit het als u meerdere structuren wilt maken die zich
in een array bevinden. Je kan dat doen.
Zo hoef je bijvoorbeeld maar één variabele bij te houden in plaats van drie voor
elke datum die door het programma wordt gebruikt, dat is het voordeel van een structuur.
Als we 10 verschillende datums in een programma willen verwerken,
hoeven we maar 10 verschillende variabelen bij te houden in plaats van 30.
Want onthoud, de structuur bevat drie variabelen in zichzelf.
10 voor verschillende variabelen is nog steeds een beetje veel, dus het
is echt niet de optimale manier om te gaan. U wilt waarschijnlijk een array maken.
Omdat je 10 soorten hetzelfde zou hebben, net zoals je 10 ints
hetzelfde zou hebben. Er zou gewoon een structuurtype zijn.
Dus een betere methode om de 10 verschillende
datums te verwerken, is de combinatie van twee krachtige functies van de programmeertaal c,
structuren en arrays.
Je kunt ze samen gebruiken om het nog krachtiger te maken.
Het is dus perfect geldig om een array van structuren te
definiëren. Het concept van een array van structuren is erg krachtig en belangrijk in c, dus let goed op.
Het declareren van een array van structuren is net als het declareren van elk ander soort array.
U specificeert het type, het is toevallig dat het een structuurtype is.
Dus als je een array van structuren wilt maken met
de naam date, zeg je struct
date en dan de naam van de variabele en dan gebruik je
de haakjes, net zoals je de haakjes voor andere arrays gebruikt, moet je de grootte specificeren.
Dus in dit geval, als we 10 instanties of 10 elementen van het datumstructuurtype
maken, zouden we 10 zeggen tussen die haakjes voor het teken.
Dit zou dus een array definiëren met de naam my dates, die uit 10 elementen bestaat.
Elk element binnen de array is gedefinieerd als een struct-datum van het
type bf, die drie leden bevat.
Dus wat u in wezen doet, is dat
u 30 verschillende gegevenssets opslaat, 30 verschillende gegevenselementen.
Om leden van een array van structuren te identificeren,
past u dezelfde regel toe die u gebruikt voor individuele structuren.
U slaat de structuurnaam op met de puntoperator en vervolgens met de lidnaam.
Verwijzen naar een bepaald structuurelement binnen de array is heel natuurlijk.
Om de tweede datum in de my dates-array in te stellen op 8 augustus 1986, hoeft
u alleen maar de naam van de array, my dates, en
de index op te geven. We specificeren hier de tweede datum.
Onthoud dat arrays op 0 zijn gebaseerd. Dus we zeggen 1, sub-1.
En als we dan toegang willen hebben tot elementen van
dat array-element of leden van die struct voor dat element, zeggen we puntmaand.
Dit geeft ons dus het tweede element in de my dates-array.
De maandwaarde voor dat structtype, en hier gaan we het de waarde 8 toewijzen.
en als we dan toegang willen tot de dag, gaan we ook de
dag 8 toewijzen omdat het 8 augustus is. En ten slotte, voor het jaar, zouden we zeggen
dat het puntjaar gelijk is aan 1986.
Dit is hoe je aan het tweede element van de my dates-array de drie
verschillende variabelen kunt toewijzen omdat het van het type struct, date struct is.
Je moet merken dat het eigenlijk niet anders is.
Het enige verschil hier is dat je een punt hebt. Normaal gesproken zou je gewoon mijn datums sub-1
zeggen en dat zou het zijn omdat je maar één variabele zou kunnen toewijzen, afhankelijk van
het type van die array.
Maar in dit geval kun je sub-1 zeggen met drie verschillende variabelen, want
dat zijn de drie elementen in de struct.
Initialiseren van een reeks structuren.
Initialisatie van arrays die structuren bevatten is vergelijkbaar met initialisatie
van multidimensionale arrays.
Onthoud dat we met multidimensionale arrays de specifieke syntaxis zouden
volgen met accolades aan de buitenkant en vervolgens accolades aan de binnenkant die elke rij vertegenwoordigen.
De accolades aan de binnenkant waren eigenlijk optioneel,
maar het maakte het veel leesbaarder. En dus volg ik die conventie graag.
In dit voorbeeld maken we een mijn datums van het type structuurdatum,
deze zal maat 5 hebben. En dan gaan we alleen de eerste drie elementen initialiseren.
Net als een multidimensionale array, hebben we
die accolades erin. En dus het eerste element in de my
dates-array die een index onder nul is. We gaan zeggen dat
de maand 12 is, de datum 10 en het jaar 1975.
En dan gaan we hetzelfde doen voor het eerste element. We gaan zeggen 12 30 1980.
En voor het derde element gaan we zeggen 11 15 2005.
En omdat we de andere twee elementen in
de my dates-array niet hebben geleverd, worden deze niet geïnitialiseerd.
Dit zal dus de eerste drie datums bepalen.
In de array mijn datum tot 12
10 1975, 12 30 1980 en 11 15 2005.
De binnenste perioden van accolades zijn optioneel, net zoals ze in een multidimensionaal gebied ook optioneel zijn.
Maar nogmaals, het maakt het gemakkelijker om te lezen, gemakkelijker te volgen met die binnenbeugels,
ik zou die conventie volgen.
Je zou dit dus kunnen doen als
je de accolades wilt verwijderen, maar het is wat moeilijker te
volgen omdat je nu alleen komma's hebt, gescheiden door komma's of elementen gescheiden door komma's en
het kan erg verwarrend worden als je veel doet van deze.
Je moet dat correct in kaart brengen, stel dat ik in het vierde
vierde element zit voor mijn vierde komma. Oké, dat wordt
het tweede element van de array, het is moeilijker te volgen, dus gebruik die tussen accolades.
Als u alleen het derde element van de array naar een opgegeven waarde
wilt initialiseren, kunt u mijn datums sub-5 specificeren.
Je maakt hier nog steeds de array.
Je declareert nog steeds de variabele en stelt de grootte in op vijf.
Maar binnen de accolades
zeg je twee tussen haakjes en
je initialiseert 2 tot 12 10 1975.
Dus je ziet de vierkante haken die het element vertegenwoordigen dat je wilt
initialiseren, dan is de toewijzingsoperator gelijk aan en dan binnen de
accolades initialiseer je de maand, dag en jaar voor de
elementen binnen de struct.
U kunt dus ook precies aangeven welk element u wilt initialiseren.
Als u alleen de maand en de dag van het tweede element van de my dates-array wilt instellen op 12
en 30, kunt u iets soortgelijks doen.
U plaatst gewoon een komma om elk attribuut te scheiden.
U wilt het jaar niet echt instellen, dus u wilt die accolades kunnen gebruiken.
Je zou kunnen zeggen punt maand gelijk
aan 12 sub-1 punt dag is gelijk aan 30.
En nogmaals, deze syntaxis lijkt erg op het
initialiseren van structvariabelen elders.
Het enige verschil hier is dat omdat het een array is, je de index van de array
moet specificeren, maar een vergelijkbare syntaxis.
Hoe zit het met structuren die arrays bevatten.
Elementen binnen de structuur die een array bevatten.
Het is ook mogelijk om structuren te vinden die een array als lid bevatten.
Dit kan handig zijn.
Het is de meest gebruikelijke manier om een reeks tekens in een structuur op te zetten.
We gebruiken char-arrays redelijk goed voor strings.
Het zou dus heel gewoon zijn dat een structuur in wezen een tekenreeks
bevat, een tekenreeks.
Stel dat u een structuur met de naam maand
wilt definiëren die als leden het aantal dagen in de maand bevat,
evenals een afkorting van drie tekens voor de naam van de maand.
Nou, dat is waar we een tekenreeks kunnen gebruiken. We zouden kunnen zeggen structmaand.
We weten hoe we een structuur moeten definiëren. Nogmaals, dit wijst geen geheugen toe.
Zo wordt de structuur gedefinieerd. Dit zijn de elementen die erin zitten.
Hier gebruiken we het struct-sleutelwoord. We zeggen de naam van de structuur. De tagnaam is maand, en dan
hebben we die linker accolade en dan specificeren we de elementen.
We hebben één element dat een geheel getal is, het aantal dagen dat we een puntkomma aan het einde hebben.
En dan hebben we een karakterreeks, karakternaam sub-drie,
dus grootte van drie omdat het drie karakters heeft.
En dan eindigen we de structuur met de juiste accolade in de puntkomma.
Maar onthoud, karakters zijn arrays en ze zijn nauw verwant aan pointers en dat weten we inmiddels.
Maar je kunt structuren gemakkelijk arrays laten bevatten door ze gewoon
als lidelement te plaatsen.
Dit stelt dus een maandstructuur in die een geheel
getal bevat met de naam aantal dagen en een tekenlid met de naam naam.
De naam van een lid is eigenlijk een reeks van drie tekens, vrij eenvoudig.
Dus hoe krijg je er eigenlijk toegang toe. Welnu, eerst moet u uw variabele maken.
De variabele zou geheugen creëren voor de elementen in de struct en dan zou
je gewoon de juiste velden in de 8-maandvariabele willen plaatsen, de tekenreeks
omdat dat de naam ervan was. We hadden naam en
aantal dagen. Hier heet het naam en in het voorbeeld heet het een maand.
Welnu, een maand is het type variabele en dan is naam het elementtype, dus dat klopt.
Dus hier creëren we een structuur. Het is van het type maand.
De naam van de variabele is een maand. We initialiseren het nergens mee.
We stellen meteen een maandaantal dagen van 31 in.
We gebruiken die punt-lidselectie-operator.
En dan willen we toewijzen aan de tekenreeks, we
kunnen niet rechtstreeks aan een tekenreeks toewijzen.
Je zou een str-vergelijking of zoiets moeten doen als je alles wilde ondertekenen. En dat zou je kunnen doen.
U hoeft deze indexen niet te gebruiken. Je zou kunnen zeggen str
kopieer een maand puntnaam komma en dan j a n
tussen dubbele aanhalingstekens of je zou dit kunnen doen waar je toegang krijgt tot de
elementen van de array via de index.
Hier zeggen we de naam van een maandpunt omdat we toegang moeten
hebben tot de naam lidvariabele of lidelement.
En dan tussen de haakjes specificeren we de index van de array.
We zullen zien dat het het eerste teken in de array van j,tweede een a, derde een n ondertekent.
Je zou deze syntaxis zien als je ints en doubles
en floats zou doen. Normaal gesproken, als je een
karakterarray hebt, gebruik je de str stir copy-functie en wijs je alles toe met dubbele aanhalingstekens.
U kunt de variabele ook initialiseren met dezelfde waarden door iets vergelijkbaars
te doen wanneer u de variabele declareert. Net binnen de accolades, omdat
het een array is, kun je binnen de
binnenste accolades hebben en dan de enkele aanhalingstekens rond elk teken.
En u kunt 12 maanden-structuren binnen een array instellen om elke maand van het jaar weer te geven.
Dus nu kunnen we
een maandvariabele maken, een array van grootte 12 van het type struct month,
en die elke maand kan vertegenwoordigen.
En dan kunnen we voor elke maand het aantal dagen besteden en vervolgens de afkortingen voor de maand.
Dus het gebruik van deze twee krachtige concepten van
arrays en structuren is zeer, zeer nuttig.
Structuren kunnen veel elementen hebben, dus
ze kunnen in feite een structuur van arrays zijn en elementen
binnen de structuur kunnen een array zijn.
En we gaan het nu hebben over hoe we structuren kunnen gebruiken om andere elementen zoals pointers te bevatten.
Maar u zult zien dat structuren elk type gegevens in
veel verschillende soorten gegevens kunnen opslaan.
En het is heel erg handig om te gebruiken met het array-concept.
Ik hoop dat dit nuttig was. Nogmaals, we zullen een uitdaging hebben om
enkele van deze concepten te demonstreren en later enkele voorbeelden
in codeblokken naar voren te brengen. Dank u.