文章目录
- 指针介绍
- 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.总结
指针式核心内容,怎么表示地址,怎么表示指针指向的内容,怎么操作指针,如何正确打印指针,还是指针的内容,二级三级等多级指针如何操作?