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