有時看到以下的代碼: c++
/*****************************/ #include<stdio.h> #include<string.h> #include <stdlib.h> void test(){printf("123456\n");} int main(intargc,char*argv[]) {printf("0x%x\n",test); printf("0x%x\n",&test);} [[emailprotected]pht]# ./a.out 0x80483280x8048328
按照&運算符原本的意義,它要求其操做數是一個對象,但函數名不是對象(函數是一個對象),原本&test是非法的,但好久之前有些編譯器已經容許這樣作, c/c++標準的制定者出於對象的概念已經有所發展的緣故,也認可了&test的合法性。程序員
若是你也想成爲程序員,想要快速掌握編程,趕忙關注小編加入學習企鵝圈子吧!編程
裏面有資深專業軟件開發工程師,在線解答你的全部疑惑~編程語言入門「so easy」數組
資料包含:編程入門、遊戲編程、課程設計等。app
免費學習書籍:編程語言
免費學習資料:函數
所以,對於test和&test你應該這樣理解,test是函數的首地址,它的類型是void (),&test表示一個指向函數test這個對象的地址, 它的類型是void (*)(),所以test和&test所表明的地址值是同樣的,但類型不同。學習
test是一個函數,&test表達式的值是一個指針! 跟此問題相似的還有對一個數組名取地址。 spa
int a[100]; printf("%p\n", a); printf("%p\n", &a[0]); 打印值同樣。 可是數組名a,指向的是具備100個int類型的組數;設計
&a[0]指向的是元素a[0]。 即他們的值相同,但指向的類型不一樣。 標準在其rationale中解釋了這個問題,摘錄以下:
6.5.3.2 Address and indirection operators Some implementations have not allowed the & operator to be applied to an array or a function. (The construct was permitted in early versions of C, then later made optional.) The C89 Language Committee endorsed the construct since it is unambiguous, and since data abstraction is enhanced by allowing the important & operator to apply uniformly to any addressable entity.