c語言指標詳解

要懂得捨棄發表於2018-02-27

1.什麼是指標?

指標是一個變數,用來存放地址,存放在指標中的值都被當成地址來處理

2.為什麼存在指標?

從記憶體說起,計算機中的程式要執行起來首先要將程式載入到記憶體,那如何合理的分配時使用記憶體呢?

我們將記憶體分成多個小的單元,每個單元都對應一個獨一無二的地址,這樣就一個地址標識一塊空間

經過仔細的計算和權衡我們定義每個小的單元是一個位元組,對於32位機器,有32根地址線,那麼假設沒很地址線會產生一個電訊號(0/1),那麼32根地址線能產生的地址就是2的32次方個。每個地址便是一個位元組,那麼我們就可以對4g的空間進行編址。

總結:

  • 指標式因為存放地址才出現的,地址就是為了標識一塊地址空間的
  • 指標讓地址有地方存放,指標讓記憶體的訪問更加方便
  • 指標在32位平臺上式4個位元組,在64位平臺上式8位元組
  • 對於32位機器來說,地址線有32根,使用它的地址是由0/1組成的32位二進位制效率,那地址就得用4個位元組的空間來儲存,所以一個指標變數的大小是4位元組。而64位平臺,有64根地址線,所以需要8個位元組來存放

3.指標和指標型別

指標的型別是: type *

char * 型別的指標是為了存放char型別變數的地址,

int * 型別的指標是為了存放int型別變數的地址……以此類推

為什麼指標要有型別呢?

  • 有型別的區分,使得編碼更加嚴謹
  • 不同型別的指標指定了其解引用時可以訪問記憶體的大小,char* 解引用只能訪問一個位元組,int *解引用可以訪問4個位元組
  • 不同型別的指標+-整數時表示的意義不一樣,指標的型別決定了指標向前或者向後走一步有多大(距離),char型別的指標+-向前或後移動1個位元組,int型別指標+-向前或向後移動4位元組的大小

4.二級指標:

指標變數也是變數,是變數就有地址,那麼指標變數的地址存放在哪裡呢——二級指標

        int a = 10;
	int* pa = &a;
	int **ppa = &pa;

通過對ppa的解引用就可以得到pa的地址,*ppa其實訪問的就是pa 

	int b = 20;
	*ppa = &b;//等價於pa = &b;

通過對*ppa解引用就可以找到a,先通過*ppa找到pa,在對pa進行解引用操作找到a,即**ppa就是a;

**ppa = 30;

//等價於*pa = 30;

//等價於a= 30;

注:對二級指標+/-1,在32位平臺下,移動四個位元組,多個指標+/-1,都是+/-4個位元組

5,指標的運算

  • 指標+-整數

指標+/-n <==> n*sizeof(type)

  • 指標-指標

在同一記憶體空間裡(同一陣列/同一字串),指標相減,結果是倆個指標之間的元素個數,並不是位元組數

int a[10];
int *p = &a[5];
int *q = &a[9];
printf("%d\n",q-p);

//輸出是4

  • 標準規定,允許指向陣列元素的指標向陣列最後一個元素後面的那個記憶體位置的指標比較,單數不允許與指向第一個元素之前的那個記憶體位置的指標進行比較

相關文章