日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++中引用處理的基本方法_C 語言

作者:莫淺子 ? 更新時間: 2023-01-23 編程語言

1.引用的基本用法

引用是C++對C的重要擴充。在c/c++中,指針用法基本一致。但是C++增加了另一種給函數傳遞地址的途徑,這就是引用傳遞,也存在去其他語言,并不會是C++獨有。

1.1 引用的實質

原類型 &別名 = 舊名

1.2 引用的用法

注意事項:

引用一旦初始化,不能更改引用的指向

引用定義時必須初始化 不能引用NULL

引用可以引用任意類型包括數組

&在等號的左邊是引用,在等號的右邊是取地址

?代碼

#include <iostream>
using namespace std;
void test01()
{
	int a = 10;
	int& b = a;
	b = 100;
	cout << a << endl;
 
	int c = 1;
	//b = c; 代表把c的值賦值給b 不是給c取別名為b
	//int &d; 引用定義時必須初始化
}
 void test02()
 {
	int a[5] = { 1,2,3,4,5 };//int(&arr)[5] = a;
	 typedef int ARR[5];  //type & 別名 = 舊名
	 ARR & arr = a;
	 for (int i = 0; i < 5; i++)
	 {
		 cout << arr[i] << " ";
		
	  }
	 cout << endl;
	
 }
 int main()
{
	 test02();
	
	 return 0;
}

2.函數中的引用

引用可以作為函數的形參 ,不能返回局部變量的引用

在C語言中我們記得我們可以用指針解決函數不能交換值的問題。

swap(int *x ,int *y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
}
 
void test01()
{
	int a = 10;
	int b = 20;
	swap(&a,&b);
 
} 

在C++中可以也使用引用很好的解決這個問題

void swap_ref(int &x, int &y)// int &x =a, int &y =b
 {
   int tmp = x;
   x = y;
   y = tmp;
 
 }
 void test01_ref()
 {
   int a = 10; 
   int b = 20;
   swap_ref(a, b);
 }

如果想開辟數組地址,用指針的做法是

//形參是指針 引用
void get_mem(int **q)
{
  *q = (int *)malloc(5 * sizeof(int));
}
void test03()
{
  int *p = NULL;
  get_mem(&p);
  get_mem_ref(p);
}

用引用可以這樣做

void get_mem_ref(int * &q)//int * (&q) = p
{
    q = (int *)malloc(5 * sizeof(int));
 
}
void test03()
{
  int *p = NULL;
  get_mem(&p);
  get_mem_ref(p);
}

能不能返回一個變量的引用 看這個變量的空間是否被釋放了

int & test04()
{
   //能不能返回一個變量的引用 看這個變量的空間是否被釋放了
   static int b = 100;
   int a = 10;
   //return a;//err 不能返回局部變量的引用
   return b;//可以返回靜態的變量的引用
 
 }

3.引用的本質

引用的本質是一個指針常量

type &b = a; 編譯器底層這么實現的: type *const b = &a

比如你寫

int &b = a;? // 編譯器優化為?int * const b = &a?

4.指針的引用

套用引用公式: type &q = p

如果想改變p的內容,函數傳遞的時候按照指針的方法傳的是地址,如下:? get_mem(&p);

如果你想用引用的方法直接傳就行

void test03()
{
? int *p = NULL;
? get_mem(&p);
? get_mem_ref(p);
}

5.常量引用

const type &p = q;

常量引用代表不能通過引用去修改引用標識的那塊空間

int a = 10; 
 
const int &b = a;

如果你再去? 讓 b = 1000;就是錯誤的?

雖然不能引用常量,但是可以加const來引用

int &b = 100; //不能引用常量

改為

const int &b = 1;

原理上是 等價于,相當于讓tmp? = 1

int tmp =1 ,const int &b= tmp;

補充:引用和指針的區別(重要)

從底層匯編的角度來說,引用和指針是沒有區別的,都是以存地址的方式實現的(了解即可)

不同點:

  1. 引用概念上是定義一個變量的別名,指針是存儲一個變量地址。
  2. 引用定義的時候必須初始化,而指針沒有要求。
  3. 引用在初始化一個實體后,就不能再引用其他實體,但指針可以在任何時候指向任何一個同類型的實體。
  4. 沒有NULL引用,但有NULL指針。
  5. 引用比指針使用起來更安全
  6. 再sizeof中含義不同:引用結果為引用類型的大小,但指針始終是地址空間所占字節個數(32位平臺下是4)
  7. 引用自加即引用的實體增加1,指針自加即指針向后偏移一個類型的大小。
  8. 有多級指針,但沒有多級引用
  9. 訪問實體方式不同,指針需要解引用,引用的話編譯器會自己處理。

總結

原文鏈接:https://blog.csdn.net/qq_64691289/article/details/128388930

欄目分類
最近更新