2016-03-12 12 views
6

Jak char wskaźnik być inicjowane z ciągiem znaków (array) ale int nie kursorem z tablicy liczb całkowitych?Jak wskaźnik char być inicjowane z ciągiem znaków (tablica), ale nie int wskaźnik z tablicy liczb całkowitych?

Kiedy próbowałem to

int* a={1,2,3,4,5}; 

To daje błąd mówiący

error: scalar object ‘a’ requires one element in initializer

ale

char* name="mikhil" 

działa idealnie.

+1

Możesz to zrobić: int a [] = {1,2,3,4,5}; – kvr

+2

_ "Ale char *' name = "mikhil" 'działa idealnie" _ Nie, nie ma - jest źle w C++ i ** nie będzie kompilować **. Czy mówimy o C lub C++? – edmz

Odpowiedz

7

W przypadku próbujesz zainicjować int * z

{1,2,3,4,5}; 

jest błędne, ponieważ {1,2,3,4,5};, jak jest, nie jest tablica liczb. Jest to zamknięta lista inicjalizatorów. Może to być wykorzystane do zainicjowania int tablicę (poszczególnych elementów układu, aby podać), ale nie jest to wskaźnik. Tablica nie jest wskaźnikiem i na odwrót.

Można jednak skorzystać z compound literal aby zainicjować int *, jak

int * a = (int []){1,2,3,4,5}; 
+1

Czy to nie działa tylko w C, a nie w C++ –

+1

@KentKostelac To rozszerzenie gcc (i clang?) W C++, więc nie jest standardem. Wygląda też na to, że pozostawia zwisający wskaźnik. –

+0

Twoja sugerowana metoda daje błąd "przyjmowanie adresu tymczasowej tablicy" –

9

Ponieważ są to przepisy (normy) języka. Nic nie mówi ci, że to możliwe, aby zainicjować wskaźnik z tablicą jak to, na przykład, następujące jest również nielegalne:

char* name={'m', 'i', 'k', 'h', 'i', 'l', 0}; 

ciągiem znaków dostaje własne leczenie i nie jest określony tylko jako tablica znaków.

+0

Masz rację, ale to nie jest takie ważne pytanie. Tutaj jest podstawowa różnica w korzystaniu z inicjalizatora. –

2

dla wygody, język pozwala char * (lub, korzystnie, const char *) być inicjowana z ciągiem . Dzieje się tak, ponieważ jest to bardzo powszechne użycie i jest możliwe od czasu C. Nie powinieneś tak naprawdę modyfikować wartości ciągu (oczywiście jest to osobna debata).

Z int, jeśli zainicjować int a [5], oczekuje się, można zmienić wartości. Zainicjowane wartości zostaną skopiowane do twojej tablicy (optymalizacje kompilatora nie będą się zmieniać) i możesz zmienić je według własnego uznania. Jeśli int * a mogło zostać zainicjowane w ten sposób, co by to wskazywało? Nie jest to jasne, więc standard na to nie pozwala.

1

język nie wspiera zerowy terminatora na int tablic, które jest od kompilator musiałby dwuznaczności, że jest to, że wartość null terminator lub 0 w tablicy int ...

jest to ten sam powód, dzięki któremu

cout<<anystring; dać pełną gamę charakterze tj kompletnego łańcucha i tym Dont

cout<<a; dla 1-d int tablicy w ... rzeczywiście daje komunikat o błędzie i nie drukuje kompletny 1-d tablicę ...

awansuj, jeśli gdzieś spełnię/rozwiążę zapytanie ...

+0

'' \ 0'' jest po prostu znakiem o wartości '0', którą można awansować do' int'. Poza tym nie widzę, jak mają do tego zastosowanie terminatory kończące. Problem polega na tym, że '{1, 2, 3}' nie jest tablicą. –