
(1) 指針就是記憶體位址;
系統對變量的通路形式有兩種:
直接通路:按變量位址存取變量值的方式
間接通路:
如上所示,int i=3,然後特殊變量p存放的内容是變量i的位址,利用p來通路變量i。2000是變量i空間的位址。3是i的值。變量p指向變量i,p是指向變量i的指針變量。
(2)定義指針變量: int *p,*p1; float *p;
注意:(1) *号毫無意義,如果硬要說意義的話就是:c語言規定所有變量必須先定義後使用,指針變量也是這樣,但是為了表示指針變量的特殊性,是以就加了一個*号。
(2)一個指針變量隻能指向同一個資料類型,定義*p為int型,那就不能指向float。
(3) 指針變量指派:int i=3; int *p; p=&i; &是取位址運算符,取i的空間的位址給p。是以p裡面存放的是i空間的位址。*p是i空間存放的值,即*p=3;
注意:&i是i空間的位址,是一個整型資料,這個資料指派給p,但是不能直接給p指派,如p=1000是不行的,因為變量的位址是由編譯系統配置設定的,使用者是不知道的,更不能随便給賦位址值。
(4)&和*辨析:
main()
{
int i=100; int *p;
p=&i;
printf("%d\n",i); 直接通路變量
printf("%d\n",*p); 間接通路變量
}
a. int *p 中的*沒有意義,隻能說明定義的是一個指針變量,printf(*p)中的*是指針運算符。
b.&*p的計算:&和*的優先級一樣,自右向左結合,先計算*p是100,然後計算&是&100.
*&p的計算是一樣的,先計算& 再計算*。
c. 指針加1,不是單純的加1,而是加一個所指變量的位元組數。假設整型指針變量p所指的位址是2000,執行p++後,p的位址是2002,因為整型占兩個位元組。
(5)指針作為函數參數;
這個執行個體看出:a,b的值發生了交換,但是q1和q2的值沒有交換。在swap()函數中*p1和*p2發生了交換,他們的值變換了,但是p1和p2的值并沒有發生交換,因為p1和p2是位址,而*p1和*p2是值,我們隻對值執行了交換。同理,q1和q2也沒有發生變化。
如果不用指針變量作為實參,而用普通變量的話,swap交換後是不能傳回到main函數中的,因為定義變量t,*p1和*p2都是是在swap()函數中定義的,他們都是局部變量。
(1)一個數組的位址是這個數組的起始位址(&a[0]),這個起始位址成為數組的指針。
(2)指向數組的指針變量:這個變量中存放了數組的起始位址。要注意,這個指針變量是p而不是*p。
(3)指派: int a[10],*p; p=&a[0]; 将指針變量p指向數組a[0],&a[0]是數組a的首位址,是以p指向了數組a。
(4) 1.如果數組為int型,則指針變量必須指向int類型;
2. 數組名代表數組的首位址; p=a; p=&a[0]; 這兩個語句的作用是一樣的。即a=&a[0]
3. 允許用一個已經定義過的數組的位址作為定義指針時的初始化值。
float score[20]; float *p=score;将數組score的首位址賦給p,而不是*p。*在這兒是毫無意義的。
(5)通路位址:p是指向數組a的指針變量,那麼數組元素a[5]的位址有如下幾種表示形式
p+5 , a+5 ,&a[5];
(6)通路元素: 也有三種方法: *(p+5) , *(a+5), a[5];
(7)指針變量能帶下标:p是指向一個數組的指針變量。 p[5](指針帶下标)等價于*(p+5)
(8)假設p指向數組a,指針變量可以取代數組名操作,如p++是可以的,數組名a也可以表示數組的首位址,不過他屬于常量,如a++是錯誤的。
(9)用指針變量對數組中的元素逐個通路時,一般有兩種方法:
*(p++):指針變量p的值發生了變化。
*(p+i):指針變量p的值沒有發生變化。
(10)引用以數組元素,有兩種方法:下标法和指針發。
任意輸入10個數,将10個數按逆序輸出:
下标法
數組名法
指針變量法a
指針變量法b
(11)數組指針作為函數參數有兩種形式:
形參、實參都是數組名 :這種方法一般是不用的。
形參是指針變量,實參是數組名
形參和實參都是指針變量
形參是數組名、實參是指針變量
指針運算的詳細說明:驗證執行個體求真相!
關于++(--)和*的運算總是混在一起,以前總是似是而非的
,現在就詳細的解決掉!
一:++的運算:
如果n=3 ,則n的值和m的值如下表所示
n的值
m的值
運算分解
m=n++
4
3
m=n; n=n+1
m=++n
n=n+1; m=n
m=-n++
-3
m=-n; n=n+1
m=- ++n
-4
n=n+1 ;m=-n;
解析:++是自增運作,自增運算的結果是其本身發生了變化,如指針p=2000,那麼p++的值是2001,p值是2001,而如果是p+1,那麼p+1的值是2001,但是p的依然是2000,因為p本身沒有加1。
m=n++是先指派再+1,意思是先執行m=n,然後n在執行n+1;以下同理,過程如上表運算分解所示。
二:++和*的綜合運算
a=*p++和a=(*p)++的本質差別
(1) a=*p++
相當于
a=*p++
a=*(p++)
a=*p ; p=p+1
解析: 前面已經說過了++和*的運算符優先級是相同的,他們的運算方向是自右向做。是以
a=*p++相當于a=*(p++),先得到*p,然後p+1->p;
含義: 先取出p所指向的單元中的内容3指派給a ,然後再使p指向下一個位址單元2002,在這個過程中,a值變成了3,指針變量p指向了2002這個空間。
(2)a=(*p)++
a=(*p)++
a=*p ; *p=*p+1
解析: 先取出變量p所指向的空間中的内容指派給a,然後p所指向的空間中的内容加1.
需要注意的是,當p中的内容指派給a後,p所指向的空間中的内容加1,而不是指針變量p加1,指針變量p并沒有發生改變,也就是說p的指向并沒有變化,還是指向原來的空間,但是p所指向的内容變化了。而在(1)中,p的發生了變化,也就是指向發生了改變,指向了下一個空間。