天天看點

C語言關于指針知識點總結【2】

記了忘、忘了再記 嗚嗚嗚

1.例如*p

(1)一個變量的位址稱為該變量的指針。    *p

(2)如果一個變量是專門用來存儲另一個變量的位址,則稱為指針變量。   p

p是指針變量,*p是p指向的變量的值。

(3)嚴格地說一個指針是一個位址,是一個常量。而一個指針變量卻可以被賦予不同的指針值,是變量 。         為避免混淆,“指針”是指位址,是常量;“指針變量”是指取值為位址的變量。

2.指針變量的類型是指針所指向的變量的資料類型,而不是指針自身的資料類型。

3.指針變量的值是指指針所指向的變量在記憶體中所處的位址。

4.指針可以指向數組的首位址,數組名代表數組首位址,等價于   &數組名[0]。

5.多級指針:

指向指針的指針   即指向指針變量的指針變量

例如:指針變量q  指向  變量p,  而p本身又是指針變量, 它指向另一個變量i,則變量q就是指向指針的指針。

C語言關于指針知識點總結【2】

知識點說明:使用多級指針的形式為**q。q的前面有兩個"*"号,由于“*”是按自右向左順序結合的,是以,**q相當于*(*q)。

如上圖所示,q指向p,*q通路的是p;            而p又指向i,*p通路的是i,

是以**q通路的是i。

6.指針變量作為函數參數

函數的參數可以是整型,實型,字元型等基本資料類型,還可以是指針類型。使用指針作為函數的參數,實際上向函數傳遞的是變量的位址。

(1)C語言中實參變量和形參變量之間的資料傳遞是單向的“值傳遞”方式,用指針變量作為函數參數時同樣要遵循這一規則。

(2)不可能通過執行調用函數來改變實參指針變量的值,但是可以改變實參指針變量所指變量的值

注意:

p是指針變量,*p是p指向的變量的值。

假設有一個形參和實參那麼就有

這兩者的的差別:

void swap(int* p1, int* p2)

{

    int* p;        

    p = p1;        

    p1 = p2;       //使p1和p2的值互換。

    p2 = p;

}

void swap(int* p1, int* p2)

{

    int p;

    p = *p1;

    *p1 = *p2;     //*p1,*p2交換意味着p1和p2指向的存儲單元的值進行了交換

    *p2 = p;

}

通常用整型變量而非指針變量作為*p1和*p2進行交換的輔助變量。

7.指針與數組

7.1指向一維數組的指針變量

指針與數組的關系十分密切,實際上數組名本身就是一個常量指針(指針所指的位置保持不變),當定義數組時候,首位址就已經确定且不再改變了。可以将數組名arr看作一個指針,它永遠指向arr[0]。

由于數組中的元素的記憶體是連續排列存放的,是以任何能由數組下标完成的操作都可以由指針來實作。

假設指針變量p指向一維數組a,C語言規定指針對數組的表示方法有以下幾種:

(1)p+n和a+n表示數組元素a[n]的位址,即&a[n]。

(2)*(p+n)和*(a+n)表示p+n或a+n指向的數組元素值,即等效于a[n]。

(3)指向數組的指針變量也可以用數組的下标形式表示為p[n],其效果相當于*(p+n)。

是以要引用一個數組元素,既可以用傳統的數組元素的下标法,也可以用指針的表示方法。

1)下标法:a[i]的形式。

2)位址法:*(a+i),其中a是數組名。

3)指針法:*(p+i)或p[i],其中p是指向數組a的指針變量。

7.2數組指針做函數參數

先發了再編輯

繼續閱讀