變數的作用域是變數名可以被使用的所有**範圍
全域性變數的作用域是所有語句,它們被宣告在所有函式外邊
沒有初始化的全域性變數自動被初始化成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...