C++中的數組引用和指針引用
C++中的數組引用和指針引用
一、引用的本質
我們在講解引用之前需要知道為什麼C++中會單獨提出引用這個概念,在前面也提到在C++從一定角度上是C語言的升級版,其實引用時和C語言中的指針一樣的功能,並且使得語法更加簡潔。既然提到和指針功能相同,那麼引用的功能其實就是給空間取別名。
代碼解析:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; void test01() { int a = 10; int& b = a; b = 100; cout << a << endl; } void func(int& a) { a = 200; } void test02() { int a = 10; func(a); cout << "a=" << a << endl; } int main() { test01(); test02(); system("pause"); return EXIT_SUCCESS; }
代碼分析:
void test01() { int a = 10; int& b = a; b = 100; cout << a << endl; }
首先我們定義瞭一個整型變量a
,並且取值為10
。接下裡,int& b = a
;相當於是給a的空間取別名為b
,類似於C語言中的指針,新定義瞭一個指針變量b
,指向瞭內存空間a
。這裡的&
不是取地址符號,在這裡是引用標志。最終通過引用b
修改內存空間a的值為100
,並且最終進行打印。
最終結果如下圖:
void func(int& a) { a = 200; } void test02() { int a = 10; func(a); cout << "a=" << a << endl; }
在test01
中是直接在一個函數裡進行引用的,我們在test02中換一個引用方式,將引用參數作為被調函數func的形參。最終結
果如下圖:
總結:
- 引用的本質其實是編譯器在內部使用常指針來實現。例如
int& b = a
;其實在等價於int*const b = &a
;隻不過該操作是編譯器內部進行的。所以其實引用創建時,必須初始化。 - 引用一旦初始化不能改變它的指向
- 引用必須引用一塊合法的內存空間
&
不是取地址操作符,是引用的標記作用
二、數組的引用
int main() { int arr[] = { 1, 2, 3, 4, 5 }; //第一種方法 typedef int(MY_ARR)[5]; MY_ARR& arref = arr; //第二種方法 int(&arref2)[5] = arr; //第三種方法 typedef int(&MY_ARR3)[5]; MY_ARR3 arref3 = arr; for (int i = 0; i < 5; i++) { cout << arref[i] << endl; } cout << endl;//換行 for (int i = 0; i < 5; i++) { arref2[i] = 100 + i; cout << arref2[i] << endl; } system("pause"); return EXIT_SUCCESS; }
代碼分析:
首先我們定義瞭一個整型數組為arr
,並且數組大小為5
,數組元素為1,2,3,4,5
。
接下來我們一共有三種數組的引用方法:
第一種是定義數組類型, typedef int(MY_ARR)[5]; MY_ARR& arref = arr
; 類似於MY_ARR
為int
,arref
為b
,arr
為a
,相當於int &b=a
;
第二種是直接定義引用,這種方法是最常用的。int(&arref2)[5] = arr
; 相當於int &b=a
;
第三種是建立引用數組類型。typedef int(&MY_ARR3)[5]; MY_ARR3 arref3 = arr
;這種方法不怎麼常用。
最終運行結果如下圖:
三、指針的引用
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; void test01() { char* p2 = (char*)"馨怡"; char*& p1 = p2; cout << p1 << endl; } //被調函數 void func(char*& tmp) { char* p; p = (char*)malloc(64); memset(p, 0, 64); strcpy(p, "小花"); tmp = p;//省瞭* } //主調函數 void test02() { char* mp = NULL; func(mp);//省瞭& cout << mp << endl; } int main() { test01(); test02(); system("pause"); return EXIT_SUCCESS; }
分析代碼:
void test01() { char* p = (char*)"馨怡"; char*& p1 = p; cout << p1 << endl; }
為瞭讓大傢更清楚的瞭解,特意附上一張圖
從圖中可以看出,首先我們創建瞭一個char *
類型的指針變量p
,指向瞭文字常量區馨怡所在的內存空間,即圖中的0x1234,那麼經過指針的調用,即重新定義瞭一個指針變量p1
也指向瞭內存空間0x1234
,即給p取別名p1
。
最終結果如下圖:
//被調函數 void func(char*& tmp) { char* p; p = (char*)malloc(64); memset(p, 0, 64); strcpy(p, "小花"); tmp = p;//省瞭* } //主調函數 void test02() { char* mp = NULL; func(mp);//省瞭& cout << mp << endl; }
為瞭讓大傢更瞭解,特意附上一張圖
從上圖可以看出,我們首先定義瞭一個局部指針變量mp指向瞭NULL
,並且存在於棧區。然後開始調用被調函數func
。mp
作為func
的形參,等價於char* &tmp = mp
; 相當於給mp
取別名為tmp
。在func
函數中創建瞭一個新的指針變量p,用於指向新申請的malloc
內存,大小為64
個字節,並且調用memset
和strcpy
函數將堆區中的空間賦值為“小花”。最終將變量p指向重新指向為tmp
指向,即最終mp
從原來的NULL
指向瞭堆區中的小花,即內存地址為0x1
。
最終結果如下所示:
以上就是C++中的數組引用和指針引用的詳細內容,更多關於C++數組引用和指針引用的資料請關註WalkonNet其它相關文章!希望大傢以後多多支持WalkonNet!