存儲空間的別名,訪問這塊空間 比指針更安全
使用指針也可以訪問存儲空間 在變量名無法使用的場合
局部參數傳遞 動態分配內存
指針也是一個變量 有自己的存儲空間
指針也會有指針 -> 指針的本質:保存內存地址的變量 使用指針都是間接訪問: 指針訪問的內存地址,通過內存地址間接訪問空間
使用指針賦值和變量賦值的區別
{ int n = 10; //直接訪問 int *pn = &n; //間接訪問 n = 100; *pn = 1000; return 0;}轉到反匯編012616A5 mov dWord ptr [ebp-4],eax int n = 10; //直接訪問 012616A8 mov dword ptr [n],0Ah int *pn = &n; //間接訪問012616AF lea eax,[n] 012616B2 mov dword ptr [pn],eax n = 100;012616B5 mov dword ptr [n],64h //一步到位,直接賦值 *pn = 1000;012616BC mov eax,dword ptr [pn] // 先取值到eax,尋址012616BF mov dword ptr [eax],3E8h //再進行賦值 return 0;012616C5 xor eax,eax使用變量的效率比使用指針的效率高
使用指針的場合
在函數中改變變量的值
void foo(int *n){ *n = 100;}
指針和const結合
int main(){ //const 在*左邊 指針指向的數據 為常量 //const 在*右邊 指針本身 為常量 const int *p; int const *p1; int *const p2; const int *const p3; const int const *const p4; int n = 10; int n2 = 100; p = &n2; //指針本身能改// *p = 100; //指向的數據不能改 // p2 = &n2; //指針本身不能改 *p2 = 1000; //指向的數據能改 return 0;}指針和數組
//數組:相同變量名的一種集合 屬于直接訪問int main(){ int array[10] = { 1,2,3,4,5 };//編譯器分配一段內存空間 int *parray = array; //array-> 數組的首地址 array[0](同時也是數組的地址) //大部分情況下 數組名=常量指針 //使用指針訪問數組 PRintf("%d/r/n", *parray); printf("%d/r/n", *parray + 1); printf("%d/r/n", *parray + 2); printf("%d/r/n", *parray + 3); // 以下兩種場合 // sizeof 運算 指針得到的是指針的大小 數組得到的是數組的大小 // 做&運算 int *paddrarray = &array; //加&代表取當前數組地址 printf("%d/r/n", parray+1,paddrarray+1); printf("%d/r/n", array + 1, &array + 1);//運算的規則不同 // array+sizeof(*array) // *array+sizeof(*&array) return 0;}
新聞熱點
疑難解答