2013-10-09 14 views

Odpowiedz

12

jest zdefiniowane przez standard typ napisowych jest tablicą char i macierzy automatycznie rozkładać się wskaźniki, tj char*. Nie trzeba go rzutować jawnie, przekazując go jako argument do printf, gdy używany jest specyfikator .

Nota boczna: w języku C++ jest to const char* .


[1] C99 6.4.5: „Łańcuch znaków dosłowny to sekwencja zero lub więcej znaków wielobajtowych zamknięty w cudzysłowia, jak w "xyz" ... tablicą statycznego czas przechowywania i długość tylko SUF fi cient zawiera sekwencję. w napisowych postaci, elementy tablicy mają typu char "

[2] C++ 03 2,1 3,4 §1: „zwykły ciąg dosłowne ma typ«tablica n const char»i statyczny okres przechowywania”

+1

Rozumiem. Jest to coś, o czym wiedziałem, że musi się zdarzyć, ale był ciekawy, jak to jest zaimplementowane; typedef ma sens. – sherrellbc

+0

Widzę, że zamierzasz dodać odniesienie ze standardu C, ale to nie jest "const char *" pod C. –

+0

@ PaulGriffiths: Tak, dziękuję. Już to edytowałem :) – LihO

4

Zrozumienie jest mniej lub bardziej poprawne, choć mechanizm jest inny.

wyjątkiem sytuacji, gdy jest to argument operacji z sizeof lub jednoskładnikowa & operatorów, lub jest Łańcuch znaków używany do inicjalizacji kolejnego tablicę w deklaracji, wyrażenie typu „N elementu tablicy T” zostaną przekształcone (” rozpad ") do wyrażenia typu" wskaźnik do T ", a wartością wyrażenia będzie adres pierwszego elementu w tablicy. Dotyczy to wszystkich typów tablic, nie tylko literałów łańcuchowych.

Wyrażenie ma typ "Tablica 8-elementowa z char" ; w wywołaniu printf nie jest operandem ani operatorów sizeof ani unarnych & ani nie jest używany do inicjowania innej tablicy, więc jest niejawnie przekonwertowany na wyrażenie typu "wskaźnik do char" , którego wartością jest adres pierwszego znaku.


1. 7 liter plus 0 terminator.
2. Tak jest w przypadku C; w C++, literały łańcuchowe są tablicami const char, więc wyrażenie ulegnie rozpadowi na typ const char *.

Powiązane problemy