記了忘、忘了再記 嗚嗚嗚
1.例如*p
(1)一個變量的位址稱為該變量的指針。 *p
(2)如果一個變量是專門用來存儲另一個變量的位址,則稱為指針變量。 p
p是指針變量,*p是p指向的變量的值。
(3)嚴格地說一個指針是一個位址,是一個常量。而一個指針變量卻可以被賦予不同的指針值,是變量 。 為避免混淆,“指針”是指位址,是常量;“指針變量”是指取值為位址的變量。
2.指針變量的類型是指針所指向的變量的資料類型,而不是指針自身的資料類型。
3.指針變量的值是指指針所指向的變量在記憶體中所處的位址。
4.指針可以指向數組的首位址,數組名代表數組首位址,等價于 &數組名[0]。
5.多級指針:
指向指針的指針 即指向指針變量的指針變量
例如:指針變量q 指向 變量p, 而p本身又是指針變量, 它指向另一個變量i,則變量q就是指向指針的指針。
知識點說明:使用多級指針的形式為**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數組指針做函數參數
先發了再編輯