Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2016-06-07, 13:10
  #13
Medlem
Citat:
Ursprungligen postat av Tiger-Lily
Okej, jag har klurat på ett exempel, där jag har svårt att förstå hur jag ska använda pekare.

Säg att jag har en for-sats. for(int i = 0; i < 8; i++)

Detta är ju ett helt vanligt sätt att deklarera en for-sats.

Säg nu att jag vill göra detta med pekare. Det är här jag går bet, för jag förstår inte när, var hur, jag ska peka och vad som gör vad.

För att kunna använda pekare, måste jag ha något att peka mot. Dvs, jag måste fortfarande ha en int i = 0. Jag måste också ha en pekare, som pekar på int i = 0.

så:

int i = 0;
int *pekare = &i;

Men sen då? Det är här jag faller platt. for(*pekare = i; *pekare < 8; *pekare++) ???
Ja, det är korrekt. Du måste ha en integer och en pekare till den integern om du vill göra ovanstående (observera att jag lade till & framför i). Fast det är ju inte praktiskt eller hur? Pekare används lite mer fördelaktigt i andra sammanhang.

Ett sätt att använda pekare i en for-loop på ett lite mer konstruktivt sätt är följande...
Kod:
char txt[] = "sträng";
char* iter;
for (iter = txt; *iter != '\0'; iter ++)
  if (*iter == 'X') *iter = 'O';
I detta fall pekar char-pekaren iter (förkortning av iterator) initialt på adressen för det första tecknet i teckensträngen. Sedan stegar pekaren genom strängen tecken för tecken tills den stöter på null-terminatorn. Om värdet som iteratorn pekar på är ett 'X', så sätter vi dit ett 'O' istället på den adressen.
Detta hade kunnat göras med indexering istället...
Kod:
char txt[] = "sträng";
size_t idx;
for (idx = 0; txt[idx] != '\0'; idx ++)
  if (txt[idx] == 'X') txt[idx] = 'O';
...men nu valde vi att göra det med pekare.
__________________
Senast redigerad av FaderBerg 2016-06-07 kl. 13:15.
Citera
2016-06-10, 22:43
  #14
Medlem
Okej, efter att ha försökt lära mig lite mer, så känner jag ändå att jag bara får panik på detta.

Om jag har denna: int *pekare = new int[size];

Å så vill jag peka genom denna. Hur ser då följande ut?

for (int *newpointer = pekare; newpointer < pekare + size; *(newpointer)++)

Den funkar, delvis, men inte helt. Jag får den att skriva ut 5 element, om jag sätter size till 5, men den fungerar inte optimalt ändå. Var tänker jag fel?
Citera
2016-06-11, 03:58
  #15
Medlem
enowens avatar
Citat:
Ursprungligen postat av Tiger-Lily
Okej, efter att ha försökt lära mig lite mer, så känner jag ändå att jag bara får panik på detta.

Om jag har denna: int *pekare = new int[size];

Å så vill jag peka genom denna. Hur ser då följande ut?

for (int *newpointer = pekare; newpointer < pekare + size; *(newpointer)++)

Den funkar, delvis, men inte helt. Jag får den att skriva ut 5 element, om jag sätter size till 5, men den fungerar inte optimalt ändå. Var tänker jag fel?

Eftersom att du helt saknar förståelse för hur pekare fungerar trotts att du har fått ett flertal länkar och en detaljerad beskrivning så tänker jag inte sitta och förklara för dig vart du tänker galet, för allt känns som en gissning från din sida. Jag kan dock ge dig ett tips och se om du hittar felet själv.

Kompilera ditt program med -Wall flaggan.
Citera
2016-06-11, 11:38
  #16
Moderator
RostigHinks avatar
Lägger ut lite exempel, kanske hjälper det?
Kod:
#include <iostream>

using std::cout;
using std::endl;

constexpr int vecsize = 5;

int main() {
  
  int* vec = new int[vecsize]{42, 17, 4711, 3, 17};

  // varför strula med pekare i forloopen?
  for (int i = 0; i < vecsize; ++i) {
    cout << "Ex 1 Element " << i << " = " << *(vec + i) << endl;
  }
  // vän av ordning noterar att *(vec + i) är ekvivalent med vec[i]

  cout << endl;

  // om man nu vill fnula med det ändå
  int* p = vec;
  for (int i = 0; i < vecsize; ++i, ++p) {
    cout << "Ex 2 Element " << i << " = " << *p << endl;
  }

  cout << endl;

  // ännu fulare
  p = vec;
  for (int i = 0; p < vec + vecsize;) {
    cout << "Ex 3 Element " << i++ << " = " << *p++ << endl;
  }

  delete vec;
  return 0;
}
Citera
2016-06-11, 13:35
  #17
Medlem
enowens avatar
Citat:
Ursprungligen postat av RostigHink
Lägger ut lite exempel, kanske hjälper det?
Kod:
#include <iostream>

using std::cout;
using std::endl;

constexpr int vecsize = 5;

int main() {
  
  int* vec = new int[vecsize]{42, 17, 4711, 3, 17};

  // varför strula med pekare i forloopen?
  for (int i = 0; i < vecsize; ++i) {
    cout << "Ex 1 Element " << i << " = " << *(vec + i) << endl;
  }
  // vän av ordning noterar att *(vec + i) är ekvivalent med vec[i]

  cout << endl;

  // om man nu vill fnula med det ändå
  int* p = vec;
  for (int i = 0; i < vecsize; ++i, ++p) {
    cout << "Ex 2 Element " << i << " = " << *p << endl;
  }

  cout << endl;

  // ännu fulare
  p = vec;
  for (int i = 0; p < vec + vecsize;) {
    cout << "Ex 3 Element " << i++ << " = " << *p++ << endl;
  }

  delete vec;
  return 0;
}

Alltid nice med UB kod.
Citera
2017-04-09, 02:40
  #18
Medlem
Beelzs avatar
https://www.youtube.com/watch?v=Rxvv9krECNw
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback