2016-08-24, 20:28
  #1
Medlem
Hej!

Håller just nu på att börja plugga lite c och har egentligen inte kommit in på avsnittet pekare än, men min bok använder följande exempel:

Kod:
#include <stdio.h>
#define TIMMAR 8
int main()
{
	int hoursalary = -1;
	int *hs = &hoursalary; 
	char namn[20];
	
	printf("What's your name?");
	scanf("%19s", namn);
	printf("Hello %s! \n", namn);
	
	puts("How much do you earn in an hour?");
	scanf("%i", &hoursalary);
	hoursalary = hoursalary * TIMMAR;
	printf("Daily salary is %ikr", hoursalary);
	printf("%i\n", *hs);
	
	return 0;
}

Skulle någon kunna förklara varför han använder en pekare i detta exempel? (allt fetmarkerat)
Har han någon speciell anledning, eller är det bara för att mjuka upp oss inför pekare-avsnittet längre fram?

Min tanke är att man i raderna

Kod:
	int *hs = &hoursalary; 

Kod:
	scanf("%i", &hoursalary);

lika gärna bara skulle kunna skippa "int *hs = &hoursalary;" och bara köra på

Kod:
	scanf("%i", hoursalary);

dvs skippa allt jox med minnesadresser och pekare och bara lagra värdet som matas in via scanf direkt in i hoursalary-variabeln.

Har jag fel? Om så är fallet, varför?
Citera
2016-08-24, 20:43
  #2
Medlem
christerys avatar
Citat:
Ursprungligen postat av aiming-HIGH
Hej!

Håller just nu på att börja plugga lite c och har egentligen inte kommit in på avsnittet pekare än, men min bok använder följande exempel:

Kod:
#include <stdio.h>
#define TIMMAR 8
int main()
{
	int hoursalary = -1;
	int *hs = &hoursalary; 
	char namn[20];
	
	printf("What's your name?");
	scanf("%19s", namn);
	printf("Hello %s! \n", namn);
	
	puts("How much do you earn in an hour?");
	scanf("%i", &hoursalary);
	hoursalary = hoursalary * TIMMAR;
	printf("Daily salary is %ikr", hoursalary);
	printf("%i\n", *hs);
	
	return 0;
}

Skulle någon kunna förklara varför han använder en pekare i detta exempel? (allt fetmarkerat)
Har han någon speciell anledning, eller är det bara för att mjuka upp oss inför pekare-avsnittet längre fram?

Min tanke är att man i raderna

Kod:
	int *hs = &hoursalary; 

Kod:
	scanf("%i", &hoursalary);

lika gärna bara skulle kunna skippa "int *hs = &hoursalary;" och bara köra på

Kod:
	scanf("%i", hoursalary);

dvs skippa allt jox med minnesadresser och pekare och bara lagra värdet som matas in via scanf direkt in i hoursalary-variabeln.

Har jag fel? Om så är fallet, varför?

Pekaren gör att du kan ändra på innehållet som pekaren avser, skickar man bara värdet och inte adressen så ändras värdet bara lokalt och när du återvänder från scanf så har ingenting hänt.

Namn är åxå en pekare till första elementet i en char array.
Citera
2016-08-24, 20:43
  #3
Medlem
Citat:
Ursprungligen postat av aiming-HIGH
Har jag fel? Om så är fallet, varför?
Pekare är inte samma sak som DET det pekar på.
På liknande sätt som en parkerings plats INTE är samma sak som en BIL, så är INTE en pekare till en INT, samma sak som en INT.

Du kan kanske ge dig på att läsa lite om hur C funkar "under ytan" // maskin kod // assembler och hur minnet funkar, det kan kanske ge lite förståelse.
Men det kommer ni gå genom när ni börjar med pekare.
__________________
Senast redigerad av sagonar 2016-08-24 kl. 20:44. Anledning: rättstavning
Citera
2016-08-24, 20:48
  #4
Medlem
Jag vet faktiskt inte vad hs är bra till. Kom författaren inte på något bättre exempel med avrefereringsoperatorn "*" (eller vad den heter)? Ett vanligare exempel är ju just i funktionsanrop i C när man som sagt vill att funktionen ska ändra värdet. I C++ har du ju "call-by-reference" som ett alternativ. Ett annat exempel är ju pekare i datastrukturer som länkade listor o s v.
Citera
2016-08-24, 20:55
  #5
Medlem
Citat:
Ursprungligen postat av sagonar
Pekare är inte samma sak som DET det pekar på.
På liknande sätt som en parkerings plats INTE är samma sak som en BIL, så är INTE en pekare till en INT, samma sak som en INT.

Du kan kanske ge dig på att läsa lite om hur C funkar "under ytan" // maskin kod // assembler och hur minnet funkar, det kan kanske ge lite förståelse.
Men det kommer ni gå genom när ni börjar med pekare.


Jag har förstått att pekaren pekar på minnesadresser precis som parkeringsplatsnumrering. Men finns det någon anledning att ens blanda in pekare i exemplet han har dragit, som jag har missat?

Jag menar vad är det som blir fel om jag kör på följande?

Kod:
int hoursalary = -1
printf("Vad är din lön?");
scanf("%i", hoursalary);

hoursalary = hoursalary * 8;
printf("Din dagslön är %i ", hoursalary);
Citera
2016-08-24, 20:58
  #6
Medlem
Citat:
Ursprungligen postat av aiming-HIGH
Jag menar vad är det som blir fel om jag kör på följande?

Kod:
int hoursalary = -1
...
scanf("%i", hoursalary);

Argumenten till scanf ska vara pekare så ovanstående blir fel, till printf ska det däremot inte vara pekare (förutom för strängar).
Citera
2016-08-24, 21:05
  #7
Medlem
Citat:
Ursprungligen postat av Hominem
Argumenten till scanf ska vara pekare så ovanstående blir fel, till printf ska det däremot inte vara pekare (förutom för strängar).



JAHAAA det var detta jag totalmissat, så varje gång man läser in med hjälp av scanf så ska det som matas in läggas in i minnesadressen - inte direkt in i variabeln.

Nu hajjar jag nog, tack så mycket!
Citera
2016-08-24, 21:08
  #8
Medlem
Protons avatar
Citat:
Ursprungligen postat av aiming-HIGH
Jag har förstått att pekaren pekar på minnesadresser precis som parkeringsplatsnumrering. Men finns det någon anledning att ens blanda in pekare i exemplet han har dragit, som jag har missat?

Jag menar vad är det som blir fel om jag kör på följande?

Kod:
int hoursalary = -1
printf("Vad är din lön?");
scanf("%i", hoursalary);

hoursalary = hoursalary * 8;
printf("Din dagslön är %i ", hoursalary);

Enklast är väl att prova och se vad som händer? Eventuellt kraschar programmet, eller så kompilerar det inte ens, men det kan det ju vara värt om du får reda på vad som händer?
Citera
2016-08-24, 21:13
  #9
Medlem
Citat:
Ursprungligen postat av aiming-HIGH
så varje gång man läser in med hjälp av scanf så ska det som matas in läggas in i minnesadressen - inte direkt in i variabeln.

call-by-reference som det handlar om kräver att man använder pekare i C, medan i C++ kan man deklarera argumentet som referens: int &name.
Citera
2016-08-24, 23:13
  #10
Bannlyst
I C är lokala variabler helt privata för funktionen. Inga andra funktioner, ens de man anropar, kan komma åt dem. Och alla argument som en funktion får är egna privata kopior av det skickade. Att ge scanf() en egen kopia av värdet -1 hjälper inte, det funktionen behöver är adressen för att kunna ge data tillbaka. Det finns tre sätt att göra det: globala variabler eller andra state changing grejor (t.ex. filer), returvärdet eller dela med sig av adresser. Globala variabler vore dumt och returvärdet använder scanf() till annat.
Citera
2016-08-25, 13:44
  #11
Medlem
enowens avatar
Citat:
Ursprungligen postat av aiming-HIGH
Hej!

Håller just nu på att börja plugga lite c och har egentligen inte kommit in på avsnittet pekare än, men min bok använder följande exempel:

Kod:
#include <stdio.h>
#define TIMMAR 8
int main()
{
	int hoursalary = -1;
	int *hs = &hoursalary; 
	char namn[20];
	
	printf("What's your name?");
	scanf("%19s", namn);
	printf("Hello %s! \n", namn);
	
	puts("How much do you earn in an hour?");
	scanf("%i", &hoursalary);
	hoursalary = hoursalary * TIMMAR;
	printf("Daily salary is %ikr", hoursalary);
	printf("%i\n", *hs);
	
	return 0;
}

Skulle någon kunna förklara varför han använder en pekare i detta exempel? (allt fetmarkerat)
Har han någon speciell anledning, eller är det bara för att mjuka upp oss inför pekare-avsnittet längre fram?

Min tanke är att man i raderna

Kod:
	int *hs = &hoursalary; 

Kod:
	scanf("%i", &hoursalary);

lika gärna bara skulle kunna skippa "int *hs = &hoursalary;" och bara köra på

Kod:
	scanf("%i", hoursalary);

dvs skippa allt jox med minnesadresser och pekare och bara lagra värdet som matas in via scanf direkt in i hoursalary-variabeln.

Har jag fel? Om så är fallet, varför?

I fallet ovan så är pekaren helt onödig, ja.
Citera
2016-08-25, 13:48
  #12
Medlem
Citat:
Ursprungligen postat av enowen
I fallet ovan så är pekaren helt onödig, ja.

Är ju inte helt korrekt enligt diskussioner ovan.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in