指針的高階用法——指針的算術運算


指針是一個用數值表示的地址。因此,您可以對指針執行算術運算。可以對指針進行四種算術運算:++、--、+、-。

假設 ptr 是一個指向地址 1000 的整型指針,是一個 32 位的整數,讓我們對該指針執行下列的算術運算:

ptr++;

在執行完上述的運算之后,ptr 將指向位置 1004。這個運算會在不影響內存位置中實際值的情況下,移動指針到下一個內存位置。而這個移動的位置大小根據數據類型的大小決定。同樣,如果 ptr 指向一個地址為 1000 的字符,上面的運算會導致指針指向位置 1001,因為下一個字符位置是在 1001。

遞增一個指針

數組可以看成一個常量指針,因為數組名本身就是一個指針,但是數組不能遞增,遞增的話回到另一個內存儲存的變量,而不是訪問數組的下一個元素。故而我們使用更為方便的變量指針來代替數組。
下面的程序遞增變量指針,以便順序訪問數組中的每一個元素:

#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;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

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

遞減一個指針

同樣地,對指針進行遞減運算,即把值減去其數據類型的字節數,如下所示:

#include <stdio.h>

const int MAX = 3;

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

   /* 指針中最后一個元素的地址 */
   ptr = &var[MAX-1];
   for ( i = MAX; i > 0; i--)
   {

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

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

當上面的代碼被編譯和執行時,它會產生下列結果:

存儲地址:var[2] = 518a0ae4
存儲值:var[2] = 200
存儲地址:var[1] = 518a0ae0
存儲值:var[1] = 100
存儲地址:var[0] = 518a0adc
存儲值:var[0] = 10

指針的比較

指針可以用關系運算符進行比較,如 ==、< 和 >。如果 p1 和 p2 指向兩個相關的變量,比如同一個數組中的不同元素,則可對 p1 和 p2 進行大小比較。
下面的程序修改了上面的實例,只要變量指針所指向的地址小於或等於數組的最后一個元素的地址 &var[MAX - 1],則把變量指針進行遞增:

#include <stdio.h>

const int MAX = 3;

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

   /* 指針中第一個元素的地址 */
   ptr = var;
   i = 0;
   while ( ptr <= &var[MAX - 1] )
   {

      printf("Address of var[%d] = %x\n", i, ptr );
      printf("Value of var[%d] = %d\n", i, *ptr );

      /* 指向上一個位置 */
      ptr++;
      i++;
   }
   return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Address of var[0] = bfdbcb20
Value of var[0] = 10
Address of var[1] = bfdbcb24
Value of var[1] = 100
Address of var[2] = bfdbcb28
Value of var[2] = 200


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM