Wku

Hur man skapar pekare i C

Pekare är en mardröm för varje ny C-programmerare. Men de är också den funktion som gjorde C den utbredda, kraftfullt programmeringsspråk det är tills idag. Liksom många andra programmeringsspråk funktioner och konstruktioner, det finns en systematisk metod för att skapa och använda C-pekare. Denna artikel är en steg-för-steg guide för att skapa och använda pekare i ett tydligt och enkelt sätt.

Förutsättning informationen

  • Pekare är variabler som håller adressen för en minnesplats i allmänhet (denna minnesplats kan hålla data av variabel eller bli borttagen ännu).
  • Referenser är variabler som håller minnet adressen för en annan variabel.
  • Den största skillnaden mellan en referens och en pekare är att hänvisningar pekar på tilldelade minnesplatser medan pekare kan peka på ofördelade minnesplatser.
  • Det finns en skillnad mellan den adress operatör (används på variabler tillbaka sin adress i minnet), hänvisningen deklarationen operatören (som används i en referens försäkran att indikera att den deklarerade variabeln är en referens) och bitvis "och" operatör, alla har samma symbol (&)
  • Pekare kan ökas och minskas (så att du kan ändra platsen där pekaren poäng).
  • Pekare kan tilldelas med användning av någon av följande metoder:
    • Tilldela en hänvisning till pekaren gör pekaren pekar på samma plats i minnet som referens.
    • Tilldela någon annan pekare av samma typ till pekaren göra både pekare pekar på samma plats.
    • Tilldela en siffra värde till pekaren (i hexadecimalt format) gör pekaren pekar på den specifika minnesplatsen som beaktats i denna siffra.
    • Tilldela adressen till en variabel av pekarens typ till pekaren gör pekaren pekar på minnesplatsen för den första byten av variabelns binära representationen i minnet.
  • Referenser kan tilldelas med användning av någon av följande metoder:
    • Tilldela annan hänvisning till referensen.
    • Tilldela en variabel av samma typ som referens kommer att göra referenspunkten till variabeln.
  • Pekare och referenser har datatyper, som anger vilken typ av data som utpekas av pekaren / referens.
  • Den typ av en hänvisning begränsar överlåtelsen av denna hänvisning till variabler / referenser av samma datatyp. Till exempel, om vi deklarerar ett heltal referens (int & d;), kan vi bara tilldela antingen ett annat heltal referens eller ett heltal variabel till denna referens (int i = 0; d = i;)
  • Den typ av en pekare begränsar tilldelningen av pekaren till referenser, adresser variabler / pekare av samma datatyp. Det påverkar också hämtning av data pekade på så ett heltal pekare kommer att hämta ett antal bitgrupper lika med antalet bytes tas upp av ett heltal på systemet. Dessutom påverkar valet av datatypen hur pekare ökas och minskas. När en pekare ökas, pekar den till nästa datatyp värdet från den aktuella platsen. Till exempel, om ett heltalsvärde tar fyra byte i minnet, inkrementera ett heltal pekare, kommer att göra det peka på nästa heltal, som är fyra bytes efter aktuell placering och så värdet av pekaren själv ökas med multiplar av 4.
  • Arrayvariabel namnen anses statiska / konstant pekare som pekar till den första byten i den första posten i arrayen och ha samma typ som de array poster.

Steg

Hur man skapar pekare i C. Bestäm vilken typ av pekare (som är, vilken typ av data som pekaren ska peka på).
Hur man skapar pekare i C. Bestäm vilken typ av pekare (som är, vilken typ av data som pekaren ska peka på).
  1. 1
    Bestäm vilken typ av pekare (som är, vilken typ av data som pekaren ska peka på). Följande tips kan hjälpa:
    • Om du deklarerar en dynamisk array använder array posterna datatyp.
    • Om du deklarerar pekaren att komma åt data i en variabel, använda samma datatyp som variabeln.
    • Om du deklarerar pekaren att förflytta en lista struktur, använda listan noden datatypen (vanligtvis en användare skapas).
    • Om du deklarerar pekaren att förflytta ett träd, använd datatyp trädnod, eller en pekare till trädnoden typ som typ (pekare till en pekare av trädnod typ!).
  2. 2
    Deklarera pekaren med en syntax som denna: * pointer-identifierare; där
    • är den typ du valt i steg 1
    • pointer-identifier är identifierare eller namnet på pekarvariabel
  3. 3
    Tilldela pekaren till en första minnesplats. Detta kan göras genom att använda någon av följande metoder:
    1. Allokera minne och pekar på den med pekaren: * i = (() * n), där n är antalet minnesblock tilldela.
    2. Tilldela adressen till en variabel för pekaren: * i = & x, där "x" är ett heltal och (&) betyder adress-av.
    3. Tilldela en array identifierare för pekaren: int * i = array1, där array1 är ett heltal array ([] array1;).
    4. Tilldela en hänvisning till pekaren: * i = a, där "a" är ett heltal referens (och en;).
    5. Tilldela en annan pekare till pekare: * i = z, där "z" är ett annat heltal pekare (* z;)
  4. 4
    Närhelst du behöver för att extrahera data posten idag utpekas av pekaren, använda value-at-adress operatör (*): x = * i, där i är ett heltal pekare.
  5. 5
    Använd indexering operatören på pekaren som om det var en matris när du vill få en minnesplats bredvid pekaren utan faktiskt framåt pekaren. Till exempel, om du har ett heltal pekare i, kan du använda i [2], som kommer att hämta heltal som är efter heltalet omedelbart efter heltal pekade med hänvisningen (heltalet som är 2 heltal efter den aktuella platsen). Pekaren jag kommer fortfarande att peka på samma minnesplats. Ett annat alternativ till detta är att få värdet på pekaren 2 steg efter denna pekare: * (i + 2)
  6. 6
    Använd uppåtpil (+ +), minskning (-), + = och - = operatörerna när du behöver ändra den aktuella platsen. i + = 5; kommer föra heltal pekaren I 5 heltal framåt.
  7. 7
    När du är klar med pekaren, om du allokerat minne till att pekaren måste du frigöra det tilldelade minnet med hjälp av gratis () funktionen. (Fri (i); där i är en pekare)

Tips

  • När du deklarerar en pekare som medlem i ett, åt du pekaren själv med punkt (.) Operatören, och du får åtkomst till värdet pekade med pekaren med (*) operatör. Till exempel, om du har en S1 som har ett heltal c pekare medlem, och du deklarerat en variabel s (struct s1 s;), SC kommer komma pekaren själv (sc = & I), kommer * sc komma åt data utpekas av medlemmen c (j = * SC).
  • Om du har en struktur som du har tilldelats använda malloc (), som returnerar en pekare till strukturen, är referenser till medlemmar av den tilldelade strukturen gjorts med operatören. Förutsatt strukturen igen, och s har förklarats som en pekare till strukturen typ, skulle följande tilldela adressen av en variabel och referera till variabeln respektive: s-> c = &j; k = * s-> c. Vissa programmerare väljer att skriva * (s-> c) för tydlighets skull, men det är inte nödvändigt.
  • Det är oftast bäst att hålla en pekare som pekar på något minne du fördela så att du kan frigöra den senare.
  • Det är en bra programmering praxis för att kontrollera om () lyckats allokera rätt minne bit genom att kontrollera om det returnerade pekaren inte är lika med NULL eller 0.
  • Titta in i Boehm sophämtare. En gång installerat, kan du använda den genom att ta gc.h och ersätter malloc () med gc_malloc (). Använda en sophämtare minskar minne buggar, men beroende på program kan öka eller minska prestandan.
  • Överväg att använda felsökningsverktyg såsom (Linux) som kan hjälpa till att identifiera minnesläckor, och för att spåra användningen av pekare till "out of bounds" uppgifter.

Varningar

  • Glöm inte att frigöra något minne du fördelats med (). Om du inte gör det kan det resultera i krascher, minnesspill och andra problem i ditt program.
  • Använda indexering operatören om pekare kan vara farligt eftersom du kanske försöker komma åt platser i minnet som inte är tillåtna eller få ofördelade värden minnesplatsen.
  • Tilldela inte en direkt minnesplats (med adress) till en pekare om du inte verkligen måste.
  • Alltid initiera pekare innan du använder dem, som "vilda" pekare pekar på slumpmässiga adresser, och få tillgång till dem kommer att krascha ditt program.