天天看點

C語言【指針】一維數組與指針概念

C語言【指針】一維數組與指針概念

(1) 指針就是記憶體位址;

系統對變量的通路形式有兩種:

直接通路:按變量位址存取變量值的方式

間接通路:

C語言【指針】一維數組與指針概念

如上所示,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)指針作為函數參數;

C語言【指針】一維數組與指針概念

這個執行個體看出: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)數組指針作為函數參數有兩種形式:

形參、實參都是數組名 :這種方法一般是不用的。

形參是指針變量,實參是數組名

形參和實參都是指針變量

形參是數組名、實參是指針變量

指針運算的詳細說明:驗證執行個體求真相!

關于++(--)和*的運算總是混在一起,以前總是似是而非的

C語言【指針】一維數組與指針概念

,現在就詳細的解決掉!

C語言【指針】一維數組與指針概念

一:++的運算:

  如果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這個空間。

C語言【指針】一維數組與指針概念

(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的發生了變化,也就是指向發生了改變,指向了下一個空間。

繼續閱讀