CPP指针的种类以及区别


CPP指针

空指针

在C和C++中,用0和NULL都可以表示空指针

空指针误操作的后果:如果对空指针解引用,程序会崩溃,如果对空指针使用 delete 运算符,程序会忽略这个操作,不会出现异常,所以,在内存被释放之后也应该,把指针置为空指针

1、为什么空指针会出现访问异常?

NULL空指针被分配的区域是一个空闲的区域,没有对应的物理空间与之对应,所以对这段空间来说,任何读操作都是非法的,并且无论何时都要保证这个区域都没有与之对应的地址(空指针区域)。

2、C++ 11 的 nullptr

由于 使用 0 和 NULL 表示空指针会出现歧义,C++ 11 推荐使用 nullptr ,也就是 (void *)0

注意: 在 Linux 平台下,要使用nullptr 编译需要加上 -std=C++11参数

野指针

指针只申明,但未初始化,就会出现,int* p,此时p就是野指针。

规避方法: 1)指针在定义的时候,如果没地方指,就初始化为 nullptr 。 2)动态分配的内存被释放后,将其置为 nullptr 。 3)不要返回局部变量的地址。 注意: 野指针的危害比空指针要大很多,在程序中,如果访问野指针,可能会造成程序的崩溃。是可能,不是一定(因为你也不知道它初始化到底指向了哪里),程序的表现是不稳定,增加了调试程序的难度。

指针与数组名的区别

指针是一个地址占4个字节,而数组名是一种数据结构,可以通过 sizeof 体现出来

#include<iostream>
using namespace std;
int main(){
  int a[10];
  int *a1;
  cout<<sizeof(a)<<endl;//40
  cout<<sizeof(a1)<<endl;//4
}

但是有一种特殊情况,当数组名作为函数的参数来传递的时候,他的高贵的数组结构特性已经失去了,成了一个地地道道的只拥有4个字节的平民

#include <iostream>
using namespace std;
void func1(int arr[]){
    cout<<"sizeof(arr): "<<sizeof(arr)<<endl;
    for(int i=0; i<sizeof(arr)/sizeof(int); i++){
        cout<<arr[i]<<endl;
    }
}
void func2(int arr[], int len){//所以一定要加上数组的长度。
    cout<<"sizeof(arr): "<<sizeof(arr)<<endl;
    for(int i=0; i<len; i++){
        cout<<arr[i]<<endl;
    }
}
int main(){
    int arr[]={1, 2, 3, 4, 5};
    cout<<sizeof(arr)<<endl;
    func1(arr);
    func2(arr, 5);
    return 0;
}
//20
//sizeof(arr): 4
//1
//sizeof(arr): 4
//1
//2
//3
//4
//5

文章作者: AllenMirac
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AllenMirac !
  目录