1. 程式人生 > 其它 >一級指標和二級指標的理解和總結

一級指標和二級指標的理解和總結

技術標籤: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);    
}    

效果圖
在這裡插入圖片描述
仔細一看, 這個例子是不是與一級指標的例子大同小異呢

沒錯, 如果說一級指標是用於對資料的更新, 那麼二級指標就是用於對資料地址的更新. 以此類推, 三級指標就是對資料地址的地址的更新…