知識(shí):)
一.指針 是一種數(shù)據(jù)類型 這種數(shù)據(jù)類型定義出來(lái)的變量可以存儲(chǔ)對(duì)應(yīng)類型變量的內(nèi)存地址通過(guò)這個(gè)地址找到變量的內(nèi)存空間進(jìn)行數(shù)據(jù)修改。定義指針的格式 數(shù)據(jù)類型 *變量名 //數(shù)據(jù)類型:定義這個(gè)指針存儲(chǔ)的是一個(gè)什么類型變量的地址 // * :指針定義時(shí)的標(biāo)記//變量名:指針變量名例如int *pa a;二.注意指針變量在內(nèi)存也有自己的地址1 printf(%d\n, pa);pa是指針變量,存儲(chǔ)的是變量 a 的內(nèi)存地址,輸出一串地址數(shù)字2 printf(%d\n, *pa);*pa ——— 解引用* 是解引用運(yùn)算符*pa去 pa 保存的那個(gè)地址取出地址里面的數(shù) 據(jù)等價(jià)于 a輸出變量 a 的值3 printf(%d\n, pa);取地址運(yùn)算符pa獲取指針變量 pa 本身在內(nèi)存中的地址pa 本身也是一個(gè)變量它 也要占內(nèi)存有自己的地址輸出的是一串地址三.數(shù)組的地址存儲(chǔ)的是數(shù)組內(nèi)存空間的首地址即數(shù)組中第一個(gè)元素的地址。因此取數(shù)組的地址和取數(shù)組中第一個(gè)元素的地址是相同的操作。1 printf(%p\n, arr);2 printf(%d\n, *arr);3 printf(%d\n, *(arr 1));4 printf(%p\n, arr);5 printf(%p\n, arr[0]);表達(dá)式含義類型數(shù)值arr首元素地址int *和arr[0]相同*arr首元素的值intarr[0]*(arr1)第 1 號(hào)元素的值intarr[1]arr整個(gè)數(shù)組的地址int (*)[N]數(shù)值和arr一樣但類型不同arr[0]首元素地址int *和arr相同1 arr數(shù)組名在表達(dá)式中會(huì)隱式轉(zhuǎn)為指向數(shù)組首元素的指針。arr→arr[0]得到首元素的地址是一個(gè)指針值。2 *arr對(duì)首元素地址解引用等價(jià)于arr[0]拿到數(shù)組第 0 個(gè)元素的值。3 *(arr 1)指針運(yùn)算arr1指向數(shù)組下一個(gè)元素*解引用等價(jià)于arr[1]拿到第 1 個(gè)元素的值。arr[i]本質(zhì)就是*(arri)4 arr取整個(gè)數(shù)組的地址。地址的數(shù)值和 arr、arr[0] 一樣但是類型不一樣arr 是 int*arr 是 int (*)[數(shù)組長(zhǎng)度]數(shù)組指針。如果做 arr 1會(huì)跳過(guò)整個(gè)數(shù)組而不是只跳過(guò)一個(gè) int。注意指針和數(shù)組指針的區(qū)別很大普通指針int *p → 指向一個(gè) int 元素?cái)?shù)組指針int (*p)[5] → 指向一整個(gè) int 數(shù)組5 個(gè) int最核心區(qū)別指針加減運(yùn)算指針 1跳過(guò)的字節(jié)數(shù) 指針指向類型的大小int arr[5]; int *p1 arr;int (*p2)[5] arr;p1 1p1指向int1 移動(dòng)sizeof(int)跳到下一個(gè)元素p2 1p2指向整個(gè)長(zhǎng)度 5 的數(shù)組1 移動(dòng)5 * sizeof(int)直接跳過(guò)整個(gè)數(shù)組四.數(shù)組擴(kuò)容int len; len 10; int arr {1,2,3,4,5,6,7,8,9,0}; //擴(kuò)容 len len*2;//擴(kuò)容一倍 int*arr1 (int*)malloc(len*4);//字節(jié)數(shù) for(int i 0;ilen;i){ arr1[i] arr[i]; } arr arr1; //替換地址malloc:malloc 是 C 語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)動(dòng)態(tài)內(nèi)存分配。頭文件#include stdlib.hmalloc(size) 分配 size 字節(jié)內(nèi)容不初始化。