C8節 作用域,生命週期,指標

2021-10-18 16:20:40 字數 4147 閱讀 5946

變數的作用域是變數名可以被使用的所有**範圍

全域性變數的作用域是所有語句,它們被宣告在所有函式外邊

沒有初始化的全域性變數自動被初始化成0

區域性變數的作用域是它所屬的函式內部所有語句。

塊變數是宣告在語句塊中的變數,它們的作用域是語句塊內的所有語句

/*

作用域練習

*/#include int num; //全域性變數

void func()

int main()

printf("num3是%d\n", num3);

//printf("num4是%d\n", num4); 不在作用域

}//printf("num3是%d\n", num3); 不在作用域

//printf("num4是%d\n", num4); 不在作用域

return 0;

}

變數的生命週期指變數可以被使用的時間範圍

全域性變數在整個程式執行期間有效

區域性變數只在函式執行期間有效

塊變數只在語句塊執行期間有效

普通區域性變數都是auto型別的,它們的生命週期是函式執行期間

static型別的區域性變數叫做靜態區域性變數,它們的生命週期是整個程式執行期間。

沒有初始化的區域性變數會自動被初始化成0

靜態區域性變數的初始化語句只在程式開始時執行一次

/*

生命週期練習

*/#include int f1()

int f2()

int main()

思考題:

省略所有函式的陣列引數作為前提

1.圈叉棋中的二維陣列可不可以使用全域性變數代替

2.可不可以使用靜態區域性變數代替

指標變數是用來儲存位址資料的

指標變數其中包括多種型別,分別對應不同**的位址資料

指標變數使用如下方法宣告

int *p_num;

null叫做空位址,任何指標中的位址資料一旦失效則應該立刻被清成空位址

null就是數字0

記錄無效位址的指標叫做野指標。

/*

指標練習

*/#include int main()

多個同型別的指標變數可以宣告在一條語句中,必須在每個指標變數名前加*

練習:1.只使用指標變數交換兩個整數變數中的數值

/*

指標練習

*/#include int main()

所有指標變數的大小都是4個位元組,和int型別一樣

所有指標型別以及int型別之間可以任意轉換。

在轉換過程中資料本身不會變化,變化的是資料的使用方式和使用結果。

/*

指標型別轉換練習

*/#include int main()

/*

指標強制型別轉換練習

*/#include int main()

/*

void*指標練習

*/#include int main()

指標變數可以當做函式的形式引數使用

函式中對指標形參本身所做的修改不會保留,但是對指標變數對應的普通變數所做的修改會保留。

指標變數做形參也可以實現資料的雙向傳遞(是通過指標對應的普通變數實現的)

/*

指標變數做形參的練習

*/#include void neg(int *, int);

void neg(int *p_num, int size)

}int main() , loop = 0;

neg(num, 3);

for (loop = 0;loop <= 3;loop++)

printf("\n");

return 0;

}

練習:

1。編寫函式交換兩個變數中的內容

void*指標變數做形參可以傳遞多種不同型別的資料。

練習:2.編寫函式以合適的方式列印char,int和float型別變數

/*

交換變數內容的練習

*/#include void swap(int *p_num, int *p_num1)

int main()

/*

void*指標做形參練習

*/#include void print(void *p, int type)

else if (type == 1)

else

}int main()

指標變數可以作為函式的返回值使用。可以通過指標型別的返回值得到乙個變數而不僅僅是資料。

區域性變數的位址不可以作為函式的返回值來使用

/*

指標變數做返回值的練習

*/#include int *min(int *p, int size)

}return p_ret;

}int main() ;

int *p_num = min(num, 5);

printf("p_num是%p,&num[4]是%p\n", p_num, &num[4]);

return 0;

}

/*

區域性變數位址作為返回值練習

*/#include int *func()

int *func1()

int main()

指標變數支援如下的四則計算:

指標 + 整數, 指標 - 整數,指標 - 指標

它們的計算結果不是數學結果,結果與指標的型別有關

/*

指標數學計算練習

*/#include int main() ;

int *p_num = num, *p_num1 = &num[4];

printf("p_num是%p\n", p_num);

printf("p_num1是%p\n", p_num1);

printf("p_num + 3是%p\n", p_num + 3);

printf("p_num1 - 2是%p\n", p_num1 - 2);

printf("p_num1 - p_num是%d\n", p_num1 - p_num);

return 0;

}

陣列名稱和指標的區別

1.陣列名稱不可以被修改(陣列名稱是臨時計算得到的)

2.進行sizeof計算的結果不同

3.進行&操作的結果不同

/*

指標和陣列的關係練習

*/#include int main() ;

int *p_num = num;

printf("num + 2是%p,p_num + 2是%p\n", num + 2, p_num + 2);

printf("num[2]是%d,p_num[2]是%d\n", num[2], p_num[2]);

//num = null; 不可以被修改

printf("sizeof(num)是%d,sizeof(p_num)是%d\n", sizeof(num), sizeof(p_num));

printf("num是%p,&num是%p\n", num, &num);

printf("num + 1是%p,&num + 1是%p\n", num + 1, &num + 1);

printf("p_num是%p,&p_num是%p\n", p_num, &p_num);

for (p_num = num;p_num <= num + 4;p_num++)

printf("\n");

return 0;

}

答案:

1.用遞迴函式計算兩個數字的最大公約數

/*

最大公約數練習

*/#include int max(int num, int num1)

else

}int main()

作用域 生命週期

作用域 能夠被使用的範圍 生命週期 生命的誕生和死亡 在類裡頭,先使用變數,後期到main裡幫助建立生命 在main裡頭作用域的範圍小於等於生命週期的範圍,在使用作用域之前已經預設存在生命週期了 作用域是不考慮生命週期的,因為作用域的線路比執行時候來的條數廣 作用域是製造多條線路,生命週期是執行一條...

作用域與生命週期

作用域與生命週期是描述了常量,變數,函式的等物件的使用範圍,當程式 中這些物件一旦超過了這個範圍,那麼將出現編譯錯誤。下面我們來研究一下它 區域性作用域描述的是函式體中變數和函式的適用範圍,每乙個函式都有自己的區域性作用域。在函式體中定義的變數,函式對於外部函式是不可見的看,因為他們在函式的區域性作...

作用域與生命週期

在c 語言中名字有作用域,物件 變數 有生命週期。如果不理解這兩個概念那麼我們一般會犯很多低階的錯誤。比如返回區域性物件的引用等。include using namespace std return local array int func1 return a return local object...