2011-01-13 37 views
6

簡單,但棘手的問題:使用static關鍵字聲明的數組:static是什麼,指針或整個數組?

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

什麼是靜態的嗎?指向數組或整個數組的指針?

任何人都可以指出我在C標準中的定義嗎?

謝謝!

+2

你指的是什麼指針? – 2011-01-13 20:33:35

+0

我指的是「a」指針(&a [0])。 – Silas 2011-01-13 20:34:49

+3

在幾乎所有情況下`a`擴展的表達式&a [0]不是左值。它是一個地址而不是指針。只有一個標識符被定義,這是數組。由於沒有其他標識符,所以沒有什麼可以應用`static`。 – 2011-01-13 20:43:24

回答

6

從ISO C99標準(第6.2.1節「標識符的作用域」):

3如果一個文件範圍 標識符對象或功能 的聲明包含存儲類 符靜態的,標識符具有 內部linkage.22)

在您的例子它的a標識符變爲靜態的(即,目標文件中的符號未導出)。

編輯:

對於非文件範圍靜態聲明(第6.2.4節,「對象的存儲持續時間」)

3,其標識符與外部或內部聯動 聲明 一個目的,或者與存儲級 說明符static有靜態存儲 持續時間。它的使用壽命是整個 程序的執行,其 存儲值在程序啓動前僅初始化一次, 。

我認爲這意味着在這種情況下數組本身變爲靜態,這是有道理的,因爲否則標識符將具有無效內容。

2

在代碼:

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

鍵入一個不指針,但爲int陣列。然而,它被自動轉換成指針,例如,在C標準中:

除非它是sizeof運算符或一元運算符的操作數,或者是用於初始化數組的字符串文字,則具有類型'''數組類型'的表達式將轉換爲類型爲''指向類型''的表達式指向數組對象的初始元素,並且不是左值。

所以,如果一個數組,比= {1,2,3}是它的初始化,而不是某種單獨的數組。我不知道它是否指定在某個地方,但從這個意義上講,它貫穿整個標準。

編輯一些讀者的清理混亂:根據引用標準,如果你寫:

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 
2

它適用於陣列。代碼中沒有指針。數組不是指針。

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

輸出

3 
4 
5 
6 
7