2011-09-26 18 views
6

Jaka jest różnica między następującym inicjowaniem wskaźnika?Jaki jest poprawny sposób inicjowania wskaźnika wc?

char array_thing[10]; 

char *char_pointer; 

Jaka jest różnica w następującej inicjalizacji?

1.) char_pointer = array_thing; 

2.) char_pointer = &array_thing 

Czy druga inicjalizacja jest ważna?

+3

@ k-ballo Nie wiesz, jak dochodzisz do wniosku, że to praca domowa. – MGZero

+0

to nie jest praca domowa .. tylko próbuję się uczyć C .. – diesel

+1

@ K-ballo: Nie każdy, kto zadaje podstawowe pytania, próbuje oszukać przez informatykę akademicką, jest kilka osób, które naprawdę chcą się uczyć. – orlp

Odpowiedz

5

Druga inicjalizacja jest nieprawidłowa. Trzeba użyć:

char_pointer = array_thing; 

lub

char_pointer = &array_thing[0]; 

&array_thing jest wskaźnikiem do tablicy (w tym przypadku, typ char (*)[10] i szukasz wskaźnik do pierwszego elementu tablicy

+0

Dzięki! to jest to, co myślałem. – diesel

+0

Druga inicjalizacja może nadal działać, ale powinna wygenerować ostrzeżenie o niezgodności typów wskaźników. – Dmitri

+1

@Dmitri, konwersje pointeru (z wyjątkiem lub z 'void *') bez wyraźnego typecast są nielegalne w C. ** 6.5.4 Operatorzy Cast **, akapit 3: "Konwersje, które zawierają wskaźniki ... muszą być określone za pomocą wyraźnej obsady. " –

0

Zauważ, że w opublikowanym przez Ciebie kodzie nie ma żadnych inicjalizacji, ale należy pamiętać, że tablice rozpadają się na wskaźniki (wskaźnik do pierwszego elementu w tablicy). jest na pewno poprawny, ale teraz masz (*char)[10] zamiast char*.

+1

Tablice (tj. Wyrażenia typu tablicowego) rozpadają się na wskaźniki * w większości kontekstów * (jak bezwarunkowo potwierdzasz). Wyjątkami są: operand jednoargumentowego operatora '&', operand jednoargumentowego operatora 'sizeof' oraz literał łańcuchowy w inicjalizatorze użyty do zainicjowania obiektu tablicy (np.' Char s [] = "hello"; '). –

0

W pierwszym przypadku, jesteś ustawienie char_pointer do pierwszego elementu array_thing (adres nim raczej). Korzystanie z arytmetyki wskaźnika spowoduje przejście do innych elementów, podobnie jak indeksowanie. Na przykład

char_pointer[3] = 'c'; 

jest taka sama jak

char_pointer + = 3; char_pointer = 'c';

Drugi przykład ... Nie wierzę, że jest to ważne tak, jak to robisz.

Powiązane problemy