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

Arrayer og pekere i C ++ - dummies

Video: SCP-3301 The SCP Foundation Board Game reading | Safe Class | Doctor Wondertainment SCP 2024

Video: SCP-3301 The SCP Foundation Board Game reading | Safe Class | Doctor Wondertainment SCP 2024
Anonim

Navnet på arrayet er en peker til selve arrayet. array er en sekvens av variabler lagret i minnet. array navn peker på det første elementet.

Dette er et interessant spørsmål om pekere: Kan du ha en funksjonsoverskrift, for eksempel den følgende linjen, og bare bruk sizeof for å bestemme hvor mange elementer som er i arrayet? Hvis det er tilfelle, vil denne funksjonen ikke trenge å ha den som ringer angir størrelsen på arrayen.

> int AddUp (int Numbers []) {
Vurder denne funksjonen funnet i Array01 eksempelet og en hoved () som kalles det:

void ProcessArray (int Numbers []) { cout << "inne funksjon: Størrelse i byte er" << sizeof (Tall) << endl;} int main (int argc, char * argv []) {int MyNumbers [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; cout << "utenfor funksjon: Størrelse i byte er"; cout << sizeof (MyNumbers) << endl; ProcessArray (MyNumbers); return 0;}

Når du kjører dette programmet, er det det du ser:

Utenfor funksjon: Størrelse i byte er 40 Innvendig funksjon: Størrelse i byte er 4
Utenfor funksjonen vet koden at størrelsen på arrayet er 40 byte. Men hvorfor synes koden at størrelsen er 4 etter at den er inne i matrisen? Årsaken er at selv om det ser ut til at du overfører en matrise, overfører du virkelig en

peker til en matrise. Størrelsen på pekeren er bare 4, og så er det hva den endelige cout linjen skriver ut.

Deklarasjonsarrayer har en liten idiosynkrasjon. Når du erklære en matrise ved å gi et bestemt antall elementer, for eksempel

int MyNumbers [5];

kompilatoren vet at du har en matrise, og størrelsen på operatøren gir deg størrelsen på hele oppsettet. Arteringsnavnet er da

begge en peker og en matrise! Men hvis du erklærer en funksjonsoverskrift uten en arraystørrelse, for eksempel void ProcessArray (int Numbers []) {

, behandler kompilatoren dette som en

peker og ingenting mer. Denne siste linjen er faktisk ekvivalent med følgende linje: void ProcessArray (int * Numbers) {

Således inne i funksjonene som enten linje erklærer, er følgende to kodelinjer

ekvivalent <: Tall [3] = 10; * (Tall + 3) = 10; Denne ekvivalensen betyr at hvis du bruker en ekstern deklarasjon på en matrise, for eksempel

ekstern int MyNumbers [];

og deretter størrelsen på denne gruppen, blir kompilatoren forvirret. Her er et eksempel: Hvis du har to filer, tall. cpp og main. cpp, hvor tallene. cpp erklærer en matrise og hoved. cpp erklærer det eksternt (som vist i Array02-eksempelet), vil du få en kompilatorfeil hvis du ringer sizeof:

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

I kode:: Blokker, gcc-kompilatoren gir oss denne feilen:

feil: ugyldig bruk av 'sizeof' til ufullstendig type 'int []'

Løsningen er å sette størrelsen av gruppen inne parenteser.Bare vær sikker på at størrelsen er den samme som i den andre kildekoden filen! Du kan falle ut kompilatoren ved å endre nummeret, og du

får ikke en feil

. Men det er dårlig programmeringsstil og bare ber om feil. Selv om et array

ganske enkelt er en sekvens av variabler som er tilstøtende til hverandre i minnet, er navn av en matrise egentlig bare en peker til det første elementet i arrayet. Du kan bruke navnet som en peker. Men gjør det bare når du virkelig trenger å jobbe med en peker. Tross alt, du har virkelig ingen grunn til å skrive kode som er kryptisk, som * (Numbers + 3) = 10;. Den omvendte er også sant. Se på denne funksjonen: void ProcessArray (int * Numbers) {cout << tall [1] << endl;}

Denne funksjonen tar en peker som en parameter, men du får tilgang til den som en matrise. Igjen, skriv ikke kode som dette; I stedet bør du forstå

hvorfor kode som dette virker

. På den måten får du en dypere kunnskap om arrays og hvordan de bor i datamaskinen, og denne kunnskapen kan i sin tur hjelpe deg med å skrive kode som fungerer riktig. Selv om arraynavnet bare er en pointer, er navnet på en rekke heltall ikke det samme som en peker til et heltall. Sjekk ut disse kodelinjene (funnet i Array03-eksempelet): int LotsONumbers [50]; int x; LotsONumbers = & x;

Pek LotsONumbers

pekeren

til noe annet: noe erklært som et heltall. Kompilatoren lar deg ikke gjøre dette; du får en feil. Det ville ikke være tilfelle hvis LotsONumbers ble erklært som int * LotsONumbers; da ville denne koden fungere. Men som skrevet, gir denne koden deg en kompilatorfeil. Og tro det eller ikke, her er kompilasjonsfeilen du får i Kode:: Blokker: Feil: inkompatible typer i tildeling av 'int *' til 'int [50]' Denne feilen innebærer at kompilatoren ser en klart skille mellom de to typene, int * og int []. Likevel er arraynavnet virkelig en peker, og du kan bruke den som en; du kan bare ikke gjøre alt med det du kan med en vanlig peker, for eksempel tilordne den.

Når du bruker arrays, merk deretter følgende tips. Disse vil hjelpe deg med å holde arraysene dine feilfrie:

Hold koden din konsekvent. Hvis du for eksempel forklarer en peker til et heltall, må du ikke behandle det som en matrise.

Hold koden klar og forståelig. Hvis du passerer poeng, er det greit å ta adressen til det første elementet, som i & (MyNumbers [0]) hvis dette gjør koden klarere, selv om den tilsvarer bare MyNumbers.

  • Når du erklærer en matrise, prøv alltid å sette et tall inne i parentes, med mindre du skriver en funksjon som tar en matrise.

  • Når du bruker det eksterne søkeordet til å deklarere en matrise, går du videre og setter også matriseformatet i parentes. Men vær konsekvent! Ikke bruk ett nummer én gang og et annet nummer en annen gang. Den enkleste måten å være konsistent er å bruke en konstant, for eksempel const int ArraySize = 10; i en felles headerfil, og bruk deretter det i din arraydeklarasjon: int MyArray [ArraySize];.

Arrayer og pekere i C ++ - dummies

Redaktørens valg

Vanlige medikamenteffekter for legeassistenteksamen - dummies

Vanlige medikamenteffekter for legeassistenteksamen - dummies

Bli kjent med vanlige bivirkninger for legeassistenteksamen (PANCE). Den gjennomsnittlige personen over 60 år tar omtrent ni reseptbelagte medisiner og ser minst fire forskjellige helsepersonell. Potensialet for noen til å oppleve bivirkningene av disse medisinene er enorm, og det er potensialet for signifikante legemiddelinteraksjoner. ...

Epidemiologiske studier dekket av legeassistenteksamen - dummies

Epidemiologiske studier dekket av legeassistenteksamen - dummies

For legeassistenteksamen (PANCE) du bør være oppmerksom på forskjellene mellom typer epidemiologiske studier. Det første trinnet er å gjenkjenne om studiet er en retrospektiv studie eller en prospektiv studie: Retrospektiv: En retrospektiv studie betyr at du ser på fortiden for å finne ut hva som skjedde. For eksempel, en ...

Forhold som påvirker pleura dekket på legeassistenteksamen - dummies

Forhold som påvirker pleura dekket på legeassistenteksamen - dummies

Du kan se Spørsmål om legeassistenteksamen om forhold som påvirker pleura. Du må vurdere evaluering og behandling av pleural effusions, pneumothorax og pleurisy. Væske rundt lungene: Pleural effusjon Normalt er pleura et tomt rom; en pleural effusjon er ganske enkelt væske som opptar den plassen. Pleural ...

Redaktørens valg

Slik setter du automatiske varsler på LinkedIn - dummies

Slik setter du automatiske varsler på LinkedIn - dummies

Sikkert, du kan gjøre alt fotverket ved å gå til LinkedIn hjemmesiden og ser deg rundt for å se hvilke meldinger eller endringer som har skjedd. Den sanne kraften til å holde kontakten, har imidlertid LinkedIn, kontakter deg automatisk med den informasjonen du trenger for å holde deg informert. Klikk på Administrer-koblingen ved siden av Personvern og innstillinger ...

Tips for å administrere dine LinkedIn Post-interaksjoner - dummies

Tips for å administrere dine LinkedIn Post-interaksjoner - dummies

Når du klikker Publiser på LinkedIn, kan du tenke at jobb er ferdig, men det er bare begynt. Etter hvert som flere og flere leser innlegget ditt, kan de samhandle med innlegget og med deg som forfatter. Her er noen ting å huske på etter at du har publisert et innlegg: Overvåk statistikken. Når du ...

Forstå LinkedIn Pulse - dummies

Forstå LinkedIn Pulse - dummies

Har du sjekket ut LinkedIn Pulse ennå? Tenk deg om du leser en avis som bare viste deg artikler som har betydning for deg. (For det hele, for mange av dere, tenk på de dagene du kanskje har lest en avis.) Tilpassede nyheter er mulige, og på LinkedIn kalles det LinkedIn Pulse. Alt du trenger å gjøre for å ...

Redaktørens valg

Hva Dragon NaturallySpeaking kan gjøre for deg - dummies

Hva Dragon NaturallySpeaking kan gjøre for deg - dummies

Noe om å diktere til en datamaskin vekker alle slags urealistiske forventninger hos mennesker. Hvis du forventer at du skal servere deg frokost på sengen, har du lykke til. Denne artikkelen ble ikke skrevet ved å si "Computer, skriv en bok om NaturallySpeaking. "Forfatteren måtte diktere det ord for ord, akkurat som hun ville hatt ...

Når Start ikke starter i NaturallySpeaking - dummies

Når Start ikke starter i NaturallySpeaking - dummies

Når du gir kommandoen "Start" til Dragon NaturallySpeaking, du sier "Start America Online" eller "Start Microsoft Works" eller "Start Quicken", og programmet skal åpnes. Men hva hvis det ikke gjør det? Hva er greia? Start-kommandoen starter et program som er installert på maskinen din, og har enten et snarveisikon på ...

Når NaturallySpeaking Menykommandoer ikke fungerer - dummies

Når NaturallySpeaking Menykommandoer ikke fungerer - dummies

Når du gir en kommando til NaturallySpeaking, for eksempel "Klikk" og ingenting skjer, det sannsynlige problemet er at menyen Bruk menyer som er kompatible med skjermlesere, ikke er merket av. For å sjekke det: Velg Verktøy → Valg i vinduet NaturallySpeaking. Det er ikke noe poeng å fortelle deg hvordan du får tilgang til dette med stemmen, for det er akkurat ...