c語言里面 函數void func() 取地址&func 和 func值是一樣的 .&func的作用是什么,為什么通過編譯?


c語言里面 函數void func() 取地址&func 和 func值是一樣的 .&func的作用是什么,為什么通過編譯?

func就是函數的入口地址,&func又是什么?
  func是函數名,func是函數的入口地址;&func是指向函數func的指針(指針跟地址是兩個概念),指針的值是函數的地址。但是函數名可以隱式轉換成他的函數指針,所以輸出func時和&func時是一樣的.因為經過了這個轉換。

有時看到如下的代碼:
/*****************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void test()
{
    printf("123456\n");
}
int main(int argc, char *argv[])
{
    printf("0x%x\n",test);
    printf("0x%x\n",&test);
}
[root@H3C]# ./a.out
0x7025368
0x7025368  
  按照&運算符本來的意義,它要求其操作數是一個對象,但函數名不是對象(函數是一個對象),本來&test是非法的,但很久以前有些編譯器已經允許這樣做, c/c++標准的制定者出於對象的概念已經有所發展的緣故,也承認了&test的合法性。 因此,對於test和&test你應該這樣理解,test是函數的首地址,它的類型是void (),&test表示一個指向函數test這個對象的地址, 它的類型是void (*)(),因此test和&test所代表的地址值是一樣的,但類型不一樣。test是一個函數,&test表達式的值是一個指針! 跟此問題類似的還有對一個數組名取地址。 
  int a[100];
  printf("%p\n", a);
  printf("%p\n", &a[0]);   
  打印值一樣,但是數組名a,指向的是具有100個int類型的組數;   
  &a[0]指向的是元素a[0]。 即他們的值相同,但指向的類型不同。
 
轉自:https://blog.csdn.net/weixin_30736301/article/details/102227702


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM