指针易混淆点

空指针、野指针、void指针、常量指针、指针常量

1. 空指针

空指针不会指向任何地方,它不是任何对象或函数的地址。一个指针不指向任何数据,称之为空指针,空指针用NULL表示。

int *p=NULL;

空指针没有存储任何的内存地址的指针,故不允许用户访问

2. 野指针

指针变量指向非法的内存空间(不可用的内存),这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。

//指针变量p指向内存地址编号为0x1100的空间
int *p=(int *)0x1100;
//访问野指针报错
cout<<*p<<endl;

3. void指针(万能指针)

void 指针是一种特殊的指针,表示为“无类型指针”,任何类型的指针都可以直接赋值给 void 指针,而无需进行其他相关的强制类型转换。

特性:

  1. 可以保存任意的地址
  2. 任何指针都可以赋值给void指针(自动转换)
void *p;
type *q;
p=q;    //自动转换
// 只获取变量或者对象的地址,而不获得大小
  1. void 指针赋值给其他类型的指针时要进行转换
type *temp=(type *)p;
  1. void 指针不能复引用
*p  //错误

因为void指针只知道,指向变量/对象的起始地址,而不知道指向变量/对象的大小(占几个字节)所以无法正确引用。

  1. void 指针不能参与指针运算,除非进行转换

进行算法操作的指针必须确定知道其指向数据类型大小,也就是说必须知道内存地址的确切值。

void * p;
p++;        // 错误
p+= 1;      //错误

4. 常量指针、指针常量

const修饰指针有三种情况
1.const修饰指针 –常量指针
2.const修饰常量 –指针常量
3.const即修饰指针,又修饰常量

int main(){
	int a=10;
	int b=23;
	
	const int *p1=&a;  //const修饰指针,常量指针,指针的指向可以改,指针指向的值不可以更改
	p1=&b;             //正确
	*p1=100;           //错误

	int * const p2=&a; //const修饰常量,指针常量,指针的指向不可改,指针指向的值可以更改
	p2=&b;             //错误
	*p2=130;           //正确
}

记忆:

常量指针:本质是指针,特殊的指针,只读性质的指针,不可以改其值,可以改指向。
常量指针->是个指针->是个特殊的指针(只读性质的指针)->不可以改变其值->可以改指向
指针常量:本质是常量,存储指针的地址,地址不变,故指向不变,值可以改变。
指针常量->是个常量->是个特殊的常量->存了地址的常量(故地址不可改变)->固定指向->可以改值

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值