没看过我之前的文章,可以看看哦
1 C++数据类型
2 C++之程序流程结构
3 C++之数组
4 C++之排序算法
5 C++之初识函数
6 C++之字符串
持续更新ing
目录
5 指针
5.1 指针的基本概念
指针的作用:可以通过指针间接访问内存
- 内存编号是从0开始记录的,一般用十六进制数字表示
- 可以利用指针变量保存地址
5.2 指针变量的定义与使用
语法:
数据类型 * 变量名
代码示例:
//1、定义一个指针
//指针定义的语法:数据类型*指针变量名
int a = 10;
int *p;
//让指针记录变量a的地址
p = &a;//或者直接int *p=&a;
cout << "a的地址为:" << p << endl;
//2、使用指针
//可以通过解引用的方式来找到指针指向的内存
//指针前加*代表解引用,找到指针指向的内存中的数据
*p = 1000;
cout << "a=" << *p << endl;
运行结果:
a的地址为:00F6FC7C
a=1000
注意:
int* p中int* 是指向int型的指针。这表明,* p 的类型为int。由于 * 运算符被用于指针,因此p变量本身必须是指针。我们说p指向 int类型,我们还说p的类型是指向int 的指针,或int * 。可以这样说, p是指针(地址),而* p是 int,而不是指针。而int * p=&a中,被初始化的是指针,而不是它指向的值,也就是将p的值设置为&a。
5.3 指针所占内存空间
有两点需要说明:
-
在32位操作系统下,指针是占4个字节空间大小(不管是什么数据类型)
-
在64位操作系统下,指针是占8个字节大小(不管是什么数据类型)
代码示例:
//指针所占内存的空间大小
int a = 10;
int *p = &a;
//在32位操作系统下,指针是占4个字节空间大小(不管是什么数据类型)
//在64位操作系统下,指针是占8个字节大小
cout << "sizeof int *=" << sizeof(int *) << endl;
cout << "sizeof char *=" << sizeof(char *) << endl;
cout << "sizeof double *=" << sizeof(double *) << endl;
cout << "sizeof float *=" << sizeof(float *) << endl;
运行结果(默认32位):
sizeof int *=4
sizeof char *=4
sizeof double *=4
sizeof float *=4在vs中,改成64位,如下图
运行结果:
sizeof int *=8
sizeof char *=8
sizeof double *=8
sizeof float *=8
5.4 空指针和野指针
空指针: 指针变量指向内存中编号为0的空间
用途: 初始化指针变量
注意: 空指针指向的内存是不可以访问的
代码示例:
//初始化指针,NULL为0
int *p = NULL;
//空指针不可访问
//0~255之间的内存编号是系统占用的,不允许用户访问
cout << *p << endl;
引发了异常: 读取访问权限冲突。
p 是 nullptr。
野指针: 指针变量指向非法的内存空间
代码示例:
//野指针
//在程序中,尽量避免出现野指针
int *p = (int *)0x1100;
cout << *p << endl;
引发了异常: 读取访问权限冲突。
p 是 0x1100。
总结:空指针和野指针都不是我们申请的空间,因此不要访问。
5.5 new运算符
前面我们都将指针初始化为变量的地址;变量是在编译时分配的有名称的内存,而指针只是为可以通过名称直接访问的内存提供了一个别名。指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在这种情况下,只能通过指针来访问内存。在C++可使用new运算符来分配内存。在运行阶段为一个int值分配未命名的内存,并使用指针来访问这个值。这里的关键所在是C++的new运算符。程序员要告诉new,需要为哪种数据类型分配内存;new将找到一个长度正确的内存块,并返回该内存块的地址。程序员的责任是将该地址赋给一个指针。下面是一个这样的示例:
int *p = new int;
new int告诉程序,需要适合存储int的内存。new运算符根据类型来确定需要多少字节的内存。然后,它找到这样的内存,并返回其地址。接下来,将地址赋给p,p是被声明为指向int 的指针。现在,p是地址,而*p是存储在那里的值。
int *p1 = new int;
*p1 = 100;
cout << "sizeof *p1=" << sizeof(*p1) << endl;
cout << "*p1=" << *p1 << endl;
cout << "p1=