1. 程式人生 > >c語言的變數,常量及作用域等

c語言的變數,常量及作用域等

1.const定義常量

在C語言中,const可以用來定義的一個常量,在變數名前加上const即可。

int const a;

定義了一個a的整數常量,且a的值不能被修改。如果要修改a的值,有以下兩種方法。

方法一

int const a=100;

在定義時,就對它進行初始化

方法二

在函式中宣告const的形參在函式呼叫時會得到實參的值。

重點:const涉及指標變數的情況

const int * a;

int * const a;

在第一條語句中,const修飾的時指標a所指向的物件,也就是說我們無法同過指標a來修改其指向的物件的值。但是指標a本身的地址是可以改變的,既可以指向其他物件。

第二條語句中,cosnt修飾的指標a。因此,指標本身(地址)是不可以改變的,而指標所指向的物件的值是可以改變的。

2.define定義常量

define實際是一個預處理指令,其用途遠大於定義常量這一功能。這裡只介紹define定義常量的基本用法。

使用define實際是進行符號替換,方法為

        #define 符號名 替換列表

符號名必須符合識別符號命名規則。替換列表可以是任意字元序列,如數字,字串,表示式等。列如:

#define  MUN “work hard!”/*後面的所有的MUN都會被替換為work hard!*/

#define AUS 99                   /*後面的所有的AUS都會被替換為99!*/

#define DEPP “\a”               /*後面的所有的DEPP都會被替換為“\a”!*/

習慣上,經常用大寫字母來命名符號位,而用小寫字母來命名變數

注意:我們在用#define的時候,千萬記得不要在末尾加“;”,很多初學者些程式碼時習慣在每句程式碼後面加“;”。這裡要小心。

3.作用域

定義:程式中可以訪問一個指示符的一個或多個區域,既變量出現的有效區域,決定了程式的那些部分通過變數名來訪問變數。一個變數根據其作用域的範圍可以分為函式原型作用域,區域性變數和全域性變數。

 1).函式原型作用域,其作用域始於“(”,結束於“)”。

如下列原型宣告:

double Area(double radius);

radius 的作用域盡在於此,不能用於程式正文其它地方,因而可以省略。

2).區域性變數

在函式內部定義的變數稱為區域性變數。區域性變數僅能被定義該變數的模組內部的語句所訪問。換言之,區域性變數在自己的程式碼模組之外時不可見的。

對於區域性變數,要注意的是,它們僅存在於。定義改變數的執行程式碼塊中,即區域性變數在進入模組時生成(壓入堆疊),在退出模組時消亡(彈出堆疊)。定義區域性變數的最長見的程式碼塊時函式,程式碼如下:

/*在函式內聲變數*/
void function1(){
  int x=10;
}
void function2(){
   int x;
   x=20;
}

整數變數x被定義了兩次,一次在function1中,另一次在function2中,function1和function2中的x互不相關,原因是每個x作為區域性變數僅在被定義的模組內可見。

3).全域性變數

與區域性變數不用,全域性變數貫穿整個程式,它的作用域為原始檔,可被原始檔中的任何一個函式使用。他們在整個程式執行期間保持有效。示例程式碼:

#include <stdio.h>
int a,b;//全域性變數
void function1(){
 
}
float x,y;
void function2(){
}
int main(int argc,char * argv[])
{
   return 0;
}

得出結論:上例中定義了a,b,x,y都是在函式外部定義的外部變數,都是全域性變數。x,y是在function1之後,在function1內沒有對x,y宣告,所以他們在function1中無效,a,b定義在源程式最前面,因此在function1,function2,main內不加宣告就可以使用。

     對於全部變數有以下幾點需要說明。

(1)對於區域性變數的定義和宣告,可以不加區分,而對於全域性變數則不然。全域性變數的定義和全域性變數的宣告並不是一回事,全域性變數定義必須在所在的函式之外,且只能定義一次,其一般形式為

[extern] 型別說明符 變數名,變數名.....

其中extern可以省去不寫,例如:

int a,b;等效於extern int a,b;

而全域性變數宣告出現在要使用改變數的各個函式內。在整個程式內,可能出現多次。全域性變數在定義時就已經分配了記憶體單元,並且可做初始賦值。全域性變數宣告不能在賦予初值,只是表明在函式內要使用某外部變數。

(2)外部變數可加強函式模組之間的資料聯絡,但是又使函式要依賴這些變數,因而使得函式的獨立性降低。從模組化程式設計的觀點來看這是不利的,因此在不必要時儘量不要使用全域性變數。

(3)全域性變數的記憶體分配是在編譯過程中完成的,它在程式的全部執行過程中都要佔用儲存空間,而不是僅在需要時才開闢儲存空間。

(4)在同一原始檔中,允許全域性變數和區域性變數同名。在區域性變數的作用域內,全域性變數不起作用。因此,若在改函式中想要使用全域性變數,則不能在定義一個同名的區域性變數。

(5)全域性變數的作用域可以通過關鍵字extern擴充套件到整個檔案或其他檔案。