2016-07-09 60 views
2

我有一本書,這個例子:什麼是數組變量的「值」?

#define ALLOCSIZE 10000 /* size of available space */ 

static char allocbuf[ALLOCSIZE]; /* storage for alloc */ 
static char *allocp = allocbuf; /* next free position */ 

char *alloc(int n) /* return pointer to n characters */ 
{ 
    if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */ 
     allocp += n; 
     return allocp - n; /* old p */ 
    } else /* not enough room */ 
     return 0; 
} 

void afree(char *p) /* free storage pointed to by p */ 
{ 
    if (p >= allocbuf && p < allocbuf + ALLOCSIZE) 
     allocp = p; 
} 

我需要知道allocbuf代表着什麼(它的價值),因此它被用於:

if (allocbuf + ALLOCSIZE - allocp >= n) 

,因爲我無法完全理解這個例子。

+5

它將被轉換爲指向表達式中數組的第一個元素的指針。在C中爲 – MikeCAT

+0

,引用數組名稱將導致數組第一個字節的地址。 – user3629249

+1

在C語言中,要小心執行指針的數學運算,如果指針指向同一個數組,那麼這不是問題,但編譯器會阻塞任何不在同一個數組的指針。 – user3629249

回答

2

引用C11,章§6.3.2.1/ P3,(重點煤礦

除了當它是sizeof操作者的操作數時,操作者_Alignof或 一元&運營商,或是一個用於初始化數組的字符串文字,表達式有 類型''數組類型''被轉換爲類型爲'的表達式'指向類型''那個po整數 到數組對象的初始元素並且不是左值。 [...]

所以,在代碼中,allocbuf,這是一個數組類型,如

if (allocbuf + ALLOCSIZE - allocp >= n) { 

用來將衰減到的指針數組的第一元素時。

1

在這種情況下,數組衰減到指向其存儲位置的指針。換句話說:指向其第一個元素的指針。

可以使用allocbuf(或更好的:&allocbuf[0]哪個更好運「指向第一個元素」的意思)得到的指針第一個元素,並allocp意在指向下一個空閒元素。所以allocp - allocbuf會給你「使用」元素的數量。