Unterschied zwischen int * i und int** i

Lesezeit: 4 Minuten

Benutzer-Avatar
M2star

Was ist der Unterschied zwischen int* i und int** i?

  • Sie suchen also nach Hinweisen, dann… 😉

    – TJ Crowder

    25. September 2010 um 14:52 Uhr

  • Indirekt… :o)

    – AnT steht zu Russland

    25. September 2010 um 18:19 Uhr


Zeiger auf einen ganzzahligen Wert

int* i

Zeiger auf ein Zeiger auf ein ganzzahliger Wert

int** i

(D. h. im zweiten Fall benötigen Sie zwei Dereferenzierungen, um auf den Wert der Ganzzahl zuzugreifen.)

Benutzer-Avatar
Anspruch

  • int* i : i ist ein Zeiger auf ein Objekt vom Typ int
  • int** i : i ist ein Zeiger auf einen Zeiger auf ein Objekt des Typs int
  • int*** i : i ist ein Zeiger auf einen Zeiger auf einen Zeiger auf ein Objekt des Typs int
  • int**** i : i ist ein Zeiger auf einen Zeiger auf einen Zeiger auf einen Zeiger auf ein Objekt des Typs int

  • “…Zeiger auf eine Variable…” Nicht unbedingt eine Variable. Das Wort “Variable” verschleiert in diesem Zusammenhang wahrscheinlich tatsächlich etwas die Bedeutung.

    – TJ Crowder

    25. September 2010 um 14:53 Uhr


  • @TJ Crowder: Auch eine konstante Variable ist eine Variable. Es kann jedes Mal, wenn es erstellt wird, einen anderen Wert erhalten.

    – Nathan Fellmann

    25. September 2010 um 15:03 Uhr

  • @Nathan Nicht dabei new int. Hier gibt es keine Variable. Ersetzen variable durch object wäre angebracht.

    – Johannes Schaub – litb

    25. September 2010 um 15:04 Uhr


  • Wenn es C und nicht C++a const Wert ist nicht einmal notwendigerweise konstant.

    – dezent

    25. September 2010 um 16:22 Uhr

  • Ich bin mir nicht sicher, ob ich den Unterschied zwischen Objekt und Variable sehe (da Variable ein Adjektiv ist, das Objekt impliziert), aber ich habe es trotzdem ersetzt.

    – Anspruch

    25. September 2010 um 16:33 Uhr

Benutzer-Avatar
Prasun Saurav

int* pi

pi ist ein Zeiger auf eine ganze Zahl

int **ppi

ppi ist ein Zeiger auf einen Zeiger auf eine ganze Zahl.

BEARBEITEN :

Sie müssen ein gutes Buch über Zeiger lesen. Ich empfehle Pointers on C von Kenneth Reek.

Angenommen, Sie sind Lehrer und müssen einem Ihrer Schüler Notizen geben.

int note;

Naja … ich meinte die ganze Klasse

int *class_note; /* class_note[0]: note for Adam; class_note[1]: note for Brian; ... */

Nun … vergiss nicht, dass du mehrere Klassen hast

int **classes_notes; /* classes_notes[0][2]: note for Charles in class 0; ... */

Außerdem lehren Sie an mehreren Institutionen

int ***intitute_note; /* institute_note[1][1][1]: note for David in class 1 of institute 1 */

usw usw…

Ich glaube nicht, dass dies spezifisch für opencv ist.

int *i deklariert einen Zeiger auf ein int. So i speichert eine Speicheradresse, und C erwartet, dass der Inhalt dieser Speicheradresse ein int enthält.

int **i deklariert einen Zeiger auf… einen Zeiger. Zu einem int. So i enthält eine Adresse, und an dieser Speicheradresse erwartet C, einen weiteren Zeiger zu sehen. Von dieser zweiten Speicheradresse wird dann erwartet, dass sie ein int enthält.

Beachten Sie, dass, während Sie einen Zeiger auf ein Int deklarieren, das eigentliche Int nicht zugewiesen wird. Es ist also gültig zu sagen int *i = 23, was besagt: “Ich habe eine Variable und möchte, dass sie auf die Speicheradresse 23 zeigt, die ein int enthält.” Aber wenn Sie versuchen würden, Speicheradresse 23 tatsächlich zu lesen oder zu schreiben, würden Sie wahrscheinlich segfault, da Ihr Programm diesen Teil des RAM nicht “besitzt”. *i = 100 würde segfault. (Die Lösung besteht darin, malloc() zu verwenden. Oder Sie können es auf eine vorhandene Variable zeigen lassen, wie in int j = 5; int *i = &j)

Benutzer-Avatar
Déjà-vu

Stellen Sie sich vor, Sie haben ein paar Freunde, einer von ihnen muss Ihnen etwas geben (einen Schatz… 🙂 Angenommen, John hat den Schatz

int treasure = 10000; // in USD, EUR or even better, in SO rep points

Wenn Sie John direkt fragen

int john = treasure;
int you = john;

Wenn Sie John nicht beitreten können, aber Gill weiß, wie man ihn kontaktiert,

int john = treasure;
int *gill = &john;
int you = *gill;

Wenn Sie Gill nicht einmal beitreten können, aber zuerst Jake kontaktieren müssen, der sich an Gill wenden kann

int john = treasure;
int *gill = &john;
int **jake = &gill;
int you = **jake;

Etc… Zeiger sind nur Indirektionen.

Das war meine letzte Geschichte für heute vor dem Schlafengehen 🙂

Benutzer-Avatar
Johannes Schaub – litb

Ich glaube fest daran, dass ein Bild mehr als tausend Worte sagt. Nehmen Sie das folgende Beispiel

// Finds the first integer "I" in the sequence of N integers pointed to by "A" . 
// If an integer is found, the pointer pointed to by P is set to point to 
// that integer. 
void f(int N, int *A, int I, int **P) {
  for(int i = 0; i < N; i++)
    if(A[i] == I) {
      // Set the pointer pointed to by P to point to the ith integer.
      *P = &A[i];
      return;
    } 
}

Also oben, A zeigt auf die erste ganze Zahl in der Folge von N ganzen Zahlen. Und P zeigt auf einen Zeiger, in dem der Aufrufer den Zeiger auf die gefundene ganze Zahl gespeichert hat.

int Is[] = { 1, 2, 3 };

int *P;
f(3, &Is[0], 2, &P);
assert(*P == 2);

&P wird verwendet, um die Adresse von zu übergeben P zur Funktion. Diese Adresse hat Typ int **weil es die Adresse eines Zeigers auf int ist.

1226920cookie-checkUnterschied zwischen int * i und int** i

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy