1. 程式人生 > >C語言第5課——指標

C語言第5課——指標

每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。請看下面的例項,它將輸出定義的變數地址:

#include <stdio.h>
 
int main ()
{
   int  var1;
   char var2[10];
 
   printf("var1 變數的地址: %p\n", &var1  );
   printf("var2 變數的地址: %p\n", &var2  );
 
   return 0;
}

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

debug模式:

var1 變數的地址: 0x7fff5cc109d4
var2 變數的地址: 0x7fff5cc109de

release模式:

var1 變數的地址: 0x7fff5cc109d4
var2 變數的地址: 0x7fff5cc109d0

什麼是指標?

指標是一個變數,其值為另一個變數的地址,即,記憶體位置的直接地址。就像其他變數或常量一樣,您必須在使用指標儲存其他變數地址之前,對其進行宣告。指標變數宣告的一般形式為:

type *var-name;

在這裡,type 是指標的基型別,它必須是一個有效的 C 資料型別,var-name 是指標變數的名稱。用來宣告指標的星號 * 與乘法中使用的星號是相同的。但是,在這個語句中,星號是用來指定一個變數是指標。以下是有效的指標宣告:

int    *ip;    /* 一個整型的指標 */
double *dp;    /* 一個 double 型的指標 */
float  *fp;    /* 一個浮點型的指標 */
char   *ch;     /* 一個字元型的指標 */

所有指標的值的實際資料型別,不管是整型、浮點型、字元型,還是其他的資料型別,都是一樣的,都是一個代表記憶體地址的長的十六進位制數。不同資料型別的指標之間唯一的不同是,指標所指向的變數或常量的資料型別不同。

遞增一個指標

在程式中使用指標代替陣列,因為變數指標可以遞增,而陣列不能遞增,因為陣列是一個常量指標。

ptr++

假設 ptr

 是一個指向地址 1000 的整型指標,是一個 32 位的整數,在執行完上述的運算之後,ptr 將指向位置 1004,因為 ptr 每增加一次,它都將指向下一個整數位置,即當前位置往後移 4 個位元組。

遞減一個指標

同樣地,對指標進行遞減運算,即把值減去其資料型別的位元組數。

ptr--

指標的比較

指標可以用關係運算符進行比較,如 ==、< 和 >。如果 p1 和 p2 指向兩個相關的變數,比如同一個數組中的不同元素,則可對 p1 和 p2 進行大小比較。

 

指標陣列

可以用一個指向字元的指標陣列來儲存一個字串列表

#include <stdio.h>
 
const int MAX = 4;
 
int main ()
{
   const char *names[] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };
   int i = 0;
 
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of names[%d] = %s\n", i, names[i] );
   }
   return 0;
}

指向指標的指標

指向指標的指標是一種多級間接定址的形式,或者說是一個指標鏈。通常,一個指標包含一個變數的地址。當我們定義一個指向指標的指標時,第一個指標包含了第二個指標的地址,第二個指標指向包含實際值的位置。

C 中指向指標的指標

一個指向指標的指標變數必須如下宣告,即在變數名前放置兩個星號。例如,下面聲明瞭一個指向 int 型別指標的指標:

int **var

當一個目標值被一個指標間接指向到另一個指標時,訪問這個值需要使用兩個星號運算子。