2013-03-23 21 views
5

Jak mogę zadeklarować dwie różne zmienne (powiedzmy x i y), które mają ten sam adres?Ten sam adres dwóch zmiennych?

printf("%p\n",&x); /*will be same */ 
    printf("%p\n",&y); 

Jeśli to możliwe bez union?

+1

W związku? .. – Mysticial

+0

i nie chcesz wskaźników? – Alon

+0

Tak. to jest droga, ale chcę bez użycia związku. – Farseer

Odpowiedz

7

Dokładne pytanie, o które prosiłeś, nie może zostać wykonane przy użyciu standardowych funkcji języka, ale niektóre kompilatory mają rozszerzenia, które na to pozwalają. Na przykład w GCC może to zrobić, co chcesz (documentation here).

#define ASMNAME(x) ASMNAME_(__USER_LABEL_PREFIX__, #x) 
#define ASMNAME_(x,y) ASMNAME__(x, y) 
#define ASMNAME__(x,y) __asm__(#x y) 
int x; 
extern int y ASMNAME(x); 

int main(void) 
{ 
    return !(&x == &y); /* will exit successfully */ 
} 

Uwaga również, jaki wpływ ma to, iż: w pliku wynikowego, istnieje tylko jedna zmienna, a jego nazwa jest x. y została zadeklarowana jako inna nazwa w kodzie źródłowym. To może, ale nie musi być wystarczająco dobre w zależności od tego, co próbujesz zrobić.

Należy również zauważyć, że dwie zmienne są traktowane jako odrębne dla celów optymalizacji. Na przykład:

#define ASMNAME(x) ASMNAME_(__USER_LABEL_PREFIX__, #x) 
#define ASMNAME_(x,y) ASMNAME__(x, y) 
#define ASMNAME__(x,y) __asm__(#x y) 
int x; 
extern int y ASMNAME(x); 

#include <stdio.h> 

int main(void) 
{ 
    int a, b; 
    x = 1; 
    a = x; 
    y = 2; 
    b = x; 
    printf("a=%d b=%d x=%d y=%d\n", a, b, x, y); 
    return 0; 
} 

mogą również drukować

a=1 b=1 x=1 y=2 

ponieważ sklep do y nie jest uważany wpływ na wartość x.

+0

Dobry pomysł, dziękuję za odpowiedź! – Farseer

+0

@Farseer Proszę przeczytać zredagowaną odpowiedź i upewnić się, że to naprawdę robi to, co chcesz. – zwol

+0

To robi. Wielkie dzięki, Zack! – Farseer

4

Nie ma sposobu, aby zrobić to, co chcesz w czystym C, gdy zadeklarujesz zmienne (i zrobisz coś, co odczyta/napisze ich adresy [tak, że kompilator nie zdecyduje się traktować ich jako rejestrów]) są one przydzielony pokój w pamięci. Nie można mieć 2 zmienne zajmują tę samą przestrzeń bez gloryfikowanych odniesień CPP lub unii, można mieć jedną zmienną i szereg wskaźników do niego jednak:

type1 var1; 
type2 * var2 = &var1; 

ale ostatecznie, kiedy chcę leczyć kawałek pamięć jako różnych typów I zwykle po prostu zrobić:

void * var = &something; 

a potem po prostu używać go jak:

*(int*)var 
1
int *p=NULL; 
    *p=value1; , 

wydrukuj go *p=value2;, użyj go

+0

i uzyskać wyjątek? – Alon

+0

jaki wyjątek? – XTGX

+0

@XTG nie przypisujesz pamięci dla '* p', więc przypisanie do' * p' jest niezdefiniowanym zachowaniem. i może powodować blokadę. –

6

Co jest @Mysticial mówi prawdą. Elementy Unii dzielą pamięć. a dwie zmienne w związku mają ten sam adres początkowy. Oto mój przykładowy program i jego wyniki mogą pomóc ci zrozumieć.

#include<stdio.h> 
union u{ 
int x; 
int y; 
}; 
union u a; 
int main(){ 
    printf("\n %p %p\n",&a.x, &a.y); 
    return 1; 
} 

wyjściowa:

~$ ./a.out 

0x601030 0x601030 

Dodatkowo, jak @Alon pomysłu, w C++ masz jeszcze jeden rodzaj zmiennej o nazwie zmiennej referencyjnej jest aliasem innej zmiennej. można tworzyć jak: (ty pytanie jest TAG, C, C nie masz zmienne referencyjne) patrz poniżej:

int a = 10; 
int &b = a; 

+----+----+ 
| 10 | <--- a = b 
+----+----+ 
    2002   

jeśli wydrukować &a i &b wtedy dostaniesz 2002 sam.

+0

Dzięki za odpowiedź, ale czy to możliwe bez Unii? – Farseer

+0

To prawda, ale xiy nie są dwiema różnymi zmiennymi - unia jest zmienną. – teppic

+0

Nie w C. W C++ można to zrobić z referencjami. W języku C zmienna jest z definicji unikalnym adresem. –

Powiązane problemy