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