2010-02-28 10 views

Odpowiedz

27

Standard C++ określa, czym jest tablica i jakie jest jej zachowanie. Spójrz w indeksie. Nie jest wskaźnikiem, const ani innym, i nie jest niczym innym, jest tablicą.

Aby zobaczyć różnicę:

int a[10]; 
int *const b = a; 

std::cout << sizeof(a); // prints "40" on my machine. 
std::cout << sizeof(b); // prints "4" on my machine. 

Wyraźnie A i B nie są tego samego typu, ponieważ mają różne rozmiary.

W większości kontekstów nazwa tablicy "zanika" do wskaźnika do jej pierwszego elementu. Możesz myśleć o tym jako o automatycznej konwersji. Wynikiem jest wartość r, co oznacza, że ​​jest "tylko" wartością wskaźnika i nie można jej przypisać, podobnie jak w przypadku, gdy nazwa funkcji zanika do wskaźnika funkcji. Nie oznacza to, że jest to "const" jako takie, ale nie można go przypisać.

Tak więc tablica "jest" wskaźnikiem bardzo podobnym do funkcji "jest" wskaźnikiem funkcji, lub długim "jest" int. Oznacza to, że tak naprawdę nie jest, ale można go użyć jako jednego w większości kontekstów dzięki konwersji.

+0

naprawdę wgląd! dzięki ! – lovespring

+0

* a będzie drukować wartość pierwszego elementu w tablicy i dlatego powinien wskazywać adres pamięci pierwszego elementu w tablicy. Dlaczego więc operator sizeof podając rozmiar wszystkich elementów tablicy a zamiast podając rozmiar tylko zapamiętujący adres pamięci pierwszego elementu tablicy? – user1825567

+1

@ user1825567: ponieważ wyrażenie '* a' ma niejawną konwersję (nazywaną" zanikiem "), od typu tablicy do typu wskaźnika. Można by pomyśleć o tym jako o skróconym fragmencie '* pointer_to_first_element_of (a)'. Powinno więc być dość oczywiste, dlaczego 'sizeof (a)' nie musi być takie samo jak 'sizeof (pointer_to_first_element_of (a))'. "a" nie jest wskaźnikiem. Każdy, kto ci to mówi, albo nie rozumie C, albo nie szanuje cię wystarczająco, by sądzić, że rozumiesz C. –

6

Nazwa tablicy nie jest stałym wskaźnikiem - jednak działa tak jak jeden w wielu kontekstach (konwertuje do jednego na widoku), dla większości celów.

Od 6.3.2.1/3 „Inne operandów/lwartościami, tablice i Oznaczenia funkcyjne”:

wyjątkiem przypadków, gdy jest to operand operatora sizeof lub jednoargumentowego & operatora, czy jest ciąg dosłowny używany do inicjowania tablicy, wyrażenie, które ma typ "tablica typu", jest konwertowane na wyrażenie o typie "wskaźnik do typu", które wskazuje na początkowy element obiektu tablicy i nie jest lwartością.

+3

Pragnę zauważyć, że jest to cytat z normy C. W C++ tablica nie ulega rozkładowi, niezależnie. Uwzględnia kontekst, na przykład: "int a [10]; int (& r) [10] = a;/* bez zaniku * /; '. –

Powiązane problemy