2011-01-13 32 views
6

đơn giản nhưng khéo léo câu hỏi:mảng được khai báo với từ khóa tĩnh: tĩnh là gì, con trỏ hoặc toàn bộ mảng?

void f() { 
    static int a[3] = {1, 2, 3}; 
    ... 

là gì tĩnh ở đây? Con trỏ đến mảng hoặc toàn bộ mảng?

Ai có thể chỉ cho tôi định nghĩa về điều đó trong tiêu chuẩn C không?

Cảm ơn!

+2

trỏ gì bạn đang đề cập đến? –

+0

Tôi đang tham chiếu đến con trỏ "a" (& a [0]). – Silas

+3

Biểu thức '& a [0]' mà 'a' mở rộng trong hầu hết các ngữ cảnh không phải là một giá trị. Đó là một địa chỉ và không phải là một con trỏ. Chỉ có một định danh được xác định và đây là mảng. Vì không có số nhận dạng khác, không có gì để áp dụng 'tĩnh'. –

Trả lời

6

Từ tiêu chuẩn ISO C99 (phần 6.2.1, "Lĩnh vực định danh"):

3 Nếu tuyên bố của một phạm vi tập tin định danh cho một đối tượng hoặc một hàm chứa lưu trữ-class specifier tĩnh, nhận dạng có linkage.22 nội bộ)

trong ví dụ của bạn đó là định danh a mà trở nên tĩnh (tức là biểu tượng trong tập tin đối tượng không xuất khẩu).

EDIT:

Đối với tờ khai phạm vi phi tập tin tĩnh (phần 6.2.4, "khoảng thời gian lưu trữ các đối tượng")

3 Một đối tượng có nhận dạng được tuyên bố với bên ngoài hoặc nội bộ liên kết hoặc với bộ lưu trữ thông số tĩnh tĩnh có thời gian lưu trữ tĩnh . Tuổi thọ của nó là toàn bộ việc thực hiện chương trình và giá trị được lưu trữ chỉ được khởi tạo một lần, trước khi khởi động chương trình.

Tôi lấy nó để có nghĩa là bản thân mảng trở nên tĩnh trong trường hợp này, điều này có ý nghĩa, vì từ định danh sẽ có nội dung không hợp lệ.

+0

Cảm ơn bạn đã trả lời, nhưng tôi đã chỉnh sửa bài đăng để bao quanh nó bằng một hàm. Nó thực sự không phải là định danh phạm vi tệp ... – Silas

+0

@Silas: xem chỉnh sửa của tôi – thkala

+0

Có - đối tượng "" trong trường hợp này là mảng, vì vậy nó là mảng có thời lượng lưu trữ tĩnh. – caf

2

Trong mã:

static int a[3] = {1, 2, 3}; 

Loại một là không phải con trỏ, nhưng mảng int. Tuy nhiên, nó được tự động chuyển đổi thành con trỏ, ví dụ: trong tiêu chuẩn C:

Ngoại trừ khi nó là toán hạng của toán tử sizeof hoặc toán tử đơn và toán tử, hoặc là chuỗi ký tự được sử dụng để khởi tạo mảng, biểu thức có loại '' mảng kiểu '' được chuyển thành một biểu thức với loại '' con trỏ để gõ '' trỏ đến phần tử ban đầu của đối tượng mảng và không phải là một giá trị.

Vì vậy, nếu a là mảng, hơn = {1, 2, 3} là khởi tạo, không phải là một loại mảng riêng biệt. Tôi không biết nếu nó được xác định chính xác ở đâu đó, nhưng theo nghĩa này nó được sử dụng xuyên suốt tiêu chuẩn.

Sửa để làm sáng tỏ sự nhầm lẫn của một số độc giả: theo tiêu chuẩn trích dẫn, nếu bạn viết:

int arr[4] = { }; 
arr[0] = 1; //arr here has here type int* 
size_t sz = sizeof(arr); //here it is not type int*, sizeof is exception 
+4

Tôi có nhớ nơi bạn trả lời câu hỏi đã được hỏi không? –

+0

Câu hỏi là: Cái gì tĩnh ở đây? Con trỏ đến mảng hoặc toàn bộ mảng? Điều đó ngụ ý rằng static int a [3] -> a chỉ là static int *, dữ liệu thực tế (3 số nguyên) không tĩnh, câu hỏi là về điều đó, lưu trữ tĩnh có vẻ rõ ràng cho người hỏi. – peenut

+0

Agh ... Bạn bị ám ảnh bởi nếu "a" là con trỏ hay không bạn quên trả lời câu hỏi. –

2

Nó áp dụng cho mảng. Không có con trỏ nào trong mã của bạn. Mảng không phải là con trỏ.

#include <stdlib.h> 
#include <stdio.h> 

void f() { 
    static int a[3] = {1, 2, 3}; 
     a[1]++; 
     printf("%d\n", a[1]); 
} 

main() 
{ 
     int i; 
     for (i = 0; i < 5; i++) 
     { 
       f(); 
     } 
} 

đầu ra

3 
4 
5 
6 
7 
+2

-1: mảng IS, mảng không được phân bổ đống (với kích thước cố định) không phải là con trỏ, nhưng tự động chuyển thành - vì vậy nó gần như là con trỏ (trong hầu hết các trường hợp nó được sử dụng như một) – peenut

+1

@peenut : Bạn có ý nghĩa gì với mảng được phân bổ heap? Tại sao nó là bất kỳ chi tiết của một con trỏ hơn một mảng phân bổ bất kỳ cách nào khác? –

+1

@peenut um ... con trỏ không phải là mảng. Ngay cả theo những gì bạn nói, mảng này không phải là một con trỏ. Tôi cũng không hiểu những gì một "mảng phân bổ heap" là. –

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