內容:前面寫過《指向函式的指標 - c語言》,本文將在陣列指標的基礎上對函式的指標**。
我們先來做個關於陣列的小實驗:
# include int main(void)
; printf("a = %d\n", a);
printf("&a = %d\n", &a);
printf("a + 1 = %d\n", a + 1);
printf("&a + 1 = %d\n", &a + 1);
printf("*(a + 1) = %d\n", *(a + 1));
printf("*(&a + 1) = %d\n", *(&a + 1));
return 0;
}
得到的結果意料之中,如下所示:
a = 2686744
&a = 2686744
a + 1 = 2686748
&a + 1 = 2686752
*(a + 1) = 4
*(&a + 1) = 2686752
由此分析,a表示的是陣列的第乙個元素的指標,&a表示的是陣列的指標,(a + 1)表示的是陣列的第二個元素的指標,(&a + 1)表示的沒有意義的值。
我們得到結論:對於陣列a[2],&a指的是指向陣列的指標,a指的是指向陣列第乙個元素的指標,在指標型別上是有區別的。
我們再做個關於函式指標的實驗:
# include void fun(void)
int main(void)
編譯過程中,會產生如下警告:
e:\c\play\function.cpp in function 'int main()':
15 33 e:\c\play\function.cpp [warning] pointer to a function used in arithmetic [-wpointer-arith]
16 35 e:\c\play\function.cpp [warning] pointer to a function used in arithmetic [-wpointer-arith]
17 35 e:\c\play\function.cpp [warning] pointer to a function used in arithmetic [-wpointer-arith]
列印結果如下:
fun = 4199344
&fun = 4199344
*fun = 4199344
*&fun = 4199344
&*fun = 4199344
****fun = 4199344
fun + 1 = 4199345
*fun + 1 = 4199345
&fun + 1 = 4199345
sizeof(&fun) = 4
分析一下,發現&fun指的肯定是函式的指標,而對於fun和*fun則根據情況而定。產生的警告則說明,函式的指標與其他型別(如整型等)的指標不同,不能進行加減運算。
(只是通過**,感性分析,純屬個人見解)
實際上,函式名就代表了函式的位址,因此fun就是乙個位址。這個跟陣列非常類似,其名字就是指標常量,也即乙個位址。
對函式名取位址,即&fun產生指向函式的指標,也可以看做是函式的位址。 因此fun和&fun結果一致。
而 *fun代表指向函式的指標,指向的是函式的位址。所以可以得到*fun = fun。
即:*fun=*(fun) = *(&fun) = fun
在c語言中,函式本身不是變數,但可以定義指向函式的指標。這種型別的指標可以被賦值、存放在陣列中、傳遞給函式以及作為函式的返回值等等。
函式作為引數傳遞給函式時,因為它們是函式,前面不需要加取位址運算子&。同樣的原因,陣列名前面也不需要&運算子。
(全文完)
C語言 指向函式的指標
1 函式型別 函式指標變數 指向函式的入口位址 乙個函式是若干語句的集合 經編譯後儲存在函式 儲存區 並占有一片連續的儲存空間 對函式指標只能用函式名賦值而無其他運算 include stdio.h 23 intmax intx inty 45 intmain 617 18int max intx ...
C語言 指向函式的指標
在c語言中,函式名代表函式的入口位址。可以定義乙個指標變數,接收函式的入口位址,讓它指向函式,這就是指向函式的指標,也稱函式指標。通過函式指標可以呼叫函式,它還可以作為函式的引數。函式指標的定義 函式指標定義的一般格式為 型別名 變數名 引數型別表 型別名指定函式返回值的型別,變數名是指向函式的指標...
C語言指向函式的指標
定義形式 型別 指標變數名 引數列表 例如 int p int i,int j 在這裡 int是函式的返回型別,p是指向函式的指標,int i,int j 是函式的引數 注意 int f int i,int j int p int i,int j 前者是返回值是指標的函式 後者是乙個指向函式的指標。...