2012-04-10 15 views
0

Stimmt es, dass C++ - Array ein Const-Zeiger in C++ ist?Sind Arrays in C++ ein Const-Zeiger?

http://www.cplusplus.com/forum/articles/10/#msg1381

So Deshalb x und &x das gleiche, wenn sie Zeiger?

#include<iostream> 
using namespace std; 

int main() { 
    int x[5]; 
    int *y = new int[5]; 

    cout << "&x : " << &x << endl; 
    cout << "x : " << x << endl; 
    cout << endl; 
    cout << "&y : " << &y << endl; 
    cout << "y : " << y << endl; 
    return 0; 
} 

Ausgang:

&x: 0xbfec4ccc 
x : 0xbfec4ccc 

&y: 0xbfec4ce0 
y : 0x8961008 

Link zu ideone von oben Code: http://ideone.com/3JRZd

+1

Sie können das gleiche Problem mit 'sizeof' anzeigen. 'sizeof (x)! = sizeof (y)'. (In Ihrer Idee ein Link.) –

Antwort

3

Nein, es ist nicht wahr, dass ein Array ein Const-Zeiger in C++ ist. In der Tat, wenn eine Datei enthält

extern int* const a; 

und die andere enthält

int a[10]; 

im gleichen Umfang, beide Dateien kombiniert seltsame Fehler verursachen.

Arrays Zerfall in den meisten Situationen in Zeiger. Genauer gesagt, wenn Sie ein Array in einem Rvalue-Kontext verwenden, wird es implizit in einen Zeiger auf sein erstes Element konvertiert. Dies passiert mit x im Beispiel in der zweiten Verbindung: Da das erste Element des Arrays natürlich an der gleichen Adresse wie das Array ist, werden sowohl x als auch &x als dieselbe Adresse gedruckt. Beachten Sie jedoch, dass sie nicht der gleiche Zeiger sind, weil sie von unterschiedlichen Typen sind: x in diesem Zusammenhang in int* abklingt, d.h. Zeiger auf int, während &x vom Typ int(*)[5], d.h. Zeiger auf Array von 5 int s.

Ein weiterer Fall, in dem man, dass beide unterschiedlich sind sehen kann, ist eine Funktion, um eine Referenz auf ein Array, wie

void f(int (&arr)[5]); 

Sie nehmen x an diese Funktion übergeben können (weil sie vom Typ int[5]), aber weder &x noch der Zeiger y erhalten Sie beim Schreiben int* y = x;

+0

Es ist wirklich die beste Antwort. (Array wird implizit in einen Zeiger umgewandelt) Vielen Dank. – faressoft

4

Graham falsch ist und nicht weiß, was er spricht. Arrays und Zeiger sind zwei verschiedene Dinge.

+2

I 100% stimmen mit GManNickG überein. Dass Arrays "nur Zeiger" sind, ist ein häufiges C/C++ - Missverständnis. Sie können zu Zeigern zerfallen, aber wenn nicht, sind sie anders. Und wenn sie es tun, sind sie * noch * anders, weil sie zerfallen müssen. –

-1

ja sind sie.

Da ein Zeiger immer eine Adresse ist, sollte der Wert & für jeden Zeigertyp gleich sein.

auch können Sie so etwas wie dieses

int number[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 
int *pNumbers = number; 

[Bearbeiten] vielleicht nicht nach den anderen Antworten tun ...aber ich war immer unter dem Eindruck, das war wahr [Bearbeiten] siehe auch http://www.cplusplus.com/doc/tutorial/pointers/ unter "Zeiger und Arrays"

1

Der Code

int array[3]; 

ist NICHT die gleiche wie

int const *array=new int[3]; 

nur für einen einfachen, aber keinen einzigen Grund: Sie müssen delete [] array im zweiten Fall anrufen.

+1

Um fair zu sein, ist es völlig erlaubt, automatische Zuteilung durch dynamische Zuteilung zu implementieren. Wichtig ist, dass der Compiler das Löschen für uns verwaltet. – GManNickG

+1

Deshalb hat er gesagt ... ** du ** wirst anrufen müssen ... –

1

Dumme Analogie:

Betrachten Sie die Adresse 1, Main Street.
Es ist nicht dasselbe wie die Straße "Main Street", trotz der Tatsache, dass Sie den Beginn der Main Street als "1, Main Street" beziehen können. In der Tat, wenn Sie jemanden am Ende der Straße treffen wollen, können Sie ihnen eine Notiz mit der Adresse "1, Main Street" als Hinweis darauf geben, wo Sie auf Sie warten müssen, was viel einfacher ist, als alles zu tun von der Main Street auf ein Stück Papier (oder ihnen eine Karte mit einem "X" geben, wenn wir uns erlauben, eine Abstraktionsschicht einzuführen).

1, Main Street ist natürlich nicht nur die Adresse des Beginns der Hauptstraße aber auch die Adresse des ersten Hauses auf der Main Street - das ist, was Ihr Druck von x zeigt - aber weder ein Haus noch eine Adresse ist eine Straße.