指针(c++)

复制代码
指针,64位的系统,指针本身占8个字节,指针变量所在内存地址存的是另一个变量的地址。
cpp 复制代码
    int num = 10;
    int *p = # //指针只存内存地址 ,声明时*表示该变量为指针变量  &表示取变量内存地址
    cout << p << endl; // 输出num的内存地址
    cout << *p << endl; //使用时,*表示取该内存地址中存储的内容
    *p = 20; // 直接对内存操作,如果通过num=20,进行修改的话,可能会重新分配内存,而*p就不会
    cout << "*p= " << *p << endl;
    cout << "num= " << num << endl;
复制代码
野指针:被声明但未被初始化(赋值)的指针,该指针会指向随机的内存空间,可能导致未知的问题。声明及分配(内存)原则。
   例如:int *a = 10,就是野指针,把一个随机的内存内容覆盖为10,给指针初始化指的是是赋值给某变量的地址。
复制代码
空指针,只在需要延迟赋值时使用。
cpp 复制代码
    int *a = NULL; //NULL是c++内置的宏,表示空,本质为0
    int *b = nullptr;//nullptr是c++11引入的关键字,表示指针为空
复制代码
指针可以进行加减运算,结果和指向内存区域的数据类型有关,指针+1:char类型+1、int类型+4、double类型+8
cpp 复制代码
    int arr[]={1,2,4,6};//arr中有一个微变量存储着该数组第一个元素的地址
    int * c = arr;//我们只需要把该微变量赋值为指针,就不需要取地址符 "&" 了,该指针指向的是该数组0号元素的地址
    cout << "数组的第二个元素" << *(c+1) <<endl;//c+1对内存来说正好跳了4个字节,就是下一个元素的首地址
    cout << "数组的第二个元素" << arr[1] <<endl;

内存分配:

静态分配:C++中,变量、数组等对象的创建是自动分配内存的,不会进行内存空间的自动清理,只有在该函数运行结束时才会清理。

动态分配:C++中,变量、数组等对象的创建是自动分配内存的,new运算符用于申请并分配内存空间,并提供指向该内存的指针,delete运算符用于释放内存,仅可用于new运算符申请的内存空间。

cpp 复制代码
    int *p = new int;
    *p = 10;
    cout << "new申请的4字节内存空间,存放的是:" << *p << endl;
    delete p;

也可用于给数组分配内存:

cpp 复制代码
    int * a =new int [5];
    *a=10; //等同于 a[0]=10;
    a[1]=20; //*(a+1)=20;
    for(int  i=0;i<5;i++){
        cout<< *(a+i);
    }
    cout<<endl;
    cout<< *a <<"   " <<a[1]<<endl;
    delete[] a;

指针悬挂:

cpp 复制代码
    int *c = new int;
    int *d = c;
    delete c;
复制代码
此时d就是指针悬挂,指针指向的区域被回收,指针d已经不能正常使用了。所以不要轻易的进行指针之间互相赋值。
复制代码
指向const的指针:
   表示指向区域的数据是不变的,但该指针可以更换指向其他的内存。比如:有俩个变量a、b,现在指针*p指向a,a保存的数据不允许改动,但指针p可以改为指向变量b,此时b保存的数据不允许改动,a的数据可以改动。

有俩种写法:俩种写法,const必须在*前面

cpp 复制代码
    int num1 = 2 , num2 = 10;
    //俩种写法,const必须在*前面
    int const * p1 = &num1;
    const int * p2 = &num1;
    cout  << "p3= " << *p1 <<endl;
    p1 = &num2;
    cout  << "p3= " << *p1 <<endl;
复制代码
const指针:
   指针本身不可修改,即指向的内存地址不可修改,但指向的数据可以修改。语法:将*写在const前。与指向const的指针相反。即指针p指向变量a,a保存的数据可以改动,指针p只能指向变量a,不能指向其他变量。
cpp 复制代码
    int * const p3 = &num1;
    cout << "p3= " << *p3 <<endl;
    *p3 = 20;
    cout  << "p3= " << *p3 <<endl;
复制代码
指向const的const指针:指针本身和指向的区域值都不可修改,语法:*的前后,都写const。
cpp 复制代码
int const * const p4 = &num1;
相关推荐
代码羊羊1 小时前
Rust Panic 深入全解:不可恢复错误的处理与原理
开发语言·后端·rust
枫叶丹41 小时前
【HarmonyOS 6.0】Call Service Kit VoIP接口Wearable设备支持详解:从手机到手表,VoIP通话的全场景延伸
开发语言·华为·智能手机·harmonyos
jjjava2.01 小时前
Java多线程编程:从入门到实战
java·开发语言
Fanfanaas1 小时前
Linux 系统编程 进程篇 (六)
linux·服务器·c语言·开发语言
小年糕是糕手1 小时前
【C/C++刷题集】顺序表、vector、链表、list核心精讲
c语言·开发语言·数据结构·c++·算法·leetcode·蓝桥杯
会编程的土豆1 小时前
从 C/C++ 视角快速上手 Go 语言:核心差异与避坑指南
c语言·开发语言·c++·后端·golang
小白学大数据1 小时前
Python 3.7 高并发爬虫:接口请求与页面解析并发处理
开发语言·爬虫·python
样例过了就是过了1 小时前
LeetCode热题100 乘积最大子数组
c++·算法·leetcode·动态规划
我命由我123451 小时前
Kotlin 开发 - 双冒号操作符(引用顶层函数、引用成员函数、引用构造函数、引用属性、引用类)
android·java·开发语言·kotlin·android studio·android jetpack·android-studio