C言語の関数の名前と連絡先と取り違い

時々、私たちは、次のコードを参照してください。 

/ ***************************** / 
書式#include <stdio.hに> 
する#include <string.hの> 
書式#include <STDLIB。 H> 

ボイド試験()
{ 
    のprintf( "123456 \ n"); 
} 

int型のmain(int型ARGC、チャー*のARGV [])
{ 
    のprintf( "0X%X \ n"は、テスト)。
    printf( "0X%X \ n"、&テスト)。
} 

[ルート@のローカルホストPHT]#./a.out 
0x8048328 
0x8048328

そのオペランドを必要と&演算子の本来の意味によると、(関数はオブジェクトである)オブジェクトですが、関数名がオブジェクトではありません、もともと&テスト、違法だったが、長い時間前にいくつかのコンパイラは、そうすることが許可されている 
C / C ++標準オブジェクトの概念の発展のためにメーカーが理由となって、だけでなく、&テストの正当性を認めています。 

したがって、試験用及び&あなたが理解されるべき試験、テスト)は、void型(であり、関数の先頭アドレスであり、&テストは、機能テスト対象点のアドレスを表し、 
)それがvoid型(*)(のものであり、従って試験そして&表さテストアドレスの値が同じではなく、同じタイプ。テストは、テスト式の値が関数であるとポインタです! 


名取アドレスのアレイ上のこれに類似した問題があります。 
INT [100]; 
;のprintf( "%P \のN-"、A) 
のprintf( "%P \のN-"、&A [0]); 

印刷の値として。 
しかし、配列aの名前は、int型の100と配列を指す; 
&A [0]要素[0]を指します。 
つまり、彼らは同じ値が、ポイントの種類を持っています。 

:標準は、次のように要約され、この問題では、その根拠を説明 
6.5.3.2アドレスと間接演算子 
のいくつかの実装は、配列や関数に適用する&演算子で許可していないしています。 
(構築物はその後任意製、Cの初期バージョンで許可された。)C89言語 
委員会は、それが明白であるので、構造体を支持し、データ抽象化がされているので 
重要&オペレータが任意のアドレス指定可能なエンティティに均一に適用させることによって高め。 

おすすめ

転載: www.cnblogs.com/still-smile/p/11592292.html