2017-07-13 13 views
-3

Wenn eine Zeigervariable deklariert wird, gibt es jemals eine Verwendung für mehr als einen Stern? Ich weiß, wenn Sie einen Zeiger auf einen anderen haben möchten, würden Sie mehrere verwenden, aber nur um zu klären, wenn Sie erklären, dass Sie immer noch nur einen setzen?Zeiger mit mehreren Sternchen?

+1

Ein Zeiger auf ein 'int *' ist ein 'int **'. Ein 'int *' kann nicht auf ein 'int * 'zeigen. Wenn Sie das Bedürfnis haben, zwei Sterne zu verwenden, sollten Sie sich einen Moment Zeit nehmen, um Ihr Design zu überdenken. Wenn Sie das Bedürfnis haben, drei oder mehr Sterne zu benutzen, können Sie ein [Drei-Sterne-Programmierer] sein (http://wiki.c2.com/?ThreeStarProgrammer) (Spoiler: das ist keine gute Sache). –

+2

Ja, Sie können so viele Sternchen verwenden, wie Sie möchten, aber Sie sollten dies nicht tun, sonst können Sie sich in [Drei-Sterne-Programmierer] (http://wiki.c2.com/?ThreeStarProgrammer) verwandeln. – VTT

+0

Wie verwenden Sie C++, warum verwenden Sie sogar rohe Zeiger? –

Antwort

0

weard Dinge: ein Beispiel von 3 Sternchen:

const char **stringArray; 

jetzt, wenn Sie dieses Array zuordnen wollen in eine Funktion als Argument, müssen Sie folgendes:

void stringAllocator(const char ***stringArray, int size) { 
    *stringArray = (const char **) malloc(size); 
} 

... 
stringAllocator (&stringArry, 20); 
... 

so können Sie mehr als 3 als auch vorstellen, obwohl ich nie hatte, mehr als 4 gesehen :-)

eineine etwas seltsamen Sachen in C++ Sterne in Kombination mit &

void stringAllocator(const char **&stringArray, int size) { 
    stringArray = (const char **) malloc(size); 
} 

... 
stringAllocator (stringArry, 20); 
... 

Im obigen Fall arbeiten als Stern Reduktion Technik. Es tut das selbe wie das erste Beispiel

0

Bei der Deklaration einer Zeigervariable, gibt es jemals eine Verwendung für mehr als ein Sternchen?

Sicher, es gibt Verwendungen für Deklarationen von Zeiger auf Zeigervariablen.

Nehmen wir an, Sie haben eine Funktion, die einige Klasseninstanzen intern zuweist, aber gleichzeitig einen Fehler anzeigen muss. Sie können es wie

bool CreateSomeType(SomeType** pointerToSomeTypePointer) { 
     try { 
      *pointerToSomeTypePointer = new SomeType(); 
     } 
     catch(...) { 
      return false; 
     } 
     return true; 
    } 

eine Unterschrift geben und wie diese A

SomeType* ptr = nullptr; 

    if(CreateSomeType(&ptr)) { 
     // Use ptr 
     // ... 
     delete ptr; 
    } 
    else { 
     // Log failure 
    } 
+0

Dies ist für Fremdfunktionsschnittstellen nützlicher als klassischer C++ - Code, wo Sie einfach 'std :: unique_ptr ' zurückgeben könnten, wobei NULL einen Fehler anzeigt. –

+0

@Ben Seien Sie versichert, ich würde das natürlich nicht für den Produktionscode verwenden. Nur um den Anwendungsfall für Zeiger auf Zeiger zu demonstrieren. – user0042

0

genannt wird häufiger Anwendungsfall von zwei Sternen ist, wenn eine Funktion einen Zeigerwert zu verändern hat, z.B. in ADT-Implementierungen wie "Stack". Obwohl dieses Design mehr C als C++ ist (in C++ können Sie andere Mechanismen wie Referenzen verwenden), siehe das folgende Beispiel. Ich schrieb es in "C" -Stil (auch wenn Sie C erwähnt ++):

struct node { 
    int x; 
    struct node* next; 
}; 

// this one works: 
void insertBeforeHead(node** head, int value) { 
    struct node* newNode = (struct node*)malloc(sizeof(struct node)); 
    newNode->next = *head; 
    newNode->x = value; 
    *head = newNode; // alters the pointer value of the caller 
} 

// this one does not work: 
void insertBeforeHead2(node* head, int value) { 
    struct node* newNode = (struct node*)malloc(new Node); 
    newNode->next = head; 
    newNode->x = value; 
    head = newNode; // alters only the local copy of the pointer value 
} 

int main() { 

    struct node* mainHead = NULL; 
    insertBeforeHead(&mainHead,10); // changes the value of mainHead 
    insertBeforeHead2(mainHead,20); // does not change the value of mainHead, althouth it should. 
}