筆記 04 指針)
00 包目前CLion的最新版本還不支持中文需要導(dǎo)入#include stdlib.h 再在main函數(shù)內(nèi)寫system(chcp 65001);才能在代碼中用中文stdlib 還可以提供動(dòng)態(tài)內(nèi)存分布——malloc函數(shù)01 使用原因?qū)τ诤瘮?shù)在函數(shù)外定義的變量函數(shù)內(nèi)進(jìn)行的運(yùn)算不會(huì)影響函數(shù)外變量大小定義 int bn; b 改變時(shí)n不會(huì)改變?yōu)榱俗尭淖兺瑫r(shí)發(fā)生我們需要指針02 定義格式指針: 也是一種定義變量的方式指針變量被用來存儲(chǔ)另一個(gè)變量的地址通過地址來操作數(shù)據(jù)格式 你要存儲(chǔ)的變量地址的類型 *指針變量名;//取地址變量名//int m 10; 定義了一個(gè)整數(shù)型指針 它可以存儲(chǔ)一個(gè)整數(shù)型變量的內(nèi)存地址int *pm m;03 語法01 改變值指針操作 如何通過指針變量操作它存儲(chǔ)的地址中的數(shù)據(jù) *指針變量 值; *a; 錯(cuò)誤 *a*a1; 正確 定義指針變量 int *pmm; 函數(shù)void add(int *a){ *a*a1;} int n0; add(n); 02 不同的輸出結(jié)果輸出變量名輸出*指針變量名變量值輸出變量名輸出指針變量名指針變量數(shù)據(jù)存儲(chǔ)的地址編碼變量內(nèi)存地址04 與數(shù)組結(jié)合01 相關(guān)知識(shí)**計(jì)算機(jī)操作的基本單位是byte**數(shù)組的儲(chǔ)存地址是連續(xù)的間隔由變量單位大小決定如int間隔4char間隔1輸出 *數(shù)組變量名數(shù)組第0號(hào)變量值 輸出 *數(shù)組變量名i數(shù)組第i號(hào)變量值輸出 數(shù)組變量名輸出 數(shù)組變量名 輸出數(shù)組變量名[0]數(shù)組第一個(gè)變量的儲(chǔ)存地址數(shù)組變量名 也相當(dāng)于一個(gè)指針因此通用一些操作C語言的函數(shù) 不支持直接返回?cái)?shù)組 int[] test(){}不合法解決方法 可以使用指針來存儲(chǔ)數(shù)組的地址 進(jìn)行返回返回值為指針時(shí)寫 int* 02 試錯(cuò)int* createArray(int n) { //創(chuàng)建函數(shù)返回值為int指針參數(shù)為一個(gè)int變量 int arr[n]{0,10,20}; //創(chuàng)建數(shù)組arr // for(int i0;i10;i) { // printf(%d\n,arr[i]); // } return arr; //返回值為指針int* arr } int main() { int* parrcreateArray(10); //創(chuàng)建指針 int*parr數(shù)組存儲(chǔ)地址 for(int i0;i10;i) { printf(%d\n,parr[i]);//輸出數(shù)組存儲(chǔ)的數(shù)據(jù) } }結(jié)果無論是本代碼還是輸出*parr都會(huì)導(dǎo)致崩潰注釋化的輸出數(shù)組元素仍然可以正常運(yùn)行可以CLion和DEV C一起用找錯(cuò)原因是變量的生命周期有界性定義一個(gè)變量之后 它在什么時(shí)候會(huì)消失 在該變量定義的大括號(hào)范圍之外就不能使用了arr是函數(shù)內(nèi)定義的變量函數(shù)外無法調(diào)用03 解決方式 動(dòng)態(tài)數(shù)組使用內(nèi)存分配函數(shù)相當(dāng)于在內(nèi)存中分配一塊空間用于儲(chǔ)存數(shù)據(jù)不會(huì)因有界性而失效格式數(shù)據(jù)類型 *數(shù)組名(數(shù)據(jù)類型*)malloc(內(nèi)存大小);注意內(nèi)存單位為byte因此對(duì)不同類型的數(shù)據(jù)需要分配不同大小的內(nèi)存例如 int n; malloc(n*4);int* createArray(int n) { int *arr (int*) malloc(n*4); // arr 是一個(gè)指針存儲(chǔ)的是一整塊內(nèi)存空間的首地址 指針相當(dāng)于數(shù)組 // 使用內(nèi)存分配函數(shù)分配一塊內(nèi)存(長n*4)給一個(gè)指針充當(dāng)一個(gè)數(shù)組 for (int i0;i5;i) { *(arri)i*5; //進(jìn)行了初始化非必要 } //arr[i]i*5; 也可數(shù)組指針通用操作 return arr; } int main() { int* parrcreateArray(10); //把創(chuàng)建的指針*arr的地址賦值給*parr for(int i0;i10;i) { //指針數(shù)組通用操作 printf(%d\n,parr[i]); //*(parri)也可 } }04 擴(kuò)展 字符串字符串也是一種數(shù)組因此支持通用操作char name[10];scanf(%s,name[0]);scanf(%s,name);scanf(%s,name); //三者作用相同char *cp (char*) malloc(10);scanf(%s,cp); //與指針結(jié)合