webForumDet fria alternativet

Test med pekare

C/C++

13 svar · 456 visningar · startad av taper lawyer

Medlem sedan jan. 2004155 inlägg
Frågan#1

Jag försöker nu lära mig hur man använder pekare, men givetvis fungerar inte programmet jag skapar...
Länk

Edit: Jag kanske skall berätta vad programmet skall göra; jag skall med hjälp av pekaren få ut värdet i variabeln var.

Medlem sedan feb. 20002 300 inlägg
#2

Variabeln "var" ligger i funktionen test(). Du kan inte komma åt den variabeln från main().

#include <iostream>

using namespace std;

int main()
{
	char var = 'a';
	char *pek = &var;
	
	cout << *pek << endl;
	cout << var << endl;
	
	return 0;
}
Medlem sedan jan. 2004155 inlägg
#3

Nu ser koden ut så här:

#include <iostream>

using namespace std;

int main()
{
	char var = 'a';
	char *pek = &var;
	
	cout << pek << endl;
	cout << var << endl;
	
	cin >> var;
	
	return 0;
}

Men varför skriver den ut denna text?

aá "
a

Medlem sedan aug. 20021 752 inlägg
#4

När du skriver ut din pekare så vet programmet inte hur stort utrymme som den pekar på, 1 eller 2 eller ännu fler tecken, då skriver programmet ut alla tecken tills den hittar ett null tecken ('\0'), när du däremot skriver ut en char så vet datorn att det bara är ett tecken och skriver därför bara ut ett tecken.

/Viktor

Medlem sedan jan. 2004155 inlägg
#5

Hm, men hur skall jag göra då?

Medlem sedan juni 20008 205 inlägg
#6

Det är en annan sak att skriva cout << *var och att skriva cout << var - i den första varianten avrefererar du pekaren, vilket innebär att du säger att du vill skriva ut en char, så då skulle det bara skrivas ut ett "a". I den andra varianten, dock, skickar du pekaren till utskrift, och det råkar ju falla sig som så att i C, och delvis i C++, används charpekare som strängar, och de antas som Viktor påpekade fortsätta till första bästa nulltecken.

Medlem sedan jan. 2004155 inlägg
#7

Jag kom fram till detta:

#include <iostream>

using namespace std;

int main()
{
	char var = 'a';
	char *pek = &var;
	
	cout << *pek << endl;
	cout << var << endl;
	
	cin >> var;
	
	return 0;
}
Medlem sedan dec. 200381 inlägg
#8
#include <iostream>
#include <stdlib.h>

using namespace std;

	char var = 'a';
	char *pek = &var;

int main()
{

cout<<var<<endl;
cout<<*pek<<endl;
	
	system("PAUSE");
	return 0;
}
Medlem sedan juni 200010 432 inlägg
#9

Pekare är kanske inte så givet. Men om man betraktar programmet man skriver som en samling adresser och inte endast som att man ska utföra operationer så blir det lite enklare. Genom pekaren får man tillgång till adresserna och dess innehåll.

Pekare används med fördel till listor, arrayer och funktioner som voidpekare (generella pekare). Det i tråden givna exemplena säger inte så mycket då det först med en reell användbarhet som kronan brukar trilla ned :)

Medlem sedan jan. 2004155 inlägg
#10

Ni har inte lust att skriva ett litet exempel på hur man med fördel använder pekare, så kanske poletten (kronan) trillar ner för mig också? :)

Medlem sedan juni 200010 432 inlägg
#11

Hmm... för en tid sedan kastade jag ihop en räknare som exempel på hur man kan traversera expressions (fråga här i forumet). Där finns en liten variant av hur man kan använda pekare för att plocka bit för bit av en sträng (input till räknaren): http://www.webforum.nu/showthread.php?s=&postid=773864#post773864

Annars kan du ju beakta följande:

void func1(char *pek)
{
    *pek='a';
}

void func2(char var)
{
    var='a';
}

Vilken av funktionerna har förändrat sin parameters värde när funktionen terminerat?

Vad det gäller funktionsparametrar så kastas normalt parametervärden (eller kopior av värden/a) bara upp på stacken för att sen användas i funktionen. När funktionen terminerar försvinner stacken och då även värdena (parametrarna). Men om man skickar en pekare så skickar man inga värden, utan kopia på adressen till värdet varpå det är skitsamma om stacken försvinner då funktionen ju fått access direkt och inga kopior.

En lista:

typedef struct alist{
   void *data;
    alist *next;
};

I detta onyanserade C - kodexempel är varje segment (ovan kod) ett element i listan och 'void *data' en pekare till vilken datatyp som helst (mao en generell pekare) och 'alist *next' en väg till nästa element i listan. Det hade blivit otympligt för att inte säga omöjligt att försöka få till (kod ovan) listan utan pekare... krävs ju dock att man skapat (allokerat) minne som pekarna kan peka på.

Medlem sedan dec. 200381 inlägg
#12

taper lawyer skrev:

Ni har inte lust att skriva ett litet exempel på hur man med fördel använder pekare, så kanske poletten (kronan) trillar ner för mig också? :)

Det finns ju massor av tutorials.

Medlem sedan dec. 20003 887 inlägg
#13

Det bästa exemplet, anser jag, är att själv sätta sig ner och pilla ihop en länkad lista, så kommer man på massa bra saker pekare kan användas till.

Medlem sedan dec. 20003 887 inlägg
#14

Jag hittade en rätt välskriven artikel om pekare för den som inte vet vad det är eller hur dom fungerar.

A Beginner's Guide to Pointers

255 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)