變數的屬性

2021-09-29 16:27:33 字數 2172 閱讀 5353

#變數的屬性

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

直奔主題!

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

1.塊變數

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

語句塊:裡面,像if語句啊,while,for,do啊,它們的大括號內都是屬於語句塊內,單獨的乙個大括號也屬於塊。

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

2.區域性變數

區域性變數:在函式(包括main函式)裡面語句塊外面定義的變數 形參也是區域性變數

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

void

func

(int x)

3.全域性變數

全域性變數:在全域性域中 函式外定義的變數

作用域:整個程式

#incude 

double pi =

3.14

;//全域性變數

intmain()

注意: 在不同的作用域下面可以定義同名的變數,在訪問同名變數時遵循區域性優先原則

區域性優先原則:在搜尋變數時先找塊變數 ,如果沒有塊變數則查詢區域性變數 如果沒有,則查詢全域性變數。

那麼 就有問題了,當區域性變數和全域性變數重名時,我想訪問全域性變數怎麼辦?有三種方法,往下看:

1.在函式中提供語句塊,往其中注入全域性變數

最為便利,建議使用

2.使用函式訪問

int getglobarval (

)

3.提供乙個全域性的指標

type *p =

&glovar_val;

##變數的儲存修飾

1.auto 自動變數

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

2. static 靜態變數

static修飾的區域性變數叫靜態區域性變數;

特點:1.static修飾的區域性變數儲存在全域性資料區(普通的區域性變數儲存在棧區)

2.靜態區域性變數不管函式有沒有被呼叫,它的記憶體都一直存在,不會隨著函式的結束而釋放記憶體,也就是靜態區域性變數直到程式結束才釋放記憶體,且它只會在函式第一次被呼叫時定義一次

static 修飾的全域性變數叫靜態全域性變數

特點:1.static修飾的全域性變數不能被檔案外的程式訪問到,(普通全域性變數可以)。所以它可以達到隱藏全域性變數的目的

static還可以修飾函式

特點:只能在當前檔案中呼叫該函式,其他檔案也可通過#include 檔案頭訪問

3.register 暫存器變數4.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修飾說成全域性變數的,我不是很能理解的,我覺得今天這個要更合理一些,仍有一些迷茫,大佬幫忙指點一下啊。

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

溜溜溜 閃現!!!

變數屬性的總結

變數的屬性有五種 1 名字 必須顯示說明 2 型別 必須顯示說明 3 儲存類別 預設方式或顯示說明 使用 auto register static extren 4 作用域 由儲存類別決定 5 生存期 由儲存類別決定 前兩種不必解釋了,顧名思義。下面詳細區分後三種概念 定義 指系統對變數儲存方式的規...

條件變數屬性 時鐘屬性

條件變數有兩個屬性 程序共享屬性 時鐘屬性。1 程序共享屬性 條件變數與互斥量的共享屬性的用法一樣 int pthread condattr init pthread condattr t attr int pthread condattr destroy pthread condattr t at...

05 變數屬性

注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 14.04 gcc版本 4.8.4 一 c語言的變數屬性 c語言中的變數可以有自己的屬性 在定義變數的時候可以加上 屬性 關鍵字 屬性 關鍵字指明變數的特有意義 語法 property type var name...