C++中指針變量的使用指南
指針是C++中的一個(gè)核心概念,它存儲(chǔ)的是內(nèi)存地址,而不是實(shí)際的值。理解指針對(duì)于掌握C++編程至關(guān)重要。
1. 基本概念
指針的定義和聲明
int x = 10; // 普通變量 int *ptr = &x; // 指針變量,存儲(chǔ)x的地址
*表示聲明一個(gè)指針&是取地址運(yùn)算符ptr存儲(chǔ)的是x的內(nèi)存地址*ptr是解引用,獲取該地址存儲(chǔ)的值
2. 指針的基本操作
#include <iostream>
using namespace std;
int main() {
int x = 10;
int *ptr = &x; // ptr指向x
cout << "x的值: " << x << endl; // 輸出: 10
cout << "x的地址: " << &x << endl; // 輸出: x的地址
cout << "ptr的值: " << ptr << endl; // 輸出: x的地址
cout << "*ptr的值: " << *ptr << endl; // 輸出: 10
*ptr = 20; // 通過指針修改x的值
cout << "修改后x的值: " << x << endl; // 輸出: 20
return 0;
}
3. 指針類型
空指針
int *ptr = nullptr; // C++11及以后推薦 int *ptr = 0; // 傳統(tǒng)方式 int *ptr = NULL; // C風(fēng)格,不推薦在C++中使用
懸空指針(野指針)
指向已釋放內(nèi)存的指針,使用會(huì)導(dǎo)致未定義行為:
int *ptr = new int(10); delete ptr; // ptr現(xiàn)在成為懸空指針,應(yīng)該避免使用 ptr = nullptr; // 好習(xí)慣:釋放后置為空
4. 指針運(yùn)算
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 指向數(shù)組首元素
cout << *ptr << endl; // 輸出: 1
cout << *(ptr + 1) << endl;// 輸出: 2(指針加法)
cout << ptr[2] << endl; // 輸出: 3(數(shù)組語法)
ptr++; // 移動(dòng)到下一個(gè)元素
cout << *ptr << endl; // 輸出: 2
5. 動(dòng)態(tài)內(nèi)存分配
// 分配單個(gè)變量
int *p = new int; // 分配內(nèi)存
*p = 100; // 賦值
delete p; // 釋放內(nèi)存
p = nullptr; // 置空
// 分配數(shù)組
int *arr = new int[5]; // 分配5個(gè)int的空間
for (int i = 0; i < 5; i++) {
arr[i] = i * 10;
}
delete[] arr; // 釋放數(shù)組內(nèi)存
6. 多級(jí)指針
int x = 10; int *p = &x; // 一級(jí)指針 int **pp = &p; // 二級(jí)指針 int ***ppp = &pp; // 三級(jí)指針 cout << x << endl; // 10 cout << *p << endl; // 10 cout << **pp << endl; // 10 cout << ***ppp << endl; // 10
7. 指針和函數(shù)
指針作為函數(shù)參數(shù)(按地址傳遞)
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
swap(&x, &y); // 傳遞地址
cout << x << ", " << y << endl; // 輸出: 10, 5
return 0;
}
返回指針的函數(shù)
int* createArray(int size) {
return new int[size]; // 返回動(dòng)態(tài)數(shù)組的指針
}
// 注意:不要返回局部變量的地址
int* badFunction() {
int x = 10;
return &x; // 錯(cuò)誤!x在函數(shù)結(jié)束后被銷毀
}
8. 指針和數(shù)組
int arr[3] = {1, 2, 3};
// 數(shù)組名在多數(shù)情況下退化為指針
int *ptr = arr; // 等價(jià)于 int *ptr = &arr[0];
// 通過指針遍歷數(shù)組
for (int i = 0; i < 3; i++) {
cout << *(ptr + i) << " "; // 輸出: 1 2 3
}
9. const 和指針
int x = 10; int y = 20; // 指向常量的指針(不能通過指針修改值) const int *ptr1 = &x; // *ptr1 = 30; // 錯(cuò)誤! ptr1 = &y; // 正確:可以改變指向 // 常量指針(不能改變指向) int *const ptr2 = &x; *ptr2 = 30; // 正確:可以修改值 // ptr2 = &y; // 錯(cuò)誤! // 指向常量的常量指針 const int *const ptr3 = &x; // *ptr3 = 30; // 錯(cuò)誤! // ptr3 = &y; // 錯(cuò)誤!
10. 智能指針(C++11及以上)
智能指針自動(dòng)管理內(nèi)存,避免內(nèi)存泄漏:
#include <memory> // unique_ptr:獨(dú)占所有權(quán) std::unique_ptr<int> uptr(new int(10)); // shared_ptr:共享所有權(quán) std::shared_ptr<int> sptr1 = std::make_shared<int>(20); std::shared_ptr<int> sptr2 = sptr1; // 引用計(jì)數(shù)增加 // weak_ptr:弱引用,不增加引用計(jì)數(shù) std::weak_ptr<int> wptr = sptr1;
到此這篇關(guān)于C++中指針變量的使用指南的文章就介紹到這了,更多相關(guān)C++ 指針變量內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例
這篇文章主要介紹了c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-12-12
C語言關(guān)于include順序不同導(dǎo)致編譯結(jié)果不同的問題
這篇文章主要介紹了在日常調(diào)試C語言中include的順序不同從而影響最后編譯結(jié)果不同的問題,究其原因是寫代碼的習(xí)慣所導(dǎo)致,下面跟小編一起來看看吧2022-04-04
C++ TensorflowLite模型驗(yàn)證的過程詳解
這篇文章給大家介紹了C++ TensorflowLite模型驗(yàn)證的過程,測試代碼,主要是RunInference()和read_file(),詳細(xì)操作過程跟隨小編一起看看吧2021-08-08
Qt實(shí)現(xiàn)SqlTableModel映射組件應(yīng)用小結(jié)
在Qt中提供了QSqlTableModel模型類,它為開發(fā)者提供了一種直觀的方式來與數(shù)據(jù)庫表格進(jìn)行交互,本文就來介紹一下Qt實(shí)現(xiàn)SqlTableModel映射組件應(yīng)用小結(jié),感興趣的可以了解一下2023-12-12

