C++中指針變量的使用指南
指針是C++中的一個核心概念,它存儲的是內(nèi)存地址,而不是實(shí)際的值。理解指針對于掌握C++編程至關(guān)重要。
1. 基本概念
指針的定義和聲明
int x = 10; // 普通變量 int *ptr = &x; // 指針變量,存儲x的地址
*表示聲明一個指針&是取地址運(yùn)算符ptr存儲的是x的內(nèi)存地址*ptr是解引用,獲取該地址存儲的值
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)存的指針,使用會導(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++; // 移動到下一個元素
cout << *ptr << endl; // 輸出: 2
5. 動態(tài)內(nèi)存分配
// 分配單個變量
int *p = new int; // 分配內(nèi)存
*p = 100; // 賦值
delete p; // 釋放內(nèi)存
p = nullptr; // 置空
// 分配數(shù)組
int *arr = new int[5]; // 分配5個int的空間
for (int i = 0; i < 5; i++) {
arr[i] = i * 10;
}
delete[] arr; // 釋放數(shù)組內(nèi)存
6. 多級指針
int x = 10; int *p = &x; // 一級指針 int **pp = &p; // 二級指針 int ***ppp = &pp; // 三級指針 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]; // 返回動態(tài)數(shù)組的指針
}
// 注意:不要返回局部變量的地址
int* badFunction() {
int x = 10;
return &x; // 錯誤!x在函數(shù)結(jié)束后被銷毀
}
8. 指針和數(shù)組
int arr[3] = {1, 2, 3};
// 數(shù)組名在多數(shù)情況下退化為指針
int *ptr = arr; // 等價于 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; // 錯誤! ptr1 = &y; // 正確:可以改變指向 // 常量指針(不能改變指向) int *const ptr2 = &x; *ptr2 = 30; // 正確:可以修改值 // ptr2 = &y; // 錯誤! // 指向常量的常量指針 const int *const ptr3 = &x; // *ptr3 = 30; // 錯誤! // ptr3 = &y; // 錯誤!
10. 智能指針(C++11及以上)
智能指針自動管理內(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; // 引用計數(shù)增加 // weak_ptr:弱引用,不增加引用計數(shù) std::weak_ptr<int> wptr = sptr1;
到此這篇關(guān)于C++中指針變量的使用指南的文章就介紹到這了,更多相關(guān)C++ 指針變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++自定義(手撕)vector類實(shí)現(xiàn)過程
文章介紹了C++中std::vector的簡化實(shí)現(xiàn),涵蓋模板類定義、動態(tài)數(shù)組管理、構(gòu)造析構(gòu)函數(shù)、深拷貝機(jī)制、迭代器及容量操作等核心內(nèi)容,旨在通過手動實(shí)現(xiàn)理解其內(nèi)存管理原理和底層實(shí)現(xiàn)邏輯2025-09-09
C++調(diào)用Python基礎(chǔ)功能實(shí)例詳解
c++調(diào)用Python首先安裝Python,本文以win7為例,給大家詳細(xì)介紹C++調(diào)用Python基礎(chǔ)功能,需要的朋友參考下吧2017-04-04
C++用兩個棧實(shí)現(xiàn)一個隊列(面試官的小結(jié))
這篇文章主要給大家介紹了關(guān)于C++用兩個棧實(shí)現(xiàn)一個隊列的相關(guān)資料,這是來自一名面試官的小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
matlab模擬退火算法單約束車間流水線調(diào)度解決實(shí)現(xiàn)及示例
這篇文章主要為大家介紹了matlab模擬退火算法求解單約束車間流水線調(diào)度的實(shí)現(xiàn)及示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02

