2011-10-12 11 views
7

Czy następujące przypisania są ważne? A może którekolwiek z nich spowoduje problemy. Proszę zasugeruj.const char pointer przypisania

const char * c1; 
const char * c2; 
const char * c3; 
char * c4; 

c2 = c1; 
c2 = c3; 
c2 = c4; 

Co zrobić, jeśli zrobię co następuje, czy to dobrze?

const char * c5 = "xyz"; 
char * c6 = "abc"; 

c2 = c5; 
c2 = c6; 
+0

@ Kshitij Mehta - nie zadanie domowe, mamy do czynienia z problemem pamięci z naszej ogromnej bazy kodu. Dlatego proszę o pomoc. – user32262

+0

@user Kilka razy zadałeś to samo pytanie. Odpowiedzieliśmy na nie w kółko. Twoja edycja tego pytania nic nie dodaje. Powtarza to, o co prosiłeś powyżej. –

+1

Przepraszam, jeśli pytam o to samo. Może moje zrozumienie ze wskaźnikami nie jest dokładne. – user32262

Odpowiedz

9

Wszystkie są ważne oświadczenia jako wzdłuż ty nie dereference nich, ponieważ wszystkie wskaźniki są pozostawione uninitalized lub nie są skierowane do wszystkich ważnych miejsc w pamięci.

Są one ważne, ponieważ wskaźnik nie jest stały, ale wartość wskazywana przez wskaźnik jest stała. Wskaźniki w tym miejscu można przypisać do innej lokalizacji.

3

Przydziały te są całkowicie poprawne, tak jak ja i inni wyjaśniliśmy w ostatnim teście prawie identycznych pytań.

A const char* to wskaźnik do pamięci, którego nie można zmodyfikować za pomocą tego wskaźnika. Nic tutaj nie może tego obejść. Kompilator zaprotestowałby, gdyby od tego czasu przypisano c4 = c1, które omijałyby const.

30

W umyśle narysuj linię przez asterik. Po lewej stronie jest to, co jest wskazał i na prawo, jaki rodzaj wskaźnika

Na przykład

  1. const char * const p - Wskaźnik p jest stała i tak są znaki, które p wskazuje - to znaczy nie mogą zmienić zarówno wskaźnik i zawartość do tego, co wskazuje na stałe znaki. Możesz zmienić wartość p i ustawić tak, by wskazywała na różne stałe znaki. Ale niezależnie od tego, co wskazuje p, nie można zmienić zawartości.
  2. char * const p - Jesteś w stanie zmienić wskaźnik, ale może zmienić zawartość

i wreszcie

  1. char * p - wszystko jest do zgarnięcia

nadzieję, że pomoże.

+0

Czy masz na myśli 2 * sw pierwszym przykładzie? –

+0

Bardzo wyraźne. Niezły post. Po prostu zastanawiałem się, dlaczego mogłem zmienić "const char * ptr" jako argument wejściowy, co idealnie wyjaśniono. Brakuje głosów na kolejne 40 minut, więc będę ++ po tym. – stevieb

0

Wszystkie te są prawidłowe, jedyną problematyczną linią jest char * c6 = "abc";: tutaj "abc" jest literałem stałym, więc przypisanie go do wskaźnika niestałego nie jest bezpieczne i powinno przynajmniej wygenerować ostrzeżenie, jeśli nie jest błędem kompilacji (Nie próbowałem go skompilować).

Powiązane problemy