ポインタと参照の比較
まずポインタも参照もアドレスの概念です.
c言語には参照がなく、c++には参照があり、c++11の前には1級の参照しかなく、c++11の後にはマルチレベルの参照がサポートされている.
リファレンス定義:リファレンスは変数の別名であり、空ではなく、初期化する必要があります.リファレンス初期化の値はアドレスを取得する必要があります.リファレンスが変更されると変更できません.参照のサイズは、指定した変数のサイズです.
ポインタは空のポインタまたは野のポインタになる可能性があります.参照を解く前に空を判定し、参照はポインタより安全で、空の参照は存在しません.
リファレンスの最下位レベルを定義することは、ポインタを定義することに相当します.参照変数もメモリを占有し、参照された変数のアドレスを格納するために使用されるが、プログラムで参照にアクセスすると、参照操作を理解し、参照変数がメモリを占有しない仮象を与える.
アセンブリレベルでは、
他の違いについては、プログラムで体得できます.
c言語には参照がなく、c++には参照があり、c++11の前には1級の参照しかなく、c++11の後にはマルチレベルの参照がサポートされている.
リファレンス定義:リファレンスは変数の別名であり、空ではなく、初期化する必要があります.リファレンス初期化の値はアドレスを取得する必要があります.リファレンスが変更されると変更できません.参照のサイズは、指定した変数のサイズです.
ポインタは空のポインタまたは野のポインタになる可能性があります.参照を解く前に空を判定し、参照はポインタより安全で、空の参照は存在しません.
リファレンスの最下位レベルを定義することは、ポインタを定義することに相当します.参照変数もメモリを占有し、参照された変数のアドレスを格納するために使用されるが、プログラムで参照にアクセスすると、参照操作を理解し、参照変数がメモリを占有しない仮象を与える.
アセンブリレベルでは、
int main()
{
int a = 10;
int &b = a;
//lea eax,[a]
//mov dword ptr [b],eax
int *p = &a;
//lea eax,[a]
//mov dword ptr [p],eax
b = 20;
//mov eax,dword ptr [b]
//mov dword ptr [eax],14h
*p = 20;
//mov eax,dword ptr [p]
//mov dword ptr [eax],14h
return 0;
}
では、アセンブリレベルが全く同じであることがわかります.他の違いについては、プログラムで体得できます.