天天看點

變量的屬性

#變量的屬性

今天講這個變量的屬性,實際也就是變量的分類,但自己感覺吧,不是特别的完整,但學到的也就這些吧,歡迎大佬補充。

直奔主題!

首先先認識一下變量從定義的位置來分:

1.塊變量

塊變量:在語句塊中定義的變量,也隻能在語句塊中使用。

語句塊:{ }裡面,像if語句啊,while,for,do啊,它們的大括号内都是屬于語句塊内,單獨的一個大括号也屬于塊。

作用域:從定義到語句塊結束

{
	int m = 0;  //塊變量
}
           

2.局部變量

局部變量:在函數(包括main函數)裡面語句塊外面定義的變量 形參也是局部變量

作用域:從定義開始到本函數執行結束

void func(int x) { 			// x 局部變量
	double y =  3.14;       // y 局部變量
}
           

3.全局變量

全局變量:在全局域中 函數外定義的變量

作用域:整個程式

#incude <stdio.h>
double PI = 3.14;  //全局變量
int main() {
...
}
           

注意: 在不同的作用域下面可以定義同名的變量,在通路同名變量時遵循局部優先原則

局部優先原則:在搜尋變量時先找塊變量 ,如果沒有塊變量則查找局部變量 如果沒有,則查找全局變量。

那麼 就有問題了,當局部變量和全局變量重名時,我想通路全局變量怎麼辦?有三種方法,往下看:

1.在函數中提供語句塊,往其中注入全局變量

{
	extern int value = globar_val;
}
           

最為便利,建議使用

2.使用函數通路

int getGlobarVal (){
	return value;
}
           

3.提供一個全局的指針

##變量的存儲修飾

1.auto 自動變量

預設就是自動變量 一般都省略了

2. static 靜态變量

static修飾的局部變量叫靜态局部變量;

特點:

1.static修飾的局部變量存儲在全局資料區(普通的局部變量存儲在棧區)

2.靜态局部變量不管函數有沒有被調用,它的記憶體都一直存在,不會随着函數的結束而釋放記憶體,也就是靜态局部變量直到程式結束才釋放記憶體,且它隻會在函數第一次被調用時定義一次

static 修飾的全局變量叫靜态全局變量

特點:

1.static修飾的全局變量不能被檔案外的程式通路到,(普通全局變量可以)。是以它可以達到隐藏全局變量的目的

static還可以修飾函數

特點:

隻能在目前檔案中調用該函數,其他檔案也可通過#include 檔案頭通路

3.register 寄存器變量

申請把變量作為寄存器變量存儲

注意:

1.隻是一種請求 會被拒絕

2.不能通路寄存器變量的位址

3.寄存器變量隻能是4個位元組

4.volatile 易變變量

特點:拒絕效率優化,每次讀取volatile變量時都會去記憶體中重新加載一遍,以確定正确的結果

多用于多線程,中斷程式中,為了防止變量發生意想不到的變化,是以每次使用都重新去讀取一遍

5.const 隻讀變量

const 修飾的局部變量儲存在棧區 可以用指針修改

const 修飾的全局變量儲存在代碼區 不能修改

const int num = 10; 和 10 沒啥差別的

直接修改 編譯報錯 通過指針修改 導緻 段錯誤 核心已轉儲

const 修飾指針

const char * s 它表示 *s 隻讀 也就是 不能修改 s位址 指向的資料

等同于 char const *s

char *const s 它表示 s 隻讀 不能修改s儲存的位址值

const char *const s 它表示 *s 和 s 都是隻讀内容 都不可修改

6.extern 外部的

1.局部變量和全局變量重名時 ,往語句塊中注入全局變量

2.聲明變量和函數 表示它在其他檔案中定義過

就這麼多吧,在其他地方有把自動變量說成局部變量的,extern修飾說成全局變量的,我不是很能了解的,我覺得今天這個要更合理一些,仍有一些迷茫,大佬幫忙指點一下啊。

上一期的查找算法,可以用遞歸寫了,下次寫查找算法補上,估計就下個周

溜溜溜 閃現!!!

繼續閱讀