Ce înseamnă ‘**’ în C? (Programare, C++, C, Sintaxă, Pointeri, Operatori)

numeric25 a intrebat.

Ce înseamnă atunci când un obiect are două asteriscuri la început?

**variable

Comentarii

  • @Andreas Oamenii sar peste întrebările triviale, pentru că primesc multe vizualizări (106 până acum) și, prin urmare, multe upvotes. De aici și 16 upvotes în 17 minute pentru un răspuns relativ simplu –  > Por Michael Mrozek.
  • posibilă duplicare a Utilizări pentru mai multe niveluri de dereferențiere a pointerilor? –  > Por Paul R.
  • @Andreas: Sunt surprins că au existat atât de multe răspunsuri directe la un astfel de… cum să spun, indirect întrebare. 😉 –  > Por James McNellis.
  • Pe lângă faptul că sunt ușor de replicat, întrebările simple au și cea mai largă audiență. Eu aș putea răspunde la această întrebare, tu ai putea răspunde la această întrebare, o persoană care este la trei săptămâni de la primul său curs de CS ar putea probabil să răspundă la această întrebare etc. Deci, chiar dacă un procent mai mic de oameni aleg să răspundă, este totuși probabil să primească multe răspunsuri. Acesta este un defect nefericit al sistemului SO – cunoștințele rare sunt susceptibile de a primi mai puține recompense. –  > Por Chuck.
  • Fără nici un cod surprins nimeni nu a oferit o înmulțire folosind un pointer. rezultat = x **pointer; -.  > Por Stephen Nutt.
12 răspunsuri
Incognito

Este pointer la pointer.

Pentru mai multe detalii poți verifica: Pointer to pointer

Poate fi bun, de exemplu, pentru alocarea dinamică a matricelor multidimensionale:

Cum ar fi:

#include <stdlib.h>

int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
{
    fprintf(stderr, "out of memory
");
    exit or return
}

for(i = 0; i < nrows; i++)
{
    array[i] = malloc(ncolumns * sizeof(int));
    if(array[i] == NULL)
    {
        fprintf(stderr, "out of memory
");
        exit or return
    }
}

Comentarii

  • Ar fi, de asemenea, o idee bună să se demonstreze cum se eliberează corect array-ul multidimensional în ordinea inversă a alocării. –  > Por Adam Rosenfield.
  • Da, aveți dreptate :). Nu uitați să folosiți for(int i = 0; i < nrows; i++) free(array[i]); free(array); pentru a elibera memoria alocată. –  > Por Incognito.
  • Vă mulțumim. Acest link a fost cel mai benefic. –  > Por numeric25.
Adam Rosenfield

Într-o declarație, înseamnă că este un pointer la un pointer:

int **x;  // declare x as a pointer to a pointer to an int

Când îl folosești, îl deferențiază de două ori:

int x = 1;
int *y = &x;  // declare y as a pointer to x
int **z = &y;  // declare z as a pointer to y
**z = 2;  // sets the thing pointed to (the thing pointed to by z) to 2
          // i.e., sets x to 2

Comentarii

  • Și dacă ar fi să setați z la 2 folosind doar un singur punct *z = 2 ??? –  > Por numeric25.
  • @num Ar schimba y pentru a indica locația de memorie 2, și *y = 1; sau **z = 1; ar încerca amândouă să schimbe memoria la adresa 2, care este aproape sigur în afara intervalului legal care v-a fost alocat –  > Por Michael Mrozek.
SLaks

Înseamnă că variabila este un pointer către un pointer.

Mavrik

Pointer către un pointer la declararea variabilei.

Dublu pointer de-referință atunci când este utilizat în afara declarației.

mfabish

Pointer la un pointer.

Vimal

Puteți utiliza cdecl pentru a explica tipurile C.

Există o interfață online aici: http://cdecl.org/. Introduceți „int **x” în câmpul de text și verificați rezultatul.

Pavel Radzivilovsky

**variabila este o dublă dereferință. Dacă variabila este o adresă a unei adrese, expresia rezultată va fi lvaloarea de la adresa stocată în *variabilă.

Poate însemna lucruri diferite dacă este o parte a declarației:

type **variable ar însemna, pe de altă parte, un pointer către un pointer, adică o variabilă care poate conține adresa unei alte variabile, care este de asemenea un pointer, dar de data aceasta către o variabilă de tip „type”.

Achim

Înseamnă că variabila este dereferențiată de două ori. Să presupunem că aveți un pointer la un pointer la char, astfel:

char** variable = ….;

Dacă vreți să accesați valoarea la care indică acest pointer, trebuie să o dereferențiați de două ori:

**variable

user142019

Este un pointer către un pointer. Puteți utiliza acest lucru dacă doriți să indicați o valoare array, sau un const char * (șir de caractere). De asemenea, în Objective-C cu Cocoa acest lucru este adesea utilizat pentru a indica un NSError*.

HZhang

Pointer către un alt pointer

Comentarii

  • Dacă pune o întrebare atât de elementară, probabil că are nevoie să i se explice și conceptul de pointer. –  > Por agf.
Jake Petroules

** este un pointer către un alt pointer. Aceștia sunt uneori utilizați pentru array-uri de șiruri de caractere.

Kraken

Este un pointer la pointer.

Ca și în cazul în care *x înseamnă că va conține o adresă a unei variabile, atunci dacă spun

m=&x, atunci m este afișat sub forma

int **m