天天看點

指針和函數

指針和函數的關系 

  可以把一個指針聲明成為一個指向函數的指針。intfun1(char*,int); 

int(*pfun1)(char*,int); 

pfun1=fun1; 

.... 

inta=(*pfun1)("abcdefg",7);//通過函數指針調用函數。 

可以把指針作為函數的形參。在函數調用語句中,可以用指針表達式來作為實參。 

  例十三: 

intfun(char*); 

inta; 

charstr[]="abcdefghijklmn"; 

a=fun(str); 

... 

intfun(char*s) 

intnum=0; 

for(inti=0;i{ 

num+=*s;s++; 

returnnum;

}

  這個例子中的函數fun統計一個字元串中各個字元的ASCII碼值之和。前面說了,數組的名字也是一個指針。在函數調用中,當把str作為實參傳遞給形參s後,實際是把str的值傳遞給了s,s所指向的位址就和str所指向的位址一緻,但是str和s各自占用各自的存儲空間。在函數體内對s進行自加1運算,并不意味着同時對str進行了自加1運算。

指針類型轉換 

當我們初始化一個指針或給一個指針指派時,指派号的左邊是一個指針,指派号的右邊是一個指針表達式。在我們前面所舉的例子中,絕大多數情況下,指針的類型和指針表達式的類型是一樣的,指針所指向的類型和指針表達式所指向的類型是一樣的。 

  1、floatf=12.3; 

  2、float*fptr=&f; 

  3、int*p; 

   在上面的例子中,假如我們想讓指針p指向實數f,應該怎麼搞?是用下面的語句嗎? 

  p=&f; 

  不對。因為指針p的類型是int*,它指向的類型是int。表達式&f的結果是一個指針,指針的類型是float*,它指向的類型是float。兩者不一緻,直接指派的方法是不行的。至少在我的MSVC++6.0上,對指針的指派語句要求指派号兩邊的類型一緻,所指向的類型也一緻,其它的編譯器上我沒試過,大家可以試試。為了實作我們的目的,需要進行"強制類型轉換": 

p=(int*)&f;

如果有一個指針p,我們需要把它的類型和所指向的類型改為TYEP*TYPE, 那麼文法格式是: 

  (TYPE*)p; 

  這樣強制類型轉換的結果是一個新指針,該新指針的類型是TYPE*,它指向的類型是TYPE,它指向的位址就是原指針指向的位址。而原來的指針p的一切屬性都沒有被修改。 

  一個函數如果使用了指針作為形參,那麼在函數調用語句的實參和形參的結合過程中,也會發生指針類型的轉換。

繼續閱讀