一級指標和二級指標的理解和總結
阿新 • • 發佈:2021-01-29
技術標籤:C語言
一級指標
對於一級指標來講, 我們再熟悉不過的應用就是修改實參的值
注意下方應用:
#include <stdio.h> void changeValue(int* value); int main() { int num = 2018; changeValue(&num); printf("%d\n", num); return 0; } void changeValue(int* value) { *value = 2019; }
效果圖
從以上的例項可以看出, 我們可以通過指標來修改實參的值, 這裡涉及到了一個實參和形參的概念, 我們進一步探討
所謂的實參, 即傳遞給呼叫函式的引數, 在記憶體中佔有指定的空間; 而形參是實參的一份拷貝, 函式呼叫開始為形參分配指定空間, 函式呼叫結束後該形參就被釋放. 因此, 函式呼叫發生的實參向形參的資料傳遞是單向的
我們可以這樣理解, 如果實參是以變數本身向形參傳遞資料, 則函式呼叫過程中, 形參是實參的一份拷貝, 臨時分配的記憶體與實參不一樣, 實參不隨形參的改變而改變; 如果實參是以地址(即指標)的形式向形參傳遞資料, 則呼叫函式過程中, 形參的記憶體地址就是實參的記憶體地址, 實參就會隨形參的改變而改變.
總而言之, 運用函式對資料的更新, 是基於資料的地址傳遞, 對資料的地址進行操作而言的
二級指標
對於二級指標, 我們不妨看一下下面這個例子:
#include <stdio.h> void changeAddress(int** value); int main() { int arr[] = {1, 2, 3}; int* p = arr; // 改變之前 p 的地址 printf("%p\n", p); // q 用來儲存改變之前 p 的地址 int* q = p; changeAddress(&p); // 改變之後 p 的地址 printf("%p\n", p); // 地址改變的差值 printf("%lu\n", p - q); return 0; } void changeAddress(int** value) { *value += sizeof(int); }
效果圖
仔細一看, 這個例子是不是與一級指標的例子大同小異呢
沒錯, 如果說一級指標是用於對資料的更新, 那麼二級指標就是用於對資料地址的更新. 以此類推, 三級指標就是對資料地址的地址的更新…