2012-03-06 69 views
5

Tôi có một ví dụ về Code ở đây.sự khác biệt giữa cấu trúc tĩnh và cấu trúc bình thường là gì?

struct node { 
     int data; 
     struct node *link; 
    }; 
    static struct node *first = NULL; 

Sẽ rất tuyệt nếu ai đó có thể ném một số câu hỏi dưới đây về cách sử dụng từ tĩnh.

  1. Từ khóa tĩnh làm gì ở mã trên?

  2. sự khác nhau giữa cấu trúc bình thường và cấu trúc tĩnh là gì?

+2

Không có 'cấu trúc tĩnh' trong mã của bạn. Nó chỉ là 'static' instance của' struct node'. – iammilind

+0

@iammilind: nó thậm chí không phải là, nó là một thể hiện của 'struct node *'. –

Trả lời

7

Nó tạo con trỏ tĩnh đến node và khởi tạo nó thành NULL.

Định nghĩa biến có thể có nhiều ý nghĩa:

static struct node *first = NULL; 

Nếu định nghĩa bên ngoài của một phương pháp, nó mang lại cho firstnội bộ liên kết. Nó chỉ có thể được sử dụng bên trong mô-đun xác định.

Nhưng bạn cũng có thể thấy rằng dòng bên trong một phương pháp:

void foo() 
{ 
    static struct node *first = NULL; 
} 

Biến là một cư trú ở biến phương pháp đặt phạm vi trong lưu trữ tĩnh. Nó được khởi tạo thành NULL một lần và tất cả các thay đổi tiếp theo tồn tại giữa các cuộc gọi đến hàm.

+0

Đó là câu hỏi: "con trỏ tĩnh" nghĩa là gì? –

+0

@KonradRudolph yup, tôi đã đọc sai câu hỏi. Đã chỉnh sửa ngay bây giờ. –

+1

Trường hợp thứ hai được gọi là một biến với "phạm vi chức năng và thời gian lưu trữ tĩnh", không phải là "phạm vi toàn cầu phương pháp". –

5

Điều đó có nghĩa là biến này có thể không được sử dụng bên ngoài mô-đun này.

Ví dụ: - bạn không thể tham khảo con trỏ này từ một tập tin sử dụng

extern struct node *first; 

Một lưu ý quan trọng là các cấu trúc không phải là tĩnh, chỉ first mà là một con trỏ đến cấu trúc như vậy là tĩnh.

+0

Nó cũng có thể là một biến tĩnh bên trong một phương thức. –

+0

@LuchianGrigore - đúng, không tính đến điều đó. – MByD

2

Nó không ảnh hưởng đến định nghĩa của cấu trúc. Nó chỉ có nghĩa là một ví dụ cụ thể của cấu trúc, có tên là first tại đây, có liên kết nội bộ.

+0

Bạn không có nghĩa là liên kết nội bộ? –

+0

Tại sao, vâng tôi làm. :) –

0

Từ khóa tĩnh cho biến toàn cầu làm cho biến cục bộ thành mô-đun nơi nó được xác định. I E. bạn không thể truy cập nó từ mô-đun khác.

Nếu biến tĩnh được xác định trong một hàm, nó sẽ giữ biến còn sống và được cập nhật giữa các cuộc gọi đến hàm này.

0

Khi sửa đổi biến, từ khóa tĩnh chỉ định biến có thời lượng tĩnh (được phân bổ khi chương trình bắt đầu và deallocated khi chương trình kết thúc) và khởi tạo nó thành 0 trừ khi giá trị khác được chỉ định. Khi sửa đổi một biến hoặc hàm tại phạm vi tệp, từ khóa tĩnh xác định rằng biến hoặc hàm có liên kết nội bộ (tên của nó không hiển thị từ bên ngoài tệp mà nó được khai báo).

Biến tĩnh được khai báo trong một hàm duy trì trạng thái giữa các cuộc gọi đến hàm đó.

Khi sửa đổi thành viên dữ liệu trong khai báo lớp, từ khóa tĩnh chỉ định rằng một bản sao của thành viên được chia sẻ bởi tất cả các phiên bản của lớp. Khi sửa đổi một hàm thành viên trong một khai báo lớp, từ khóa tĩnh xác định rằng hàm chỉ truy cập các thành viên tĩnh.

Thành phần dữ liệu tĩnh của lớp phải được khởi tạo ở phạm vi tệp.

Trong mã đệ quy, một đối tượng tĩnh hoặc biến được đảm bảo có cùng trạng thái trong các trường hợp khác nhau của một khối mã.

Các thành viên của liên minh không thể được khai báo là tĩnh. Một liên minh ẩn danh được khai báo trên toàn cầu phải được khai báo một cách rõ ràng là tĩnh.

Đối tượng và biến được xác định bên ngoài tất cả các khối có tuổi thọ tĩnh và liên kết bên ngoài theo mặc định. Một đối tượng toàn cầu hoặc biến được khai báo rõ ràng là tĩnh có liên kết nội bộ.

+1

** Tĩnh không có nghĩa là. ** Trong thực tế, nó được phân bổ trong bộ nhớ tĩnh, không phải trên heap hoặc stack. –

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