ホームページ  >  記事  >  バックエンド開発  >  C++ 参照の意味と参照の性質

C++ 参照の意味と参照の性質

php是最好的语言
php是最好的语言オリジナル
2018-08-06 09:22:052460ブラウズ

1. 参照の意味

参照は 変数エイリアス として存在するため、場合によってはポインタを置き換えることができます。参照はポインタよりも読みやすく実用的です。

注:
関数内の参照パラメータは初期化する必要はありません。初期化は、

2 を呼び出すときに完了します。特別な参照

const Reference

C では、

const 参照を宣言できます。具体的な使用法は次のとおりです:

// swap函数的实现对比
void swap(int& a, int& b)
{
    int t = a;
    a = b;
    b = t;
}

void swap(int* a, int* b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

constReference let変数には読み取り専用属性があります。この読み取り専用属性は現在のエイリアス用です。変数は他の方法で変更できます。

const Type& name = var;

定数を使用して

const を初期化する場合参照、C コンパイラ プロセッサは定数値用のスペースを割り当て、参照名をこのスペースのエイリアスとして使用します。

int a = 4;              // a是一个变量
const int  & b = a;     // b是a的一个引用,但是b具有只读属性
int * p = (int *)&b;    // p = &a
b = 5;     // err, 引用b 被const修饰,b是一个只读变量
a = 6;     // ok
printf("a = %d\n", a);
*p = 5;    // ok
printf("a = %d\n", a);

結論:
定数ペアの使用

const参照の場合、読み取り専用変数が生成されます

質問: 参照には独自の記憶領域がありますか?

#include <stdio.h>
void Example()
{
    printf("Example:\n");  
    int a = 4;
    const int& b = a;
    int* p = (int*)&b;  
    //b = 5;    // b  
    *p = 5;   
    printf("a = %d\n", a);
    printf("b = %d\n", b);
}

void Demo()
{
    printf("Demo:\n");  
    const int& c = 1;
    int* p = (int*)&c;   
    //c = 5;
    *p = 5;
    printf("c = %d\n", c);
}

int main(int argc, char *argv[])
{
    Example(); 
    printf("\n");  
    Demo();
    
    return 0;
}

検証プログラム:

struct TRef
{
    char& r;
}
printf("sizeof(TRef) = %d\n, sizeof(TRef));

3. 参照の性質

C における参照の内部実装は
ポインタ定数

C++ 参照の意味と参照の性質

注:

1. C コンパイラは、コンパイル プロセス中に参照の内部実装としてポインター定数を使用するため、参照が占有する空間はポインターの空間と同じになります

2 、使用の観点から見ると、参照は単なるエイリアスであり、C は使いやすさを考慮して参照の記憶領域の詳細を非表示にします。

#include <stdio.h>

struct TRef
{
    char& r;        // 字符类型引用
};

int main(int argc, char *argv[])
{ 
    char c = &#39;c&#39;;
    char & rc = c;
    TRef ref = { c }; // 用C进行初始化, TRef.r 就是 c的别名了
    
    printf("sizeof(char&) = %d\n", sizeof(char&));     // char引用的大小,引用即变量本身,求所对应的变量本身的大小,即sizeof(char) = 1
    printf("sizeof(rc) = %d\n", sizeof(rc));        // rc是一个引用,即sizeof(c) = 1
    
    printf("sizeof(TRef) = %d\n", sizeof(TRef));    // sizeof(TRef) = 4
    printf("sizeof(ref.r) = %d\n", sizeof(ref.r));  // TRef.r是 c的别名,sizeof(c) = 1

    // sizeof(TRef) = 4
    // 指针变量本身也是占4个字节
    // 引用和指针的关系
    
    return 0;
}
参照の意味:

C の参照は、ほとんどの場合ポインタを置き換えることを目的としています

  • 機能性: を満たすことができますポインタを使用する必要があるほとんどの状況

  • 安全性: 不適切なポインタ操作によって引き起こされるメモリ エラーを回避できます

  • 操作: シンプルで使いやすい、まだ強力です

しかし、関数がローカル変数への参照を返す場合、

参照はほとんどの場合メモリ エラーを回避できます。概要

参照は変数のエイリアスとして存在し、ポインターを置き換えることを目的としています

const
参照は変数を読み取らせることができます-only 属性

参照はコンパイラ内でポインタ定数を使用して実装されます

参照の究極の本質はポインタです

参照によりメモリ エラーを可能な限り回避できます

関連記事:

PHP におけるループと参照の落とし穴、PHP 循環参照

二重引用符の使用法 PHP の一重引用符の違い二重引用符付き

以上がC++ 参照の意味と参照の性質の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。