almost 4 years ago

本文為筆者閱讀透視C語言指標這本書中有關於陣列與指標章節後的小小整理

陣列與指標

指標能夠與現有的陣列一同使用,或是從stack中配置記憶體,再將配置的記憶體視為陣列使用,但要注意的是兩者並非完全相同

int vector[5] = {1,2,3,4,5};

int *ptr = vector;

pv是指向陣列中 "第一個元素的address" ,並非陣列本身!

透過以下方法,所取得的也是第一個元素的address

printf("%p\n", vector);

printf("%p\n, &vector[0]);

那麼,如果直接使用&vector,又代表什麼?

這種方式所代表的意義是 "指向整個陣列的指標",另外兩個代表的是"指向整數的指標"

int vector[5] = {1,2,3,4,5};  
printf("%p\n", vector);  //point to the element
printf("%p\n", &vector[0]); //point to the element
printf("%p\n", &vector); //point to the array

陣列與指標的差異

考慮以下的case

int vector[5] = {1,2,3,4,5};

int *ptr = vector;

  1. 產生的機器碼不同

    透過 vector[i]vector+i 所產生的機器碼並不相同,但結果一致

  2. sizeof對陣列與指向陣列的指標的運算結果不相同

    sizeof(vector) = 20; //4 * 5 = 20  
    sizeof(ptr) = 4; //一個指標的大小  
    
  3. 指標ptr是lvalue,表示能夠被賦值,而vector並不是,所以無法修改其數值。換句話說,由os指派給陣列的位址無法改變,而指標能夠透過指派的方式指向記憶體中不同的位置

Reference

透視C語言指標 P.85~87

← Docker SSH service Javascript 物件導向 →
 
comments powered by Disqus