C++中的數(shù)組引用和指針引用
C++中的數(shù)組引用和指針引用
一、引用的本質(zhì)
我們在講解引用之前需要知道為什么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,指向了內(nèi)存空間a。這里的&不是取地址符號,在這里是引用標志。最終通過引用b修改內(nèi)存空間a的值為100,并且最終進行打印。
最終結(jié)果如下圖:

void func(int& a)
{
a = 200;
}
void test02()
{
int a = 10;
func(a);
cout << "a=" << a << endl;
}
在test01中是直接在一個函數(shù)里進行引用的,我們在test02中換一個引用方式,將引用參數(shù)作為被調(diào)函數(shù)func的形參。最終結(jié)
果如下圖:

總結(jié):
- 引用的本質(zhì)其實是編譯器在內(nèi)部使用常指針來實現(xiàn)。例如
int& b = a;其實在等價于int*const b = &a;只不過該操作是編譯器內(nèi)部進行的。所以其實引用創(chuàng)建時,必須初始化。 - 引用一旦初始化不能改變它的指向
- 引用必須引用一塊合法的內(nèi)存空間
&不是取地址操作符,是引用的標記作用
二、數(shù)組的引用
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;
}
代碼分析:
首先我們定義了一個整型數(shù)組為arr,并且數(shù)組大小為5,數(shù)組元素為1,2,3,4,5。
接下來我們一共有三種數(shù)組的引用方法:
第一種是定義數(shù)組類型, 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;
第三種是建立引用數(shù)組類型。typedef int(&MY_ARR3)[5]; MY_ARR3 arref3 = arr;這種方法不怎么常用。
最終運行結(jié)果如下圖:

三、指針的引用
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
void test01()
{
char* p2 = (char*)"馨怡";
char*& p1 = p2;
cout << p1 << endl;
}
//被調(diào)函數(shù)
void func(char*& tmp)
{
char* p;
p = (char*)malloc(64);
memset(p, 0, 64);
strcpy(p, "小花");
tmp = p;//省了*
}
//主調(diào)函數(shù)
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;
}
為了讓大家更清楚的了解,特意附上一張圖

從圖中可以看出,首先我們創(chuàng)建了一個char * 類型的指針變量p,指向了文字常量區(qū)馨怡所在的內(nèi)存空間,即圖中的0x1234,那么經(jīng)過指針的調(diào)用,即重新定義了一個指針變量p1也指向了內(nèi)存空間0x1234,即給p取別名p1。
最終結(jié)果如下圖:

//被調(diào)函數(shù)
void func(char*& tmp)
{
char* p;
p = (char*)malloc(64);
memset(p, 0, 64);
strcpy(p, "小花");
tmp = p;//省了*
}
//主調(diào)函數(shù)
void test02()
{
char* mp = NULL;
func(mp);//省了&
cout << mp << endl;
}
為了讓大家更了解,特意附上一張圖

從上圖可以看出,我們首先定義了一個局部指針變量mp指向了NULL,并且存在于棧區(qū)。然后開始調(diào)用被調(diào)函數(shù)func。mp作為func的形參,等價于char* &tmp = mp; 相當于給mp取別名為tmp。在func函數(shù)中創(chuàng)建了一個新的指針變量p,用于指向新申請的malloc內(nèi)存,大小為64個字節(jié),并且調(diào)用memset和strcpy函數(shù)將堆區(qū)中的空間賦值為“小花”。最終將變量p指向重新指向為tmp指向,即最終mp從原來的NULL指向了堆區(qū)中的小花,即內(nèi)存地址為0x1。
最終結(jié)果如下所示:

以上就是C++中的數(shù)組引用和指針引用的詳細內(nèi)容,更多關(guān)于C++數(shù)組引用和指針引用的資料請關(guān)注腳本之家其它相關(guān)文章!希望大家以后多多支持腳本之家!
相關(guān)文章
基于C語言實現(xiàn)簡單的12306火車售票系統(tǒng)
火車售票系統(tǒng)給我們的出行帶來了極大的方面,那么他基于編程是如何實現(xiàn)的呢?今天小編抽時間給大家分享一個使用C語言寫的一個簡單的火車票系統(tǒng),感興趣的朋友參考下2016-09-09
C語言自定義實現(xiàn)strlen函數(shù)的3種方法總結(jié)
這篇文章帶大家了解C語言中自定義實現(xiàn)strlen函數(shù)的3種方法,計數(shù)器,遞歸以及指針,這三種方法通過代碼示例介紹的非常詳細,需要的朋友可以參考下2023-08-08
構(gòu)造函數(shù)定義為private或者protected的好處
從語法上來講,一個函數(shù)被聲明為protected或者private,那么這個函數(shù)就不能從“外部”直接被調(diào)用了。對于protected的函數(shù),子類的“內(nèi)部”的其他函數(shù)可以調(diào)用之。而對于private的函數(shù),只能被本類“內(nèi)部”的其他函數(shù)說調(diào)用2013-10-10
C語言 fscanf 和 fprintf函數(shù)示例詳解
這篇文章主要介紹了 C語言 fscanf 和 fprintf函數(shù)示例詳解,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧2024-12-12

