1. 程式人生 > >C語言指標——對普通變數的指標操作和對陣列(常量)的指標操作

C語言指標——對普通變數的指標操作和對陣列(常量)的指標操作

       我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。

       我們喜歡在程式中使用指標代替陣列,因為變數指標可以遞增,而陣列不能遞增,因為陣列是一個常量指標。下面的程式遞增變數指標,以便順序訪問陣列中的每一個元素:

#include <stdio.h>

const int MAX = 3;

int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* 指標中的陣列地址 */
   ptr = var;
   for ( i = 0; i < MAX; i++)
   {

      printf("儲存地址:var[%d] = %x\n", i, ptr );
      printf("儲存值:var[%d] = %d\n", i, *ptr );

      /* 移動到下一個位置 */
      ptr++;
   }
   return 0;
}

我們可以看到指標中的陣列地址是  ptr = var  這種形式來賦值的。

輸出結果為:

儲存地址:var[0] = bf882b30
儲存值:var[0] = 10
儲存地址:of var[1] = bf882b34
儲存值: var[1] = 100
儲存地址:of var[2] = bf882b38
儲存值:var[2] = 200

而普通情況下在指標中儲存變數地址時,則是ptr = &var形式   含有  &取記憶體地址符號。 

如下面這個例子,

#include <stdio.h>
 
int main ()
{
   int  var = 20;   /* 實際變數的宣告 */
   int  *ip;        /* 指標變數的宣告 */
 
   ip = &var;  /* 在指標變數中儲存 var 的地址 */
 
   printf("Address of var variable: %p\n", &var  );
 
   /* 在指標變數中儲存的地址 */
   printf("Address stored in ip variable: %p\n", ip );
 
   /* 使用指標訪問值 */
   printf("Value of *ip variable: %d\n", *ip );
 
   return 0;
}

 編譯連結執行上邊的程式,我們能得到一下結果:

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

        我們能看到兩種情況下的不同,有無&運算子。現在並不知道為什麼,暫且mark,希望儘快弄懂這為什麼會這樣子。