Hjem Personlig finansiering Arrayer og pointere i C ++ - dummies

Arrayer og pointere i C ++ - dummies

Video: Character arrays and pointers - part 1 2024

Video: Character arrays and pointers - part 1 2024
Anonim

Navnet på arrayet er en pointer til selve arrayet. array er en sekvens af variabler, der er gemt i hukommelsen. array navn peger på det første element.

Dette er et interessant spørgsmål om pointers: Kan du have en funktion header, såsom den følgende linje, og bare bruge sizeof til at bestemme, hvor mange elementer der er i arrayet? Hvis det er tilfældet, behøver denne funktion ikke at have den, der ringer op, angiver størrelsen af ​​arrayet.

int AddUp (int Numbers []) {
Overvej denne funktion, der findes i Array01 eksempelet og en main () der kalder det:

void ProcessArray (int Numbers []) { cout << "inside function: Størrelse i byte er" << sizeof (Numbers) << endl;} int main (int argc, char * argv []) {int MyNumbers [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; cout << "udenfor funktion: Størrelse i bytes er"; cout << sizeof (MyNumbers) << endl; ProcessArray (MyNumbers); returner 0;}

Når du kører denne applikation, her er hvad du ser:

Udenfor funktion: Størrelse i byte er 40 Indvendig funktion: Størrelse i byte er 4
Udenfor funktionen kender koden, at størrelsen af ​​arrayet er 40 byte. Men hvorfor mener koden, at størrelsen er 4, efter at den er inde i arrayet? Årsagen er, at selvom det ser ud til at du overfører et array, overfører du virkelig en

pointer til en matrix. Størrelsen på markøren er kun 4, og det er det, som den endelige cout linje udskriver.

Deklarationerne har en lille idiosyncrasi. Når du erklære en matrix ved at angive et bestemt antal elementer, såsom

int MyNumbers [5];

Kompilatoren ved, at du har en matrix, og størrelsen af ​​operatøren giver dig størrelsen af ​​hele arrayet. Arraynavnet er så

begge en peger og en matrix! Men hvis du erklærer en funktionsoverskrift uden en arraystørrelse, som f.eks. void ProcessArray (int Numbers []) {

behandler kompilatoren dette som blot en

pointer og ikke mere. Denne sidste linje svarer faktisk til følgende linje: void ProcessArray (int * Numbers) {

Således inden for de funktioner, som enten linjer erklærer, er følgende to linjer kode

ækvivalent <: Numbers [3] = 10; * (Numbers + 3) = 10; Denne ækvivalens betyder, at hvis du bruger en ekstern deklaration på en matrix, f.eks.

ekstern int MyNumbers [];

og derefter størrelsen på dette array, bliver kompilatoren forvirret. Her er et eksempel: Hvis du har to filer, tal. cpp og main. cpp, hvor tal. cpp erklærer en array og main. cpp erklærer det eksternt (som vist i Array02-eksemplet), vil du få en compilerfejl, hvis du kalder sizeof:

#include ved hjælp af navneområde std; Eksterne int MyNumbers []; int main (int argc, char * argv []) {cout << sizeof (MyNumbers) << endl; returner 0;}

I kode:: Blokke, gcc-kompilatoren giver os denne fejl:

fejl: ugyldig anvendelse af 'sizeof' til ufuldstændig type 'int []'

Løsningen er at sætte størrelsen af arrayet indenfor parenteserne.Bare sørg for, at størrelsen er den samme som i den anden kildekodefil! Du kan falde ud kompilatoren ved at ændre nummeret, og du

får ikke en fejl

. Men det er dårlig programmeringsstil og bare beder om fejl. Selvom et array

simpelthen er en sekvens af variabler, der alle grænser op til hinanden i hukommelsen, er navn i en matrix egentlig bare en pointer til det første element i arrayet. Du kan bruge navnet som en peger. Gør dog kun det, når du virkelig har brug for at arbejde med en peger. Når alt kommer til alt, har du virkelig ingen grund til at skrive kode, der er kryptisk, som * (Numbers + 3) = 10;. Det omvendte er også sandt. Se denne funktion: void ProcessArray (int * Numbers) {cout << tal [1] << endl;}

Denne funktion tager en pointer som parameter, men du får adgang til det som en matrix. Igen skal du ikke skrive kode som denne; I stedet skal du forstå

hvorfor kode som dette virker

. På den måde får du en dybere viden om arrays og hvordan de bor inde i computeren, og denne viden kan igen hjælpe dig med at skrive kode, der fungerer korrekt. Selvom arraynavnet blot er en pointer, er navnet på en række af heltal ikke det samme som en peger til et helt tal. Tjek disse linjer kode (findes i Array03 eksempelet): int LotsONumbers [50]; int x; LotsONumbers = & x;

Punkt LotsONumbers

pointer

til noget andet: noget erklæret som et helt tal. Kompilatoren lader dig ikke gøre dette; du får en fejl. Det ville ikke være tilfældet, hvis LotsONumbers blev erklæret som int * LotsONumbers; så ville denne kode arbejde. Men som skrevet, giver denne kode dig en compiler fejl. Og tro det eller ej, her er kompileringsfejlen du får i Kode:: Blokke: Fejl: inkompatible typer i tildeling af 'int *' til 'int [50]' Denne fejl indebærer, at kompilatoren ser en en klar skelnen mellem de to typer, int * og int []. Ikke desto mindre er arraynavnet virkelig en pointer, og du kan bruge den som en; Du kan bare ikke gøre alt sammen med det, du kan med en normal peger, som f.eks. tildele det igen.

Når du bruger arrayer, skal du være opmærksom på følgende tips. Disse vil hjælpe dig med at holde dine arrays fejlfri:

Hold din kode konsistent. Hvis du for eksempel forklarer en pointer til et helt tal, skal du ikke behandle det som en matrix.

Hold din kode klar og forståelig. Hvis du passerer pointers, er det okay at tage adressen til det første element, som i & (MyNumbers [0]), hvis dette gør koden klarere - selvom det svarer til bare MyNumbers.

  • Når du erklærer en matrix, skal du altid prøve at sætte et tal inde i parenteserne, medmindre du skriver en funktion, der tager en matrix.

  • Når du bruger det eksterne søgeord til at erklære en matrix, skal du gå videre og også sætte arraystørrelsen inden for parentes. Men vær konsekvent! Brug ikke et nummer én gang og et andet nummer en anden gang. Den nemmeste måde at være konsistent på er at bruge en konstant, såsom const int ArraySize = 10; i en fælles header-fil, og brug derefter det i din array-erklæring: int MyArray [ArraySize];.

Arrayer og pointere i C ++ - dummies

Valg af editor

Routingprotokollvalgskriterier - dummies

Routingprotokollvalgskriterier - dummies

Folk bruger to grundlæggende metoder til klassificering af ruteprotokoller - hvor de bruges og af hvordan de beregner routing. Du kan se, hvordan du vælger protokoller baseret på, hvor du planlægger at bruge dem, måden protokollen håndterer data på, og hvordan din router vælger hvilken protokol der skal bruges, når mere end en ...

Indstilling af Cisco Device Timeouts - dummies

Indstilling af Cisco Device Timeouts - dummies

Uden at indstille timeout-indstillinger for Cisco Device Privileged EXEC-tilstand, dine sessioner forbliver åbne på ubestemt tid. Dette er især farligt for konsolporten. Uden timeout parametre aktiveret, hvis administratoren ikke logger ud, har en indtrenger adgang og ingen problemer får forhøjede tilladelser. For at undgå denne potentielt farlige situation behøver du kun skrive a ...

Router Ethernet-interfacekonfiguration - dummies

Router Ethernet-interfacekonfiguration - dummies

Du starter processen med at konfigurere router Ethernet-grænseflader ved at foretage en fysisk forbindelse til din router. Når du har etableret forbindelsen, kan du fortsætte med den grundlæggende konfiguration af Ethernet-, Fast Ethernet- eller Gigabit Ethernet-forbindelser. Tilslutning til din router For at starte din konfiguration skal du oprette forbindelse til din router og komme ind i ...

Valg af editor

Med fokus på nogle hurtige løsninger til fotofile - dummier

Med fokus på nogle hurtige løsninger til fotofile - dummier

På trods af alle kameraproducenters forsøg på at gør fotografering idiotsikker, vi laver alle stadig mindre end perfekte billeder. Nogle gange er vi problemet - vi er for tætte eller for langt væk, eller kan ikke finde ud af, hvordan du bruger kameraets tåbebeskyttelsesfunktioner. Nogle gange er problemet, at virkeligheden nøjagtigt nægter at overholde vores forventninger: Himlen er ...

Lær at kende dine Manga Studio Layer Typer - Dummies

Lær at kende dine Manga Studio Layer Typer - Dummies

Manga Studio giver et udvalg af lag typer til brug i dit arbejde. Når du lærer at forstå og forstå, hvordan lag fungerer, vil du spekulere på, hvordan du nogensinde har arbejdet uden dem. Her er en introduktion til, hvad Manga Studio har til opbevaring for dig i sin lag lineup: Raster Layer: Dette er det grundlæggende ...

Få dit mobilwebsted tildelt på sociale bogmærker - dummies

Få dit mobilwebsted tildelt på sociale bogmærker - dummies

Populariteten af ​​websider med antallet af stemmer, de får. Resultatet er, at disse websteder er gode ressourcer til folk, der ønsker at holde øje med, hvad der er populært online. De fleste tilbyder speciel software, der gør det nemt for alle at stemme på et websted. Få dit websted opført ...

Valg af editor

Automatisk opdatering af din journal i Outlook 2000 - dummies

Automatisk opdatering af din journal i Outlook 2000 - dummies

Stardat 2001: På Star Trek, Virksomheden gør trofast daglige poster i kaptajnens log. Kaptajnen registrerer oplysninger om de planeter, besætningen har udforsket, udlændinge, de har kæmpet, og de bizarre fænomener, de har observeret ud i det dybe rum, hvor ingen er gået før! Nu er det din tur. Bare ...

Slet og gendan kontakter i Outlook - dummies

Slet og gendan kontakter i Outlook - dummies

Med Outlook, du behøver ikke at rive sider ud af en papir adressebog for at slippe af med en persons oplysninger; bare slet kontakten. Slettede kontakter går til mappen Slette emner i Outlook, indtil næste gang du tømmer mappen Slette elementer, så du kan hente dem derfra, hvis du laver ...