程序清单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.要门将指针指向合法的内存。
关于野指针更详细的解释,参考博客:点这里。