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.要门将指针指向合法的内存。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值