第十八課(一)、 C指針(深入)



第十八課、 C指針(深入)

18.1、指針的算術運算

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

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

ptr++

在執行完上述的運算之後,ptr 將指向位置 1004,因爲 ptr 每增加一次,它都將指向下一個整數位置,即當前位置往後移 4 個字節。這個運算會在不影響內存位置中實際值的情況下,移動指針到下一個內存位置。如果 ptr 指向一個地址爲 1000 的字符,上面的運算會導致指針指向位置 1001,因爲下一個字符位置是在 1001


18.1.1、遞增一個指針

在程序中使用指針代替數組,因爲變量指針可以遞增,而數組名不能遞增,因爲數組名是一個常量指針。下面的程序遞增變量指針,以便順序訪問數組中的每一個元素:

#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

存儲地址:of var[1] = bf882b34

存儲值: var[1] = 100

存儲地址:of var[2] = bf882b38

存儲值:var[2] = 200


18.1.2、遞減一個指針

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

#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


18.1.3、指針的比較

指針可以用關係運算符進行比較,如 ==< >。如果 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


18.2、指針數組


18.2.1、普通數組:

用到了一個由 3 個整數組成的數組

Eg

#include <stdio.h>

const int MAX = 3;

int main ()

{

int var[] = {10, 100, 200};

int i;

for (i = 0; i < MAX; i++)

{

printf("Value ofvar[%d] = %d\n", i, var[i] );

}

return 0;

}

結果:

Value of var[0] = 10

Value of var[1] = 100

Value of var[2] = 200


18.2.2、指針數組

讓數組存儲指向 int char 或其他數據類型的指針。下面是一個指向整數的指針數組的聲明:

int * ptr[MAX];

在這裏,把 ptr 聲明爲一個數組,由 MAX 個整數指針組成。因此,ptr 中的每個元素,都是一個指向 int 值的指針。下面的實例用到了三個整數,它們將存儲在一個指針數組中,如下所示:

#include <stdio.h>

 

const int MAX = 3;

 

int main ()

{

   int  var[] = {10, 100, 200};

   int i, *ptr[MAX];

 

   for ( i = 0; i < MAX; i++)

   {

     ptr[i] = &var[i]; /* 賦值爲整數的地址 */

   }

   for ( i = 0; i < MAX; i++)

   {

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

   }

   return 0;

}

結果:

Value of var[0] = 10

Value of var[1] = 100

Value of var[2] = 200

可以用一個指向字符的指針數組來存儲一個字符串列表,如下:

Eg

#include <stdio.h>

const int MAX = 4;

int main ()

{

char *names[] = { "Zara Ali", "Hina Ali", "Nuha Ali", "Sara Ali", };

int i = 0;

for ( i = 0; i < MAX; i++)

{

printf("Value ofnames[%d] = %s\n", i, names[i] );

}

return 0;

}

結果:

Value of names[0] = Zara Ali

Value of names[1] = Hina Ali

Value of names[2] = Nuha Ali

Value of names[3] = Sara Ali

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章