2012-03-21 11 views
15

O ile wiem o Typ danych, podczas deklarowania zmiennej, musimy zadeklarować jej typ danych, który mówi kompilatorowi, aby odpowiednio zarezerwować liczbę bajtów w pamięci.Dlaczego typ danych jest wymagany w deklaracji wskaźnika?

Jednak w przypadku wskaźników, wiemy, że ich wielkość jest zawsze 2 bajtów (w Turbo Compiler) zawsze niezależnie od rodzaju danych zmiennej to wskazuje.

Moje pytanie brzmi, czy wskaźniki zawsze 2 bajty, to co to jest konieczność wymieniania typ danych podczas ich deklarowania? LUB Czy moje rozumienie wskaźników jest błędne?

+1

Jaki jest cel * nie * określania typu danych? Jeśli planujesz zrobić cokolwiek ze wskaźnikiem, musisz znać typ danych, do którego on prowadzi. – tenfour

+0

@ Chris: A co z (void *)? – Malkocoglu

Odpowiedz

24

Typ danych jest potrzebny, gdy wyłuskuje wskaźnik, aby wiedzieć, ile danych ma odczytać. Na przykład dereferencja wskaźnika char powinna odczytać następny bajt z adresu, na który wskazuje, podczas gdy wskaźnik int powinien odczytać 2 bajty.

+0

To wspaniała odpowiedź! W końcu to zrozumiałem. – Jeyekomon

+0

Proste, ale intuicyjne wyjaśnienie. –

5

Przede wszystkim wielkość i reprezentacja samych wskaźników aren't always the same for different types. To po prostu coś, co dzieje się w wielu implementacjach.

Po drugie, podczas używania wskaźników nie dbasz o wielkość samych wskaźników. Potrzebujesz wielkości szpiczastego typu.

Na przykład, spróbuj tego:

int var[5]; 
char *c = (char *)var; 
int *x = var; 

printf("%p\n%p\n", p + 1, x + 1); 

Zobaczysz wskaźnik arytmetyka silnie zależy od wielkości spiczastym typu.

5

Problem nie dotyczy rozmiaru wskaźnika, ale dereferencji wskaźnika. (Pogoda w C lub C++)

Powiedzmy, że masz:

int* someint; 
float* somefloat; 

*someint referencje rozmiar pamięci sizeof(int), natomiast *somefloat odniesień rozmiar pamięci sizeof(float) które są różne.

1

Wielkość potrzebnego wskaźnika zależy od używanego systemu. W systemie x86_64 rozmiar wskaźnika może być 64-bitowy.

Powodem, dla którego potrzebny jest typ danych dla wskaźników, jest fakt, że kompilator musi wiedzieć, na jaki rozmiar komórki pamięci wskazuje między innymi wskaźnik. Nie można również zapewnić bezpieczeństwa typu bez typu. Ponadto musisz mieć typograficzny każdy wskaźnik podczas uzyskiwania dostępu do struktur ze wskaźnika.

Możesz również użyć wskaźnika void i zrobić wszystko ręcznie. Ale dlaczego miałbyś tego chcieć?

0

jest to pojęcie silnego typowania używanego w języku C++. rozmiar wskaźnika może być taki sam, ale rozmiar wskazanego typu może się różnić. zawsze możesz jednak rzucić wskaźnik jednego typu na wskaźnik innego typu.

1

Załóżmy, że ten kod kompiluje bez błędów (jak chcesz):

int a; 
int b = 42; 
void * d = &b; 

a = *d; 

Jaka powinna być wartość a?

Teraz z tego:

int a; 
float b = 42.0; 
void * d = &b; 

a = *d; 

Czego można się spodziewać w?

W rzeczywistości typ określa jak należy interpretować wskazany obszar. Należy podać int * w pierwszym przykładzie i float * w drugim, zamiast void *.

+0

Czy mógłbyś pokazać teoretyczne wyniki tych przykładów? – Hoto

4

Typ danych wskaźnik jest potrzebny w dwóch sytuacjach:

  1. Deferencing wskaźnik
  2. Pointer arytmetyka

Jak to jest używane w dereferencji wskaźnika?
Rozważmy następujący przykład:

{ 
     char *k; //poniter of type char 
     short j=256; 
     k=&j; // Obviously You have to ignore the warnings 
     printf("%d",*k) 
    } 

Teraz ponieważ k jest typu char więc będzie czytać tylko jeden bajt. Teraz wartość binarna 256 jest 0000000100000000 ale ponieważ k jest typu char więc będzie czytać tylko pierwszy bajt stąd wyjście będzie 0.
Uwaga: jeśli przypiszemy J = 127 następnie wyjście będzie 127, ponieważ 127 będzie posiadać pierwszym bajtem.

teraz do wskaźnik arytmetyki:
Rozważmy następujący przykład:

{ 
     short *ptr; 
     short k=0; 
     ptr=&k; 
     k++; 
     ptr++;// pointer arithmetic 
    } 

są stwierdzeniami k++ i ptr++ to samo? Nie, k++ oznacza k=k+1 i ptr++ oznacza ptr=ptr+2. Ponieważ kompilator "wie", że jest wskaźnikiem i wskazuje na skrót, dodaje 2 do ptr zamiast 1, więc wskaźnik "wskazuje" następną liczbę całkowitą.

Aby uzyskać więcej informacji, zapoznaj się z drugim rozdziałem samouczka w wersji this.

1

Typy danych są potrzebne po prostu do sprawdzenia typu.

+0

Ogólnie rzecz biorąc, spróbuj podać odpowiedzi, które są trochę bardziej istotne. Być może spróbuj podać przykład? – Nathan

Powiązane problemy