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
?
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
?
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
.
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
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.
W związku? .. – Mysticial
i nie chcesz wskaźników? – Alon
Tak. to jest droga, ale chcę bez użycia związku. – Farseer