2010-04-18 13 views
7

Jestem ciekawy, dlaczego jest to błąd i co oznacza komunikat o błędzie. Oto kod:Co się dzieje ze wskaźnikami w tym urywku?

int *x[] = {"foo", "bar", "baz"}; 
int *y[] = {"foo", "bar", "baz"}; 

x = y; 

próbuję skompilować i uzyskać w ten sposób:

error: incompatible types when assigning to type ‘char *[3]’ from type ‘char **’ 

Pytanie # 1 dlaczego ten błąd? i pytanie nr 2 dlaczego typy są różne?

+10

Dlaczego przechowujesz ciągi znaków w tablicach zawierających wskaźniki liczb całkowitych? –

+0

Czy sprawdziłeś numer linii? – SLaks

Odpowiedz

5

Jak napisano, jest sporo problemów. Po pierwsze, literały tablicy są typu char*[], natomiast x i y są typu int*[]. Po drugie, nie możesz przypisać tablic bezpośrednio, ponieważ są one w rezultacie stałymi wskaźnikami.

+2

Naprawdę chciałbym, żeby to memy umarło. Tablice nie są stałymi wskaźnikami - nie są żadnym wskaźnikiem, są tablicami (niepustą ciągłą sekwencją obiektów tego samego typu). – caf

+1

Zmienna, której typem jest tablica w C, podąża za semantyką bardzo podobną do stałych wskaźników. To samo dotyczy grawitacji - na pewno nie jest stała na całym świecie i nie jest to siła skierowana w dół. Niemniej jednak warto rozważyć oba te aspekty w przypadku większości zastosowań. –

3

Występuje błąd niekompatybilnych typów, ponieważ przypisujesz tablice ciągów (typ char * w C) do tablic wskaźników do int (takich jak int *x[]). Komunikat o błędzie wydany przez kompilator jest nieco mylący, ponieważ C robi dużo za kulisami, aby spróbować przekonwertować zmienne z jednego typu na inny.

Ponieważ znaki są reprezentowane wewnętrznie jako liczby (litery odpowiadają ich wartościom ASCII), C jest w stanie konwertować znaki na ints, więc próbuje traktować zmienne xiy jako tablice wskaźników do znaków zamiast do int, stąd char *[3]. Widzi {"foo", "bar", "baz"} jako typ char **, ponieważ łańcuchy są typu char * i tablice zasadniczo przechowywane jako wskaźniki w C, więc jest to wskaźnik do char * lub char **.

Chociaż nie jest to całkowicie związane z twoim pytaniem, zastanawiam się również, co próbujesz zrobić z x = y; Jak jest napisane, to sprawi, że x wskaże tę samą tablicę co y, pozostawiając tablicę, która jest używana x wskazać na niedostępne. Aby sprawdzić, czy dwie zmienne w C są równe, należy użyć operatora ==. Testowanie równości nie jest tak proste dla tablic ani łańcuchów, ale to całkowicie wykracza poza zakres tego pytania.

0

Polecam zacząć od dobrego samouczka na temat wskaźników i tablic. Wygląda na to, że możesz pochodzić z języka interpretowanego, takiego jak JavaScript lub PHP. Wszystko jest zupełnie inne w C, a ty musisz opanować pojęcia pamięci stosu, pamięci sterty, wskaźników itp. Gdy to zrobisz, wszystko będzie miało sens i będziesz kochać C.

2

To jest błąd, ponieważ tablica jest niemodyfikowalną lwartością - co oznacza, że ​​nie można jej przypisać bezpośrednio. Możesz modyfikować tylko członków tablicy indywidualnie.

Typy są różne, ponieważ jeśli tablica jest używana w kontekście, w którym l-wartość nie jest wymagana, jest obliczana do wskaźnika do pierwszego elementu (somearray staje się efektywnie &somearray[0]).

Ponieważ tablica y jest używana w takim kontekście, jest ona oceniana jako adres jej pierwszego elementu, który ma typ int **. Ponieważ tablica xjest w kontekście lwartości, jest oceniana jako tablica (int *[3]). (Twój komunikat o błędzie nie pasuje do twojego kodu - podejrzewam, że twoje tablice są w rzeczywistości tablicami char *).

("Kontekst l-wartościowy" oznacza, w dużym stopniu, jedną z następujących opcji: Lewa strona operatora przypisania (czyli skąd pochodzi nazwa), temat operatora sizeof lub temat operatora &) .

0

z jakiegoś powodu nie mogę użyć tego samego konta, z którym opublikowałem pytanie.

"Int" było literówką z mojej strony, naprawdę chciałem, żeby to było "char". Przepraszam za zamieszanie.

Jednak myślę, że caf odpowiedział na moje pytanie.

"Jest to błąd, ponieważ tablica jest niemodyfikowalną l-wartością - co oznacza, że ​​nie można jej przypisać bezpośrednio. Możesz modyfikować tylko elementy tablicy osobno."

Po prostu próbuję zrozumieć, jak działają wskaźniki, dlatego próbuję tych przypadkowych rzeczy, których prawdopodobnie normalnie byś nie zrobił. Myślałem, że to może zadziałać, ponieważ myślę, że tablice = wskaźniki, więc mógłbym zrobić x punkt na y. Nie sądzę?

Dzięki za wszystkie odpowiedzi.

Powiązane problemy