Video: Character arrays and pointers - part 1 2025
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 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.
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];.