Huis Persoonlijke financiën Arrays en Pointers in C ++ - dummies

Arrays en Pointers in C ++ - dummies

Video: Pointers and arrays 2024

Video: Pointers and arrays 2024
Anonim

De naam van de array is een verwijzing naar de array zelf. De array is een reeks variabelen die in het geheugen is opgeslagen. De arraynaam verwijst naar het eerste item.

Dit is een interessante vraag over pointers: kunt u een functieheader hebben, zoals de volgende regel, en gewoon sizeof gebruiken om te bepalen hoeveel elementen in de array zitten? Als dit het geval is, hoeft deze beller de grootte van de array niet op te geven.

int AddUp (int Numbers []) {

Overweeg deze functie te vinden in het voorbeeld Array01 en een main () die dit aanroept:

void ProcessArray (int Numbers []) { cout << "inside functie: Grootte in bytes is" << sizeof (Numbers) << endl;} int main (int argc, char * argv []) {int MyNumbers [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; cout << "buiten functie: Grootte in bytes is"; cout << sizeof (MyNumbers) << endl; ProcessArray (MyNumbers); return 0;}

Als u deze applicatie uitvoert, ziet u wat u ziet:

Buiten functie: Grootte in bytes is 40 Binnen functie: Grootte in bytes is 4

Buiten de functie weet de code dat de grootte van de array 40 bytes is. Maar waarom denkt de code dat de grootte 4 is nadat deze zich in de array bevindt? De reden is dat, hoewel het lijkt alsof u een array doorgeeft, u een aanwijzer echt doorgeeft aan een array. De grootte van de aanwijzer is slechts 4, en dat is dus wat de laatste cout-regel afdrukt.

Het declareren van arrays heeft een kleine eigenaardigheid. Wanneer u een array declareert door een bepaald aantal elementen te geven, zoals

int MyNumbers [5];

de compiler weet dat je een array hebt en de operator sizeof geeft je de grootte van de hele array. De arraynaam is dan

beide een aanwijzer en een array! Maar als u een functieheader declareert zonder een arraygrootte, zoals void ProcessArray (int Numbers []) {

behandelt de compiler dit als een

pointer en niets meer. Deze laatste regel is in feite gelijk aan de volgende regel: void ProcessArray (int * Numbers) {

Dus binnen de functies die door een van de regels worden aangegeven, zijn de volgende twee coderegels

equivalent <: Nummers [3] = 10; * (Nummers + 3) = 10; Deze gelijkwaardigheid betekent dat als u een externe verklaring op een array gebruikt, zoals

extern in MyNumbers [];

en neem dan de grootte van deze array, de compiler raakt in de war. Hier is een voorbeeld: als u twee bestanden hebt, nummers. cpp en main. cpp, waar getallen. cpp declareert een array en main. cpp verklaart het extern (zoals weergegeven in het voorbeeld van Array02), u krijgt een compileerfout als u sizeof aanroept:

# include namespace std; extern int MyNumbers []; int main (int argc, char * argv []) {cout << sizeof (MyNumbers) << endl; return 0;}

In Code:: Blocks geeft de gcc-compiler ons deze foutmelding:

fout: ongeldige toepassing van 'sizeof' op incompleet type 'int []'

De oplossing is om de grootte op te geven van de array tussen haakjes.Zorg ervoor dat de grootte hetzelfde is als in het andere broncodebestand! Je kunt de compiler nep maken door het nummer te veranderen, en je

krijgt geen fout

. Maar dat is een slechte programmeerstijl en alleen maar vragen om fouten. Hoewel een array

eenvoudigweg een reeks variabelen is die alle in het geheugen naast elkaar liggen, is de naam van een array eigenlijk slechts een verwijzing naar het eerste element in de array. U kunt de naam gebruiken als een aanwijzer. Doe dit echter alleen als u echt met een aanwijzer moet werken. Je hebt tenslotte echt geen reden om code te schrijven die cryptisch is, zoals * (Numbers + 3) = 10;. Het omgekeerde is ook waar. Kijk naar deze functie: void ProcessArray (int * Numbers) {cout << numbers [1] << endl;}

Deze functie neemt een pointer als een parameter, maar je hebt er toegang toe als een array. Nogmaals, schrijf geen code zoals deze; in plaats daarvan zou u

moeten begrijpen waarom deze code werkt

. Op die manier verkrijgt u een diepere kennis van arrays en hoe ze in de computer leven, en deze kennis kan u op zijn beurt helpen code te schrijven die correct werkt. Hoewel de arraynaam slechts een aanwijzer is, is de naam van een array van gehele getallen niet exact hetzelfde als een aanwijzer naar een geheel getal. Bekijk deze coderegels (te vinden in het voorbeeld van Array03): int LotsONumbers [50]; int x; LotsONumbers = & x;

Wijs met de LotsONumbers

-aanwijzer

iets anders aan: iets gedeclareerd als een geheel getal. De compiler laat je dit niet doen; je krijgt een foutmelding Dat zou niet het geval zijn als LotsONumbers als int * LotsONumbers werden verklaard; dan zou deze code werken. Maar zoals geschreven, geeft deze code je een compileerfout. En geloof het of niet, hier is de compileerfout die u krijgt in Code:: Blocks: fout: incompatibele typen in toewijzing van 'int *' in 'int [50]' Deze fout houdt in dat de compiler wel een definitief onderscheid tussen de twee typen, int * en int []. Desalniettemin is de arraynaam inderdaad een aanwijzer en kunt u deze als één gebruiken; je kunt er gewoon niet alles mee doen dat je kunt met een normale aanwijzer, zoals het opnieuw toewijzen.

Let bij het gebruik van arrays op de volgende tips. Deze zullen u helpen om uw arrays bug-vrij te houden:

Houd uw code consistent. Als u bijvoorbeeld een pointer naar een geheel getal declareert, behandel het dan niet als een array.

Houd uw code duidelijk en begrijpelijk. Als u pointers doorgeeft, is het ok om het adres van het eerste element te nemen, zoals in & (MyNumbers [0]) als hierdoor de code duidelijker wordt - hoewel deze gelijk is aan alleen MyNumbers.

  • Wanneer u een array declareert, probeer dan altijd een cijfer tussen de haakjes te zetten, tenzij u een functie schrijft die een array nodig heeft.

  • Wanneer u het externe sleutelwoord gebruikt om een ​​array te declareren, moet u doorgaan en ook de array-grootte tussen haakjes plaatsen. Maar wees consistent! Gebruik het ene nummer niet één keer en een ander nummer een andere keer. De eenvoudigste manier om consistent te zijn is om een ​​constante te gebruiken, zoals const int ArraySize = 10; in een gemeenschappelijk header-bestand en gebruik dat in uw array-declaratie: int MyArray [ArraySize];.

Arrays en Pointers in C ++ - dummies

Bewerkers keuze

Een Oracle-omgeving instellen - dummies

Een Oracle-omgeving instellen - dummies

Als u een typische PL / SQL-omgeving wilt instellen, hebt u de volgende componenten: Databaseserver: dit is een computer (of een reeks computers) die de Oracle-database uitvoert. Oracle werkt in veel populaire computeromgevingen. De meest gebruikte met Oracle zijn UNIX, Linux of een versie van Microsoft Windows. PL / SQL wordt meestal uitgevoerd ...

SQL-rijwaarden en -waarden - dummies

SQL-rijwaarden en -waarden - dummies

De waarden die worden bewaard in de cellen die de snijpunten van de SQL-database vormen De rijen en kolommen van de tabel zijn de grondstoffen waaruit u zinvolle relaties en trends kunt afleiden. Rijwaarden De meest zichtbare waarden in een database zijn tabelrijwaarden. Dit zijn de waarden die elke rij van een databasetabel ...

SQL eerste, tweede en derde normale vormen - dummies

SQL eerste, tweede en derde normale vormen - dummies

Er zijn drie bronnen van wijzigingsanomalieën in SQL Deze worden gedefinieerd als eerste, tweede en derde normale vormen (1NF, 2NF, 3NF). Deze normale vormen fungeren als remedies voor het wijzigen van anomalieën. Eerste normale vorm Om in de eerste normale vorm (1NF) te zijn, moet een tabel de volgende eigenschappen hebben: De tabel is tweedimensionaal met rijen en ...

Bewerkers keuze

Een kijkje nemen in het syndroom van Empty-Nest - dummies

Een kijkje nemen in het syndroom van Empty-Nest - dummies

Een veel voorkomende misvatting is dat wanneer de kinderen van een stel vertrekken thuis, zullen pappa en mama het syndroom van empty-nest ontwikkelen. Ja, ze hebben misschien een leeg nest, maar voor sommige paren bloeit hun liefdesleven in deze periode van hun leven. De slachtoffers van het syndroom zijn de paren waarvan de relatie uit elkaar valt als zij de enige ...

STD's: wat u moet weten over herpes - dummies

STD's: wat u moet weten over herpes - dummies

Herpes, veroorzaakt door het herpes simplex-virus (HSV) ), is een ongeneeslijke SOA. Herpes heeft eigenlijk twee vormen: herpes simplex-type 1 (HSV-1) en herpes simplex-type 2 (HSV-2). HSV-1 wordt meestal geassocieerd met koortsblaasjes en koortsblaren boven de taille. "Ongeveer 80 procent van de Amerikaanse volwassenen heeft orale herpes. Ongeveer 25 procent van ...

Tiener Geslacht: hoe te weten Hoe ver te gaan - dummies

Tiener Geslacht: hoe te weten Hoe ver te gaan - dummies

Een van de grootste vragen voor tieners is niet "Zou ik seks moeten hebben? "Maar" Hoe ver moet ik gaan? "Terwijl het eigen comfortniveau en dat van de partner de topprioriteit zou moeten zijn in deze beslissing, spelen andere factoren een rol, vooral als tieners dat amorfe concept van" het derde honk overwegen. "" Derde basis "...

Bewerkers keuze

Tien voorwaarden American Football Announcers Gebruik - dummies

Tien voorwaarden American Football Announcers Gebruik - dummies

Een van de moeilijkste en meest intimiderende onderdelen over het volgen van een Amerikaans voetbalwedstrijd is dat de presentatoren soms een vreemde taal lijken te spreken die alleen bekend is bij echte voetballiefhebbers. Maar als je een aantal belangrijke termen onthoudt, ben je ver voor op het spel. Hier zijn enkele voetbaltermen die je misschien hoort, ...

Het begin van een voetbalspel: The Kickoff - dummies

Het begin van een voetbalspel: The Kickoff - dummies

Voor Amerikaanse voetbalfans, de openingsaftrap is een opwindende start voor elke game. Ze zien de tweezijdige sensatie van het ene team dat probeert het andere te blokkeren en helpt de herhaler om door en voorbij 11 snelladers van het trapende team te rennen. (Wel, maak die tien spelers.De kicker staat meestal rond de 50-yard-lijn, ...

Uw voetbalcoachtoelen afstemmen op een leeftijdsgroep - dummies

Uw voetbalcoachtoelen afstemmen op een leeftijdsgroep - dummies

Elk kind in uw team is anders zoveel manieren. Sommigen zijn begaafde hardlopers, anderen kunnen duizelingwekkende vangsten maken en wat moeite om simpelweg de basistechnieken van het spel te vatten. Ongeacht de sterke en zwakke punten van de kinderen, die overal op de kaart staan, hebben jongeren algemene kenmerken die worden beïnvloed ...