作者:楊碩,華清遠見嵌入式學(xué)院講師。
C語言為我們定義了四種基本數(shù)據(jù)類型:整型,浮點型,指針以及聚合類型(數(shù)組和結(jié)構(gòu)體等),在此基礎(chǔ)上,我們就可以聲明變量。我們平時經(jīng)常說定義一個某種類型的變量,其實這樣說不確切,應(yīng)該說是聲明變量。
變量聲明的基本形式是:
說明符(一個或多個) 聲明表達式列表
比如說:int a, b, c, d;
C語言中對指針的聲明比較有代表性,我們來看一下:
比如聲明一個指向int型的指針a:int *a;
這個語句表示表達式*a產(chǎn)生的結(jié)果類型是int,而我們又知道*操作符執(zhí)行的是間接訪問操作,所以可以推斷a肯定是一個指向int的指針。
C語言在本質(zhì)上是一種自由形式的語言,它給了程序員很大的空間,我們同樣可以這樣寫:int* a,這個聲明與int *a時一個意思,而且似乎更為清楚,a被聲明為類型為int*的指針(實則不然),這會誘導(dǎo)我們這樣聲明三個指向int型的指針:
int* a, b, c;
也許你會很自然的以為這條語句把三個變量a、b、c都聲明為指向整型的指針,但是事實上我們被它的形式愚弄了,星號實際上是表達式*a的一部分,只對這個標識符有用,a是一個指針,但是b和c都只是普通的整型而已,要聲明三指針,這樣寫是可以的:
int *a, *b, *c;
從這個簡單的例子我們可以看出C語言的聲明規(guī)則多么具有迷惑性,呵呵,這也是C語言飽受批*的地方之一,但這決定與語言本身的設(shè)計哲學(xué),我們無法改變,要想用好C語言,我們必須掌握它的語法規(guī)則。
我們再看一個例子:
int fun();
我們都知道它把f聲明為一個函數(shù),它的返回值是一個整數(shù)。
int *fun();
要想推斷出它的含義,我們必須知道*fun()是如何求值的。首先執(zhí)行的是函數(shù)調(diào)用操作符(),因為它的優(yōu)先級高于間接訪問操作符*,所以fun是一個函數(shù),它的返回值類型是一個指向整型的指針。
再看一個更為有趣的聲明:
int (*fun)();
這個聲明有兩對括號,每對括號的含義不同。第二對括號是函數(shù)調(diào)用操作符,但是第一對只起到聚組的作用。它導(dǎo)致間接訪問在函數(shù)調(diào)用之前進行,使fun是一個函數(shù)指針,它所指向的函數(shù)返回一個整型值。
那么現(xiàn)在這個聲明應(yīng)該很容易分析出來了
int *(*fun)();
fun還是一個函數(shù)指針,只是所指向的函數(shù)返回的是一個整型指針。
先寫到這里,對C語言的聲明之旅才剛剛開始,下回我們將在中級篇里討論更有趣的話題!
“本文由華清遠見http://www.embedu.org/index.htm提供”
來源:華清遠見0次