2009-06-13 12 views
7

Chciałbym wiedzieć, czy wskaźnik zapisuje adres dowolnej zmiennej ... to skąd mamy wskaźnik?Czy wskaźnik ma również przydzielony adres lub pamięć?

Zapytałem, że jeśli używamy wskaźnika bezpośrednio, to musi być lokalizacja, skąd otrzymujemy ten wskaźnik?

Proszę o pomoc, jestem gettin mylić ...: ((

+0

Retagged postu. Rubin? Daj spokój. –

+1

W obecnej formie pytanie nie ma większego sensu. –

+0

Prawie odpowiedziałem na twoje pytanie, a kilka innych pokazało ci przykłady. Czy jest coś jeszcze, czego potrzebujesz? –

Odpowiedz

4

Spójrz na to tak pisać dla lepszego zrozumienia wskaźników What are the barriers to understanding pointers and what can be done to overcome them?

Jeśli chodzi o Twoje pytanie idzie, jeśli dobrze rozumiem. to, czego chcesz, to w zasadzie, gdy deklarujesz wskaźnik, określasz adres lub indeks numeryczny, który jest przypisany do każdej jednostki pamięci w systemie (zazwyczaj bajt lub słowo), a następnie zapewnia operację do odzyskania. wartość zapisana w pamięci pod tym adresem

10

Tak. Poniżej mam int i wskaźnik do int i kodu, aby wydrukować adres pamięci każdego z nich.

int a; 
printf("address of a: %x", &a); 

int* pA = &a; 
printf("address of pA: %x", &pA); 

Wskaźniki, w systemach 32-bitowych, zajmują 4 bajty.

3

C:

char *p = "Here I am"; 

p następnie przechowuje adres, jest przechowywany 'H'. p jest zmienną. Można przyjąć wskaźnik do niego:

char **pp = &p; 

pp teraz przechowuje adres p. Jeśli chcesz uzyskać adres pp, który będzie &pp itp.

26

Tak, zadeklarowany wskaźnik ma swoją własną lokalizację w pamięci.

alt text

W powyższym przykładzie, masz zmienną, 'b', która przechowuje wartość "17".

int b = 17; /* the value of 'b' is stored at memory location 1462 */ 

Podczas tworzenia wskaźnik do tej zmiennej, wskaźnik jest przechowywane we własnej komórce pamięci.

int *a; 
a = &b;  /* the pointer 'a' is stored at memory location 874 */ 

Zadaniem kompilatora jest wiedzieć, gdzie "uzyskać wskaźnik". Kiedy twój kod źródłowy odnosi się do wskaźnika "a", kompilator tłumaczy go na -> "jakakolwiek wartość adresu jest przechowywana w pamięci 874".

Uwaga: Ten schemat nie jest poprawny technicznie, ponieważ w systemach 32-bitowych oba wskaźniki i int mają po cztery bajty.

+0

Co ze wskaźnikami do pól NULL? Zwłaszcza w rekursywnych abstrakcyjnych typach danych. - Uczę się o połączonych listach. Połączona lista jest faktycznie nieskończoną liczbą wskaźników (węzłów rekursywnych). Czy te zajmują pamięć? Czy też wartości zerowe nie zajmują pamięci? – Federico

1

Kompilator zajmuje się tłumaczeniem zmiennych w naszym kodzie na lokalizacje w pamięci używane w instrukcjach maszyn. Lokalizacja zmiennej wskaźnika zależy od tego, gdzie jest zadeklarowana w kodzie, ale programiści zwykle nie muszą zajmować się nią bezpośrednio.

Zmienna zadeklarowana wewnątrz funkcji znajduje się na stosie lub w rejestrze (o ile nie jest zadeklarowana jako statyczna).

Zmienna zadeklarowana na najwyższym poziomie znajduje się w sekcji pamięci na górze programu.

Zmienna zadeklarowana jako część dynamicznie przydzielanej struktury lub tablicy występuje na stercie.

Operator "&" zwraca lokalizację pamięci zmiennej, ale w przeciwieństwie do operatora "*", nie można jej powtórzyć.

Na przykład * * * i pobiera wartość pod adresem * * i, która jest wartością pod adresem * i, która jest wartością przechowywaną w i, którą kompilator wyszukuje w jaki sposób znaleźć.

Ale & & Nie skompiluję. & i jest liczbą, która jest miejscem w pamięci używanym przez kompilator dla zmiennej i. Ta liczba nie jest przechowywana nigdzie, więc nie ma sensu.

(Zauważ, że jeśli & i jest używany w kodzie źródłowym, a następnie kompilator nie może przechowywać I w rejestrze).

Powiązane problemy