2015-11-10 5 views
8

(Haftungsausschluss: Zeiger in C++ ist ein sehr beliebtes Thema und so bin ich gezwungen zu glauben, dass jemand vor mir diesen Punkt bereits angesprochen hat. Ich konnte jedoch keine andere Referenz finden. Bitte korrigieren Sie mich und fühlen Sie sich frei Schließen Sie diesen Thread, wenn ich falsch liege.)Was ist ein praktischer Anwendungsfall für "Adresse von Array"?

Ich bin auf viele Beispiele gestoßen, die zwischen Zeiger auf das erste Element des Arrays und Zeiger auf das Array selbst unterscheiden. Hier ist ein Programm und seine Ausgabe:

//pointers to arrays 
#include <iostream> 
using namespace std; 

int main() { 
    int arr[10] = {}; 
    int *p_start = arr; 
    int (*p_whole)[10] = &arr; 

    cout << "p_start is " << p_start <<endl; 
    cout << "P_whole is " << p_whole <<endl; 

    cout << "Adding 1 to both . . . " <<endl; 

    p_start += 1; 
    p_whole += 1; 

    cout << "p_start is " << p_start <<endl; 
    cout << "P_whole is " << p_whole <<endl; 

    return 0; 
} 

Ausgang:

p_start is 0x7ffc5b5c5470 
P_whole is 0x7ffc5b5c5470 
Adding 1 to both . . . 
p_start is 0x7ffc5b5c5474 
P_whole is 0x7ffc5b5c5498 

So, wie erwartet, die Zugabe von 1 bis beide gibt unterschiedliche Ergebnisse. Aber ich bin nicht in der Lage, eine praktische Anwendung für so etwas wie p_whole zu sehen. Sobald ich die Adresse des gesamten Array-Blocks habe, die auch mit arr erhalten werden kann, was kann ich mit solch einem Zeiger tun?

+0

In C++ gibt es nicht, da Sie stattdessen den Verweis auf das Array verwenden könnten. Der Verweis auf ein Array ist sehr nützlich (z. B. die kanonische Implementierung, die Dimension eines Arrays basierend auf seinem Namen zu erhalten). –

Antwort

11

Für einzelne Arrays, ich denke nicht, dass es viel Sinn ist. Wo es nützlich wird, ist mit mehrdimensionalen Arrays, die Arrays von Arrays sind. Ein Zeiger auf eines der Sub-Arrays ist ein Zeiger auf die Zeile, und das Inkrementieren bringt einen Zeiger auf die nächste Zeile. Im Gegensatz dazu ist ein Zeiger auf das erste Element des inneren Arrays ein Zeiger auf ein einzelnes Element und das Inkrementieren bringt Sie zum nächsten Element.

+0

Ja, macht Sinn! Dies würde die Iteration so viel besser machen. – dotslash

+1

@dotslash Und Zuteilung. Wenn Sie jemanden sehen, der ein 'int **' ein "zweidimensionales Array" aufruft, korrigieren Sie diese und sagen Sie ihm stattdessen 'malloc (COLS * sizeof (int [ROWS]))' (wo der Basis-Zeigertyp sein wird 'int (*) [ZEILEN]'). Verwenden Sie zusammenhängenden Speicher, speichern Sie den Cache! –

+0

@TheParamagneticCroissant Danke für den Tipp! Habe aber den "save the cache" -Teil nicht bekommen. Bitte erkläre. :) – dotslash

2

int (*)[10] ist ein „stärker“ Typ als int* wie es Größe des Arrays hält, so kann man es passieren, ohne Passieren zusätzliche Größenparameter funktionieren:

void display(const int(*a)[10]) // const int (&a)[10] seems better here 
{ 
    for (int e : *a) { 
     std::cout << " " << e; 
    } 
} 

Vergleich

void display(const int* a, std::size_t size) // or const int* end/last 
{ 
    for (std::size_t i = 0; i != size; ++i) { 
     std::cout << " " << a[i]; 
    } 
} 
Verwandte Themen