7 指针
7.1 指针的基本概念
指针的作用: 用于间接访问内存
- 指针的编号是从0开始计数的,一般用16进制表示
- 可以利用指针变量保存地址
7.2 指针的定义和操控
- 定义:
数据类型 * 指针变量名
int *p;
(定义了个指针)p = &a
(调用了指针)- 使用:可以使用解引用的方式来找到指针指向的内存
*p
(表示解引用)
int main()
{
int a = 10;
//创立指针
int *p;
//记录变量a的地址
p = &a;
//解引用
cout << *p<<endl;
*p = 1000; //指针也可以修改内存
cout << a;
return 0;
}
7.3 指针所占的内存空间
- 在32位操作系统下,指针占用4字节
int main()
{
//指针的第二种写法
int a = 10;
int *p = &a;
cout << "*p所占的内存为"<<sizeof(int *); //我这里似乎是64位系统,所以输出结果是8
return 0;
}
7.4 空指针与野指针
-
**空指针 :**指向内存中位0位的指针
-
**野指针:**初始化指针
-
空指针指向的的内存是无法被访问的
-
**野指针:**指针指向非法的内存空间
- 在没有申请内存的情况使用指针访问这串内存
7.5 const修饰指针
有三种情况:
- const修饰指针 常量指针
-
- 指针的指向可以更改,但指针指向的值不可以改
7.6 数组与指针的关系[原创]
- 对于一个数组而言,我们可以把它理解为一段内存地址 + 一个指针: 其中,指针名就是指向第一个内存地址的指针
a [内存地址1][内存地址2][内存地址3].....
|-> 指针名字|->地址1
|-----------------------> 地址2
重新审视数组定义:
int arr[n] --> 数组大小 *1
| |--> 数组名称 *2
|-> 数组类型 *3
再来审视一下指针定义
int *p = NULL --> 指针指向的变量
| |->指针名称
|->指针类型
- 那对于一个数组而言,我们不妨把数组名字当作一个指针名,而 [ ] 当作一个解指针+指针运算的方式
*(p + 0) == p[0]
Tip
注意:
[ ]
是确实存在的,并且不仅是数组可以使用,但是注意在定义指针数组的时候,int *p[a]
这类的操作下[ ]的含义又变得不同
那对一个二维数组而言,其本质就是一个二重指针,里层的指针指向元素,外层的指针指向里层的指针,两次[ ][ ]表示运算两次指针+解两次指针