将const用于指针有一些很微妙的地方下面微妙来详细的说一下:
将const关键字用于指针:
有两种方法:第一种方法是让指针指向一个常量对象,这样可以防止用该指针修改所指向是值第二种方法是将指针本身声明为常量。这样可以防止改变指针所指向的位置,但是可以改变指针所指向对象的值。
如:
int age = 39;
const int* pt = &age;
该声明指出pt是指向一个const int(这里为39),因此不能使用pt来修改这个值,换句话说 * pt 指向的值为const ,所以不能够修改。
我们先来仔细的解释一下:
首先 我们定义的age是一个变量,意思是pt 的声明并不意味着它指向的值是实际就是一个常量,而是意味着对pt而言,这是一个常量,就这个例子来说,pt指向age,而age是一个变量,所以我们可以直接修改age变量来修改age 的值,但是不能用pt来修改age 的值。
以前的时候,我们将常规变量的地址赋给常规指针,现在我们将常规变量的地址赋值给指向const的指针,所以还有两种可能:
1.将const变量的地址赋值给指向const的指针
const int age = 39;
const int *pt = &age;
这种方式是可行的。对于这种情况,既不能通过age改变age 的值,也不能通过pt来修改。
2.将const变量的地址赋值给常规指针:
const int age = 39;
int* pt = &age ;
这种情况在C++中是禁止的,因为如果这样做,那么我们可以通过pt来修改age 的值,那么这种行为和const本身是冲突的。
关于指针和指针:
前面讲过如果涉及的是一级简介关系,则将非const指针赋值给const指针是可以的,
int age = 39;
int *pt = &age;
const int *pd = pt;
那么我们可以通过age修改age 的值,通过pt 也可以修改age 的值,但是通过pd 是不能修改age 的值的,因为pd指向的是一个const int;
const 和数组:
假设有一个const 数据组成的数组:
const int age [5] = {0,1,2,3,4};
则禁止将常量数组的地址赋值给非常量指针将意味着不能将数组名作为参数传递给使用非常量形参的函数。
为什么会这样呢?你把age看成一个指针就什么都懂了.
如:
int sum(int arr [ ],int n)
{
}
int ans = sum(age,5);
这种方式是不可以的,因为你试图将const指针(age)赋值给非const指针(arr),编译器将禁止这种函数调用、
另外说明一下 :
int age = 39;
const int *pt = &age;
和
int age = 39;
int* const pt = &age;
的区别:
上面的代码只能防止通过pt修改gae 的值,而不能防止修改pt的值。也就是说我们可以让pt指向另一个地址,但是不能通过pt 修改它指向的对象的值。
下面的代码说明 pt 只能指向age,但是允许使用pt 来修改age 的值,
简而言之:
上面的 *pt 和下面的pt都是const,但是上面的pt 和下面的*pt 不是。