1. 程式人生 > >C語言之指標學習

C語言之指標學習

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

例如

這裡6356748就是a的記憶體地址

什麼是指標呢?

指標是一個變數,其值為另一個變數的地址,即,記憶體位置的直接地址。所以在C語言中,指標存的就變數的地址。

例如

#include<stdio.h>
int main()
{
    int a=10;
    int *p;
    p=&a;
    printf("%d %d %d %d\n",a,&a,p,*p);
    return 0;
}

輸出結果為:

這裡表明指標p指向的是整型資料a的儲存地址,而*p為整型資料a的值。

指標變數宣告的一般常見形式有:

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

既然指標存的是地址那我們可以通過直接訪問地址來可以對變數進行操作

例如在自己編寫交換函式時是無法使兩個變數的值發生改變

但是當我們使用指標時就會發生變化

可以看出使用的變化。

我們可以給把變數的地址賦值給p但是不能直接把一個數賦值給指標變數例如

p=100;這就是錯誤的寫法;但是我們可以使用*p=100;而且這樣還會改變指標所指向的變數例如

當我們使用函式返回指標時,返回的是指標的首地址

另外,C 語言不支援在呼叫函式時返回區域性變數的地址,除非定義區域性變數為 static 變數。

例如

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int * getRandom( )
{
   static int  r[10];
   int i;
   /* 設定種子 */
   srand( (unsigned)time( NULL ) );
   for ( i = 0; i < 10; ++i)
   {
      r[i] = rand();
      printf("%d\n", r[i] );
   }
   printf("r的首地址為%d\n",&r[0]);
   return r;
}
/* 要呼叫上面定義函式的主函式 */
int main ()
{
   /* 一個指向整數的指標 */
   int *p;
   int i;
   p=getRandom();
   printf("指標p的首地址為%d\n",p);
   for(i=0;i<10;i++ )
   {
       printf("指標p當前地址為:%d ",p+i);
       printf("指標*p當前值為%d\n",*(p+i));
   }
   return 0;
}

輸出結果為:

可以看出,當使用指標函式時,返回的是陣列的首地址,然後通過呼叫指標的地址輸出每個值

大概要說的就是這些。