空指针、野指针和const修饰指针和常量的情况(指针常量、常量指针、const既修饰常量又修饰指针)

指针:通过指针保存一个变量的地址(指针就是地址),进而操控它。

#include <iostream>

using namespace std;

int main()

{

int a = 10;

int *p; // 1、定义指针(创建指针变量)

p = &a; // 2、让指针保存a的地址

cout << "a的地址为:" << &a << endl;

cout << "指针p = " << p << endl;

// 使用指针

// 可以通过“解引用”的方式来找到指针指向的内存

*p = 1000; // *p就是解引用(*p就相当于是一个普通的变量了,只不过它的地址可以不是系统分配的,而是自己指定的地址)

cout << "*p = " << *p << endl;

cout << "a = " << a << endl;

system("pause");

return 0;

}

问?指针也是一种数据类型,它占多少内存空间?

32位操作系统下指针变量占用内存是固定的:4个字节。

64位下就是占8个字节。

(在VS中可以通过Debug来调试,默认是x86,即32位系统下Debug。为什么我的系统是64位的,Debug是x86也能运行?因为64位向下兼容了x86)

空指针和野指针

空指针:指向内存中编号为0的空间

用途:初始化指针变量(一开始你不知道这指针应该指向哪里,那么指向这里就行)

注意空指针指向的内存是不可以访问的(既不能写入,也不能读取),因为编号为0-255这段内存被系统占用了。

不能写入:

 

不能读取:

 

#include <iostream>

#include <string>

using namespace std;

int main()

{

// 空指针

// 1、给指针变量初始化

int *p = NULL; // 一开始你不知道这指针应该指向哪里,那么指向这里就行。系统已经#define NULL 0

// 2、空指针不能被访问。虽然在语法上可以访问,但结果会报错。

// *p = 100; // 不能写入

// cout << " *p = " << *p << endl; // 不能读取

system("pause");

return 0;

}

野指针:指向的是非法的(不是我申请的,那就会导致该指针可能指向一些不该指向的地方)内存空间。

 

const关键字

有三种情况:

  1. const来修饰指针 -->常量指针
  2. const来修饰常量 -->指针常量(区分1、2就是要分清谁是常量,谁是变量
  3. const既修饰指针,又修饰常量

1、常量指针:指针的指向可以修改,但指针指向的值不可以改(常量指针指向的是一个常量,即指向常量的指针)。

 

上图中,如果p是常量指针,那么0x8000就是一个常量的地址,而常量是不能被修改的。

int a = 10;

int b =20;

const int *p = &a; // p是一个常量指针

*p = 200; //错误,因为常量指针指向的值不可以改

p = &b;//正确,可以修改常量指针的指向

 

如果再加一句:

*p = 2000;

这句仍不正确

 

2、指针常量:指针的指向不可以改,但指针指向的值可以修改(也即这是一个常量类型的指针--->该指针本身就是一个常量,它所存的值即其他变量的地址是不能改的)。

 

所以1、2可以这样记:常量指针,即指向常量的指针,也即指向的对象是常量;指针常量,即常量类型的指针,也即这个指针本身就是一个常量。(两个都是从后往前读,不用纠结于叫法,这可能是翻译导致的)。

3、const既修饰指针,又修饰常量:那么指针的指向和指针指向的值都不可以改。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值