指針和函數的關系
可以把一個指針聲明成為一個指向函數的指針。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的一切屬性都沒有被修改。
一個函數如果使用了指針作為形參,那麼在函數調用語句的實參和形參的結合過程中,也會發生指針類型的轉換。