C++:指针的那些坑

文章目录

    • 指针和常量
    • 指针与数组
    • 野指针

指针和常量

程序清单1.1:

int a=6;
const int *p=&a;

这个可以修改指针p的指向吗?
意思就是此时的p是
指向一个常量对象
还是
指针本身是一个常量对象

在这里,指针p指向一个 const int(6)。所以对于指针p而言是指向一个常量对象,意思就是不能通过 p 来改变变量a的值。但是我们可以改变指针p的指向,就是可以赋一个新地址给P。

注:这里有个要注意的事情, 并没有改变 变量a的属性,就是我们可以直接通过a来改变其自身的值。

我们可以将const的变量的地址赋给常规指针吗?
显而易见,C++是禁止将const地址赋给非const指针。

那么从这我们可以引出一个很多初学者容易犯的错:
程序清单1.2:

int sun(int ary[],int size){
     
...
}
int main(){
     
   const int buf[5]={
     1,2,3,4,5};
   ....
   int j=sun(buf,5);
}

在这,最后一条语句是错误的,
c++禁止将 常量数组的地址赋给非常量指针,
意思就是不能将 常量数组名作为实参传递给使用非常量形参的指针
这里告诉我们一个方法,可以用指向const的指针作为参数达到保护数据的目的。

接下来:
程序清单1.3:

int b=6;
int * const pt=&b;

此时,就是我们前面提到过的,指针本身是一个常量,意思就是指针pt只能指向变量b。 但是可以通过pt修改b的值。


指针与数组

有指针数组和数组指针。

下面属于哪一种?
程序清单2.1:

int (*P)[5];

首先,我们要了解运算符的优先级:
()> [ ] > *
这是一个数组指针,将 *p遮住,p指向的类型就是剩下的类型,即是int数组。
.
.

程序清单2.2:

int *P[5];

这是一个指针数组,根据优先级,p是一个数组,自身类型为int *。

关于指针和数组这里就不过多解释,大家可以看看这篇文章 点这里


野指针

我们在声明指针时,计算机会分配用来存储地址(指针)的内存,但不会分配指针指向数据的内存,所以为数据提供空间这一步骤至关重要

程序清单 3.1:

int *P;
*p=666;

p确实是一个指针,但是它指向哪,我们不知道(因为我们没有初始化),第二行代码的执行会修改计算机内某个内存单元中所存储数据的值。这个危险还是不可控的。

所以要求我们在声明指针时:
1.要们将指针设为NULL。
2.要门将指针指向合法的内存。

关于野指针更详细的解释,参考博客:点这里。

你可能感兴趣的:(C++,指针,c++,内存管理)