2013-03-23 40 views
5

Làm cách nào để khai báo hai biến khác nhau (nói x và y) có cùng địa chỉ?Cùng một địa chỉ của hai biến?

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

Nếu có thể không có union?

+1

Với công đoàn? .. – Mysticial

+0

và bạn không muốn con trỏ? – Alon

+0

Có. nó là một cách, nhưng tôi muốn mà không sử dụng công đoàn. – Farseer

Trả lời

7

Điều chính xác mà bạn yêu cầu không thể thực hiện chỉ bằng các tiện ích chuẩn của ngôn ngữ, nhưng một số trình biên dịch có phần mở rộng cho phép nó. Ví dụ, với GCC, điều này có thể làm những gì bạn muốn (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 */ 
} 

Lưu ý rằng hiệu ứng này có, mặc dù: trong tệp đối tượng, chỉ có một biến và tên của nó là x. y chỉ được khai báo là một tên khác cho nó trong mã nguồn. Điều này có thể hoặc có thể không đủ tốt tùy thuộc vào những gì bạn đang cố gắng làm.

Cũng lưu ý rằng hai biến được coi là riêng biệt cho mục đích tối ưu hóa. Ví dụ:

#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; 
} 

cũng có thể in

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

vì cửa hàng để y không được xem là ảnh hưởng đến giá trị của x.

+0

Ý tưởng hay, cảm ơn câu trả lời! – Farseer

+0

@Farseer Vui lòng đọc câu trả lời đã chỉnh sửa và đảm bảo điều này thực sự làm những gì bạn muốn. – zwol

+0

. Cảm ơn rất nhiều, Zack! – Farseer

4

Không có cách nào để làm những gì bạn muốn trong C thuần túy, khi bạn khai báo biến (và làm điều gì đó sẽ đọc/ghi địa chỉ của chúng [để trình biên dịch không thể quyết định coi chúng là sổ đăng ký]) phân bổ phòng trong bộ nhớ. Bạn không thể có 2 biến chiếm cùng một không gian mà không cần tham khảo tôn vinh cpp hoặc một liên minh, bạn có thể có một biến và một số gợi ý để nó mặc dù:

type1 var1; 
type2 * var2 = &var1; 

Nhưng cuối cùng khi tôi muốn để điều trị một mảnh bộ nhớ như các loại khác nhau tôi thường chỉ cần làm:

void * var = &something; 

Và sau đó chỉ cần sử dụng nó như:

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

in nó *p=value2;, sử dụng nó

+0

và nhận ngoại lệ? – Alon

+0

ngoại lệ là gì? – XTGX

+0

@XTG bạn không cấp phát bộ nhớ cho '* p' để gán cho' * p' là hành vi Không xác định. và có thể gây ra lỗi seg. –

6

Điều gì @ Tâm lý nói là chính xác. Các phần tử Union chia sẻ không gian bộ nhớ. và hai biến trong công đoàn có cùng địa chỉ bắt đầu. sau đây là chương trình ví dụ của tôi và đầu ra của nó có thể giúp bạn hiểu.

#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; 
} 

Output:

~$ ./a.out 

0x601030 0x601030 

Ngoài ra, như @Alon ý tưởng, trong C++ bạn có thêm một loại biến gọi là biến tham chiếu là bí danh của biến khác. bạn có thể tạo như: (bạn có câu hỏi được taged C, Trong C bạn không có các biến tham khảo) xem dưới đây:

int a = 10; 
int &b = a; 

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

nếu bạn in &a&b sau đó bạn sẽ nhận được 2002 cùng.

+0

Cảm ơn bạn đã trả lời, nhưng liệu điều này có thể không có Liên minh? – Farseer

+0

Đó là sự thật, nhưng x và y không phải là hai biến khác nhau - công đoàn là biến. – teppic

+0

Không phải trong C. Trong C++ bạn có thể làm điều đó với tài liệu tham khảo. Trong C, một biến là định nghĩa một địa chỉ duy nhất. –

Các vấn đề liên quan