天天看點

指針 的基礎知識

雖然程式中的變量隻是一段存儲空間的别名,但是不是必須通過這個别名才能使用這段存儲空間,還可以通過指針來通路。

指針的本質

指針在本質上也是一個變量

指針需要占用一定的記憶體空間

指針用于儲存記憶體位址的值

不同類型的指針占用的記憶體空間大小相同,因為位址的位數相同,都為4個位元組,前提是32位系統,32位位址總線。

可以用*來對指針變量解引用。

*星号的意義(除了乘法之外):

  • 在指針聲明時,*号表示所聲明的變量為指針。
  • 在指針使用時,*号表示取指針所指向的記憶體空間中的值。

指針變量是用來訓示一個記憶體位址的變量,是以隻能将位址賦給指針變量,而不能是整數或浮點數。

整數通過強制類型轉換後可指派給指針變量, 要注意轉換後的類型要和指針指向的類型一緻,并且這個整數的位長不能超過指針的位長

傳值調用與傳址調用

  • 指針是變量,是以可以聲明指針參數。
  • 當一個函數體内部需要改變實參的值,則需要使用指針參數,采用傳址調用可以改變實參的值。
  • 傳值調用:函數調用時實參值将複制到形參。
  • 指針适用于複雜資料類型作為參數的函數中,當傳遞的資料量過多時,會消耗大量的時間,采用指針參數可以節約時間。

舉例說明:利用指針實作變量交換函數

#include<stdio.h>
#define SWAP(a,b) {int t = a; a = b; b = t;}

void swap(int* a, int* b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

int main()
{
    int i = ;
    int j = ;  
    printf("i=%d,j=%d\n",i,j);
    swap(&i,&j);
    printf("i=%d,j=%d\n",i,j);
    while();
    return ;
}
           

這裡不能使用傳值調用。

常量與指針

const int* p; //p可變,p指向的内容不可變

int const* p; //p可變,p指向的内容不可變

int* const p; //p不可變,p指向的内容可變

const int* const p; //p和p指向的内容都不可變

口訣:左資料右指指針

當const出現在*号左邊時指針指向的資料為常量

當const出現在*後右邊時指針本身為常量

名詞差別:

常量指針:指向的位址可以變,但内容不可以重新指派,内容的改變隻能通過修改位址指向後變換。

指針常量:指向的位址不可以重新指派,但内容可以改變,必須初始化,位址跟随一生。

區分訣竅:名詞中間加“的”:常量的指針;指針的常量。

指針小結

指針是C語言中一種特别的變量

指針所儲存的值是記憶體的位址

可以通過指針修改記憶體中的任意位址内容

繼續閱讀