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修饰指针

有三种情况:

  1. const修饰指针 常量指针
    1. 指针的指向可以更改,但指针指向的值不可以改

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]这类的操作下[ ]的含义又变得不同

那对一个二维数组而言,其本质就是一个二重指针,里层的指针指向元素,外层的指针指向里层的指针,两次[ ][ ]表示运算两次指针+解两次指针

指针数组与数组指针