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");
}
/*****************************/
#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);
}
{
printf("0x%x\n",test);
printf("0x%x\n",&test);
}
[root@H3C]# ./a.out
0x7025368
0x7025368
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]);
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