一、二級指針可實現(xiàn)的效果
指針的引用 效果 等同于 二級指針 , 因此這里先介紹 二級指針 ;
使用 二級指針 作為參數(shù) , 可以實現(xiàn)如下功能 :
- 動態(tài)內(nèi)存管理 : 借助二級指針 , 可以在函數(shù)中分配或釋放內(nèi)存 ; 如 : 創(chuàng)建一個動態(tài)數(shù)組或調(diào)整現(xiàn)有數(shù)組的大小 , 在函數(shù)中需要一個指向指針的指針作為參數(shù) , 以便修改原始指針 ;
void createArray(int **arr, int size) {
*arr = malloc(size * sizeof(int));
}
- 修改指針的值 : 借助二級指針 , 可以在函數(shù)中修改指針的值 , 即改變它所指向的地址 ; 如果直接傳遞 一級指針 , 函數(shù)只能修改指針指向內(nèi)存中的數(shù)據(jù) , 指針的指向不會改變 ;
void changePointer(int **ptr) {
int new_value = 10;
*ptr = &new_value; // 修改指針值
}
- 傳遞多維數(shù)組 : C 語言中 , 數(shù)組名本質上是指向數(shù)組第一個元素的指針 , 傳遞多維數(shù)組到函數(shù)中通常需要傳遞一個指向指針的指針 , 即二級指針 ; 借助二級指針 , 函數(shù)可以修改原始數(shù)組的行指針 ;
void process2DArray(int **array, int rows, int cols) {
//...
}
二、指針的引用
1、指針的引用 等同于 二級指針 ( 重點概念 )
普通變量的 引用 , 調(diào)用時可以直接當做 普通變量 使用 , 可實現(xiàn)的功能 相當于 一級指針 ;
- 普通變量 相當于 零級指針 ;
一級指針的 引用 , 調(diào)用時可以直接當做 一級指針 使用 , 可實現(xiàn)的功能 相當于 二級指針 ;
N 級指針的 引用 , 調(diào)用時可以直接當做 N 級指針 使用 , 可實現(xiàn)的功能 相當于 N + 1 級指針 ;
在 C++ 語言 中 , 使用 引用 時 , C++ 編譯器 會自動將 引用 翻譯為 一級指針 使用 , 自動 在 一級指針 變量 旁邊加上 取地址符號 & 和 取值符號 * ;
指針的引用 就相當于 二級指針 , 其 實現(xiàn)的效果 , 等同于 二級指針 ;
C++ 編譯器 遇到 指針的引用 時 , 會自動將 引用指針 轉為 二級指針 ;
2、引用本質 - 函數(shù)間接賦值簡化版本
使用函數(shù)進行間接賦值 , 需要滿足如下三個條件 :
- 函數(shù)中定義 指針類型 的 形參 , 調(diào)用函數(shù)時 修改函數(shù)外的 實參 ;
- 將 實參 取地址 , 傳遞給 函數(shù) ;
- 在函數(shù)中 , 通過指針修改 實參的值 , 以達到修改外部變量的效果 ;
如果將 函數(shù) 的形參類型 設置為 引用 類型 , 也能達到 間接賦值 的效果 ;
引用 實際上是 把 間接賦值 的三個條件的后兩個條件進行了合并 , C++ 編譯器遇到引用 , 還是需要將 引用 還原為 C 語言中的 取地址 傳入函數(shù) , 在函數(shù)內(nèi)部使用指針訪問實參 ;
3、代碼示例 - 指針的引用
該 函數(shù) 的 參數(shù) 是 一級指針的引用 , 使用該參數(shù)時 可以當做 一級指針使用 , 其效果 等同于 二級指針 ; 其效果等同于上一篇博客 【C++】C++ 引用詳解 ⑥ ( 普通變量 / 一級指針 / 二級指針 做函數(shù)參數(shù)的作用 ) 中的 int getStudent(Student** stu)
函數(shù) ;
// 參數(shù)是 一級指針的引用
// 該參數(shù) 是 一級指針的引用
// 使用該參數(shù)時 可以當做 一級指針使用
// 其效果 等同于 二級指針
int getStudent(Student*& p)
調(diào)用該 一級指針 的 引用 , 可以直接訪問 一級指針 , 不需要使用 * 符號 ;
因此 這里 直接為 一級指針 進行內(nèi)存分配 ;
如果此處是二級指針 , 需要先試用 * 符號 取出二級指針指向的一級指針 , 然后再為該 一級指針 分配內(nèi)存 ;
// 為形參中聲明的 Student* 指針的引用 分配內(nèi)存
// 一維指針的引用 相當于直接訪問一維指針
// 相當于為 main 函數(shù)中的 Student* stu 變量賦值
p = (Student*)malloc(sizeof(Student));
// 如果傳入的是二維指針參數(shù) Student** p
// 上述操作等同于
// *p = (Student*)malloc(sizeof(Student));
代碼示例 :
// 導入標準 io 流頭文件 其中定義了 std 命名空間
#include <iostream>
// 導入 std 命名空間
using namespace std;
struct Student
{
char name[64];
int age;
};
// 參數(shù)是 指針的引用
// 該參數(shù) 是 一級指針的引用
// 使用該參數(shù)時 可以當做 一級指針使用
// 其效果 等同于 二級指針
int getStudent(Student*& p)
{
// 為形參中聲明的 Student* 指針的引用 分配內(nèi)存
// 一維指針的引用 相當于直接訪問一維指針
// 相當于為 main 函數(shù)中的 Student* stu 變量賦值
p = (Student*)malloc(sizeof(Student));
// 如果傳入的是二維指針參數(shù) Student** p
// 上述操作等同于
// *p = (Student*)malloc(sizeof(Student));
if (p == NULL)
{
// 分配內(nèi)存失敗 , 返回錯誤碼 2
return 2;
}
// 設置結構體成員值
p->age = 18;
// 執(zhí)行成功
return 0;
}
int main() {
// 聲明 Student 對象
Student* stu = NULL;
// 調(diào)用函數(shù) 將二級指針傳入函數(shù)
// 在函數(shù)內(nèi)部創(chuàng)建 Student 對象
getStudent(stu);
// 打印結構體成員
printf("stu->age = %d\n", stu->age);
// 控制臺暫停
system("pause");
return 0;
}
執(zhí)行結果 :文章來源:http://www.zghlxwxcb.cn/news/detail-676131.html
stu->age = 18
請按任意鍵繼續(xù). . .
文章來源地址http://www.zghlxwxcb.cn/news/detail-676131.html
到了這里,關于【C++】C++ 引用詳解 ⑦ ( 指針的引用 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!