2009-07-30 38 views
11

Tôi nghĩ rằng tôi đã đọc ở đâu đó nó là bất hợp pháp để lấy địa chỉ của một giá trị enum trong C (giá trị enum không phải là lvalues, tuy nhiên, tôi không thể tìm thấy bất kỳ thông tin trên điều này bây giờ). Điều đó có đúng không và nếu có thì tại sao?Vị trí bộ nhớ của giá trị enum trong C


Edit:

Dưới đây là một ví dụ mà làm rõ những gì tôi có nghĩa là bởi "giá trị enum" ở trên. Tôi có nghĩa là lấy địa chỉ của first_value dưới đây, không lấy địa chỉ của một thể hiện thực tế của một enum:

enum myenum 
{ 
    first_value, 
    second_value 
}; 
+0

Enum đó chỉ tồn tại trong bộ nhớ của trình biên dịch chứ không phải tệp thực thi. Bạn sẽ phải tạo một thể hiện của enum để nó xuất hiện trong tệp thực thi. – Anonym

Trả lời

24

"Giá trị enum" hơi mơ hồ; tuy nhiên, tôi cho rằng bạn có ý nghĩa như sau:

enum myenum 
{ 
    first_value, 
    second_value 
}; 

Trong trường hợp này, việc lấy địa chỉ là first_value là bất hợp pháp. Lý do cho điều này là first_value không thực sự tồn tại trong bộ nhớ bất cứ nơi nào ... nó chỉ là một hằng số, có hiệu quả tên khác cho số 0 (trong đó, tất nhiên, bạn cũng không thể lấy địa chỉ).

Nếu, mặt khác, bạn có nghĩa là cho dù bạn có thể lấy địa chỉ của một biến được khai báo là một enum:

enum myenum x; 
enum myenum *mypointer=&x; 

thì đó chắc chắn là có thể.

+1

Tại sao lại là downvote? –

+2

Mọi người đều có một phần của sự ngạc nhiên của SO, tôi đoán vậy. –

+0

Cảm ơn! Vâng, nó mơ hồ. Tôi làm rõ câu hỏi với ví dụ đầu tiên từ câu trả lời của bạn. – olovb

18

nếu bạn có:

enum E { 
    X, Y, Z 
}; 

thì bạn không thể lấy địa chỉ của X, Y hay Z, bất kỳ hơn bạn có thể lấy địa chỉ từ 0, 1 hoặc 2.

Tuy nhiên, bạn có thể lấy địa chỉ của một thể hiện enum:

typedef enum { 
    X, Y, Z 
} E; 

int main() { 
    E e; 
    E * ep; 
    ep = & e; 
} 
5

Tên giá trị cho enums chỉ là bí danh hằng số cho số nguyên, do đó, nó vô nghĩa khi cố gắng lấy địa chỉ của chúng. Bạn có thể lấy địa chỉ của một enum biến tốt, tất nhiên.

+0

Giá trị enum là hằng số, nhưng chúng không phải là macro. Trong hầu hết các khía cạnh, chúng làm việc tất nhiên tương tự như các hằng số được xác định bằng cách sử dụng macro, nhưng chúng khác nhau theo một số cách tinh tế - chúng có thể phạm vi, ví dụ, trong khi macro không. –

+0

Chúng chắc chắn không phải là #defines hoặc macro. Bạn có thể muốn viết lại điều này. –

+0

Vâng, Chúa ơi, tôi đã đánh giá thấp giá trị mà tôi gặp phải. Mea maxima effing culpa. Tất cả tốt hơn bây giờ. – chaos

0

Theo như tôi nhớ enums trong C chỉ là số nguyên. Vì vậy, nó sẽ giống như trỏ đến biến cục bộ.

+1

Một con trỏ tới biến cục bộ là một điều hoàn toàn hợp lệ trong C. –

+0

Đúng, đã lâu rồi kể từ khi tôi sử dụng C. Có một số khoảnh khắc khi tôi cảm thấy như tôi vẫn biết điều gì đó, giống như một PM là một lập trình viên 10 năm trước ... tôi nên bỏ phiếu cho bản thân mình –

10

Enums được sử dụng để thay thế #define chuỗi:

#define SUCCESS 0 
#define LITTLE_ERROR 1 
#define BIG_ERROR 2 

này có thể được thay thế bằng:

enum 
{ 
    SUCCESS, 
    LITTLE_ERROR, 
    BIG_ERROR 
}; 

Một giá trị enum như SUCCESS chỉ đơn thuần là một biểu tượng cho một số nguyên không đổi, mà thắng' t được lưu trữ bất cứ nơi nào trong bộ nhớ của chương trình. Vì vậy, nó không có ý nghĩa để lấy địa chỉ của nó.

2

xin tham khảo ví dụ dưới đây:

enum { FIRST,SECOND } var; 

ở đây FIRSTSECOND là hằng số macro.Do đó, toán tử & sẽ không hoạt động, vì nó không được lưu trữ ở bất kỳ nơi nào trong bộ nhớ

Nhưng đối với var, một vị trí bộ nhớ sẽ được gán và toán tử &.

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