文章目錄
- 指針介紹
- C++指針的定義與用法
- 指針的定義
- 指針的基本操作
- 指針的常見用法
- 1. 動態內存分配
- 2. 指針與數組
- 3. 指針作為函數參數(傳址調用)
- 4. 函數返回指針
- 特殊指針類型
- 智能指針(C++11起)
- 2.入門代碼
- 3.總結
指針介紹
C++指針的定義與用法
指針是C++中一個非常重要的概念,它直接操作內存地址,提供了靈活的內存管理方式。以下是關于C++指針的詳細介紹:
指針的定義
指針是一個變量,其值為另一個變量的內存地址。指針的定義語法如下:
數據類型 *指針變量名;
例如:
int *p; // 定義一個指向整型的指針
double *dp; // 定義一個指向雙精度浮點型的指針
char *cp; // 定義一個指向字符型的指針
指針的基本操作
- 取地址運算符(&):獲取變量的內存地址
- 解引用運算符(*):訪問指針所指向的內存位置的值
int var = 20; // 實際變量的聲明
int *ip; // 指針變量的聲明ip = &var; // 在指針變量中存儲var的地址cout << "變量var的值: " << var << endl;
cout << "變量var的地址: " << &var << endl;
cout << "指針ip存儲的地址: " << ip << endl;
cout << "指針ip指向的值: " << *ip << endl;
指針的常見用法
1. 動態內存分配
int *ptr = new int; // 動態分配一個整型內存
*ptr = 10; // 在分配的內存中存儲值
delete ptr; // 釋放內存// 動態分配數組
int *arr = new int[10]; // 分配10個整型的內存塊
delete[] arr; // 釋放數組內存
2. 指針與數組
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 數組名就是數組首元素的地址for(int i = 0; i < 5; i++) {cout << *(p + i) << " "; // 通過指針訪問數組元素
}
3. 指針作為函數參數(傳址調用)
void swap(int *x, int *y) {int temp = *x;*x = *y;*y = temp;
}int main() {int a = 5, b = 10;swap(&a, &b); // 傳遞變量的地址cout << a << " " << b; // 輸出 10 5return 0;
}
4. 函數返回指針
int* createArray(int size) {int *arr = new int[size];for(int i = 0; i < size; i++) {arr[i] = i + 1;}return arr;
}int main() {int *myArray = createArray(5);// 使用數組...delete[] myArray; // 記得釋放內存return 0;
}
特殊指針類型
-
空指針(nullptr):表示指針不指向任何對象
int *ptr = nullptr;
-
void指針:可以指向任意類型的數據
void *vp; int a = 10; vp = &a;
-
指向指針的指針
int var = 10; int *ptr = &var; int **pptr = &ptr;
智能指針(C++11起)
為了更安全地管理動態內存,C++11引入了智能指針:
#include <memory>// 獨占指針
std::unique_ptr<int> uptr(new int(10));// 共享指針
std::shared_ptr<int> sptr1 = std::make_shared<int>(20);
std::shared_ptr<int> sptr2 = sptr1; // 共享所有權// 弱指針
std::weak_ptr<int> wptr = sptr1;
指針是C++強大但也容易出錯的特性,使用時需要注意內存管理,避免內存泄漏和懸空指針等問題。
2.入門代碼
#include<stdio.h>
//交換兩個值 p就是地址?
void swap(int* p,int* q)
{int t = *p;*p = *q;*q = t;printf("\n");printf("指針內容交換完畢~");}
int main()
{int a = 6;int b = 4;int* p = &a;int* q = &b;printf("%d %d",p,q);printf("\n\r");printf("%d %d",*p,*q);
// 交換指針內容swap(p,q);printf("\n");printf("%d %d",p,q);printf("\n");printf("%d %d",*p,*q);}
C++版本 交換變量地址以及內容前后對比
#include<stdio.h>
#include<iostream>
using namespace std;
//交換兩個值 p就是地址?
void swap(int* p,int* q)
{int t = *p;*p = *q;*q = t;printf("\n");printf("指針內容交換完畢~");
}
//交換指針指向
void swap_address(int **p,int **q)
{
// int t = *p;
// *p = *q;
// *q = t;
// //交換指針地址int* k = *p;*p = *q;*q = k;cout << "指針地址交換完畢" << endl;printf("\n");
// printf("指針內容交換完畢~");
//
}
int main()
{int a = 6;int b = 4;int* p = &a;int* q = &b;printf("%d %d",p,q);printf("\n\r");printf("%d,%d",a,b);printf("\n\r");//傳入指針內容,用于交換地址printf("%d %d",*p,*q);
// 交換指針內容printf("\n\r");printf("%d,%d",a,b);swap(p,q);printf("\n\r");printf("%d %d",*p,*q);printf("\n\r");swap_address(&p,&q);printf("\n");printf("%d %d",p,q);printf("\n");printf("%d %d",*p,*q);}
3.總結
指針式核心內容,怎么表示地址,怎么表示指針指向的內容,怎么操作指針,如何正確打印指針,還是指針的內容,二級三級等多級指針如何操作?