#變量的屬性
今天講這個變量的屬性,實際也就是變量的分類,但自己感覺吧,不是特别的完整,但學到的也就這些吧,歡迎大佬補充。
直奔主題!
首先先認識一下變量從定義的位置來分:
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修飾說成全局變量的,我不是很能了解的,我覺得今天這個要更合理一些,仍有一些迷茫,大佬幫忙指點一下啊。
上一期的查找算法,可以用遞歸寫了,下次寫查找算法補上,估計就下個周
溜溜溜 閃現!!!