Hur skapar jag pekare i C?

Eftersom "vilda" pekare pekar på slumpmässiga adresser
Initiera alltid pekare innan du använder dem, eftersom "vilda" pekare pekar på slumpmässiga adresser, och att komma åt dem kommer att krascha ditt program.

Pekare är mardrömmen för varje ny C-programmerare. De är dock också funktionen som gjorde C till det utbredda, kraftfulla programmeringsspråket det är fram till idag. Liksom många andra programmeringsfunktioner och konstruktioner finns det ett systematiskt tillvägagångssätt för att skapa och använda C-pekare. Den här artikeln är en steg-för-steg-guide för att skapa och använda pekare på ett tydligt och enkelt sätt.

Förutsedd information

  • Pekare är variabler som håller adressen till en minnesplats i allmänhet (den här minnesplatsen kan innehålla data för variabeln eller är ännu inte tilldelad).
  • Referenser är variabler som innehåller minnesadressen till en annan variabel.
  • Huvudskillnaden mellan en referens och en pekare är att referenser pekar på tilldelade minnesplatser medan pekare kan peka på icke allokerade minnesplatser.
  • Det finns en skillnad mellan adressoperatören (används på variabler för att returnera sin adress i minnet), referensdeklarationsoperatören (används i en referensdeklaration för att indikera att den deklarerade variabeln är en referens) och den bitvisa "och" operatören, alla har samma symbol (&)
  • Pekare kan ökas och minskas (så att du kan ändra platsen som pekaren pekar på).
  • Pekare kan tilldelas på något av följande sätt:
    • Tilldela en referens till pekaren som gör att pekaren pekar på samma plats i minnet som referensen.
    • Tilldela någon annan pekare av samma typ till pekaren så att båda pekarna pekar på samma plats.
    • Tilldelning av ett siffervärde till pekaren (i hexadecimalt format) gör att pekaren pekar på den specifika minnesplats som adresseras av den siffran.
    • Tilldela adressen till en variabel av pekarens typ till pekaren som gör att pekaren pekar på minnesplatsen för den första byten av variabelens binära representation i minnet.
  • Referenser kan tilldelas på något av följande sätt:
    • Tilldela en annan referens till referensen.
    • Att tilldela en variabel av samma typ som referensen gör referenspunkten till variabeln.
  • Pekare och referenser har datatyper som anger vilken typ av data som pekaren / referensen pekar på.
  • Typen av en referens begränsar tilldelningen av den referensen till variabler / referenser av samma datatyp. Till exempel, om vi deklarerar en heltalsreferens (int & d;), kan vi bara tilldela antingen en annan helreferens eller en heltalsvariabel till den referensen (int i = 0; d = i;)
  • Pekartypen begränsar tilldelningen av pekaren till referenser, adresser till variabler / pekare av samma datatyp. Det påverkar också hämtningen av data som pekas på så att en helpekare kommer att hämta ett antal byte som är lika med antalet byte som tas upp av ett heltal i systemet. Valet av datatyp påverkar också hur pekare ökas och minskas. När en pekare ökas pekar den på nästa datatypvärde från den aktuella platsen. Till exempel, om ett heltalvärde tar 4 byte i minnet, kommer en helpekare att öka det, pekar det på nästa heltal, vilket är 4 byte efter den aktuella platsen och så ökas värdet på själva pekaren med multiplar av 4.
  • Array-variabelnamn betraktas som statiska / konstanta pekare som pekar på den första byten i det första objektet i arrayen och har samma typ som array-objekten.
Hur representeras funktionspekare i C
Hur representeras funktionspekare i C?

Steg

  1. 1
    Bestäm vilken typ av pekare (det vill säga vilken typ av data pekaren ska peka på). Följande tips kan hjälpa:
    • Om du förklarar en dynamisk matris använder du datatypen för arrayartiklar.
    • Om du förklarar pekaren för att få åtkomst till data för en variabel, använd samma datatyp som variabeln.
    • Om du förklarar pekaren att korsa en liststruktur använder du datatypen för listnoden (vanligtvis en användarskapad struktur).
    • Om du förklarar pekaren för att korsa ett träd, använd datatypen för trädnoden eller en pekare till trädnodtypen som typen (pekare till en pekare av trädnodtyp!).
  2. 2
    Förklara pekaren med en syntax så här: datatyp * pekare-identifierare; var
    • datatyp är den typ du bestämde i steg 1
    • pekare-identifierare är identifieraren eller namnet på pekervariabeln
  3. 3
    Tilldela pekaren till en första minnesplats. Detta kan göras med hjälp av någon av följande metoder:
    1. Tilldela minne och peka på det med pekaren: int * i = malloc (sizeof (int) * n); där n är antalet minnesblock som ska tilldelas.
    2. Tilldela adressen till en variabel till pekaren: int * i = & x; där "x" är ett heltal och (&) betyder adress-till.
    3. Tilldela en array identifierare till pekaren: int * i = matris1; där array1 är ett heltal array (int [] array1;).
    4. Tilldela en referens till pekaren: int * i = a; där "a" är en heltalsreferens (int & a;).
    5. Tilldela en annan pekare till pekaren: int * i = z; där "z" är en annan helpekare (int * z;)
  4. 4
    Närhelst du behöver extrahera det datapost som pekaren pekar på, använder du värde-till-adressoperatören (*): int x = * i; där i är en heltalspekare.
  5. 5
    Använd indexeringsoperatören på pekaren som om det var en matris när du vill få en minnesplats bredvid pekaren utan att peka framåt. Om du till exempel har en helpekare i kan du använda i [2] som hämtar heltalet som är efter heltalet omedelbart efter det heltal som referensen pekar på (heltalet som är två heltal efter den aktuella platsen). Pekaren i kommer fortfarande att peka på samma minnesplats. Ett annat alternativ till detta är att få värdet vid pekaren 2 steg efter den här pekaren: * (i + 2)
  6. 6
    Använd increment (++), decrement (-), + = och - = operatorer när du behöver ändra aktuell plats. i + = 5; kommer att flytta fram heltalspekaren i 5 heltal framåt.
  7. 7
    När du har använt pekaren, om du har tilldelat minnet till den pekaren, se till att du frigör det tilldelade minnet med funktionen free (). (gratis (i); där jag är en pekare)
Tilldela någon annan pekare av samma typ till pekaren så att båda pekarna pekar på samma plats
Tilldela någon annan pekare av samma typ till pekaren så att båda pekarna pekar på samma plats.

Tips

  • När du förklarar en pekare som medlem i en struktur får du åtkomst till pekaren med hjälp av punkt (.) -Operatören och du får åtkomst till det värde som pekaren pekar på med hjälp av (*) -operatören. Till exempel, om du har en struct s1 som har ett heltal pekmedlem c, och du förklarade en variabel s (struct s1 s;), kommer sc att komma åt själva pekaren (sc = & i), * sc kommer att få åtkomst till de data som av medlem c (j = * sc).
  • Om du har en struktur som du har tilldelat med malloc (), som returnerar en pekare till strukturen, görs referenser till medlemmar i den tilldelade strukturen med operatorn ->. Förutsatt att strukturen s1 återigen och s har förklarats som en pekare till den strukturtypen, skulle följande tilldela adressen till en variabel och referera till variabeln respektive: s-> c = & j; k = * s-> c. Vissa programmerare väljer att skriva * (s-> c) för tydlighetens skull, men det är inte nödvändigt.
  • Titta in i Boehm sopor. När du väl har installerat kan du använda den genom att inkludera gc.h och ersätta malloc () med gc_malloc (). Att använda en sopuppsamlare minskar minnesfel, men beroende på program kan det öka eller minska prestanda.
  • Överväg att använda felsökningsverktyg som valgrind (Linux) som kan hjälpa till att identifiera minnesläckage och spåra användningen av pekare till "out of bounds" -data.
  • Det är vanligtvis bäst att hålla en pekare som pekar på vilket minne du tilldelar så att du kan frigöra det senare.
  • Det är en bra programmeringspraxis att kontrollera om malloc () lyckades allokera lämplig minnesklump genom att kontrollera om den returnerade pekaren inte är lika med NULL eller 0.
Använda C-pekare
Liksom många andra programmeringsfunktioner och konstruktioner finns det ett systematiskt tillvägagångssätt för att skapa och använda C-pekare.

Varningar

  • Att använda indexeringsoperatören på pekare kan vara farligt eftersom du kan försöka komma åt platser i minnet som inte är tillåtna eller få otilldelade minnesplatsvärden.
  • Glöm inte att frigöra minne som du har tilldelat med malloc (). Om du inte gör det kan det leda till kraschar, minnesflöde och andra problem i ditt program.
  • Tilldela inte en direkt minnesplats (efter adress) till en pekare om du inte verkligen behöver.
  • Initiera alltid pekare innan du använder dem, eftersom "vilda" pekare pekar på slumpmässiga adresser, och att komma åt dem kommer att krascha ditt program.

Frågor och svar

  • Hur representeras funktionspekare i C?
    De representeras med hjälp av en variabel av typen (return_type (* variable_name)) (param1_type, param2_type) i C-koden. De beter sig som alla andra pekare förutom att de kan kallas.

FacebookTwitterInstagramPinterestLinkedInGoogle+YoutubeRedditDribbbleBehanceGithubCodePenWhatsappEmail