1. 定义
C/C++提供了让我们直接操作内存的机会,这种机会就是利用指针,指针要有两个要素:
- 要操作的内存地址;
- 要操作的内存大小。
2. 指针的语法
2.1. 声明方式一
数据类型* 变量名称;
int* a{};
2.2. 声明方式二
数据类型 *变量名称;
int *b{};
2.3. 注意点
int* a,b; // a是指针,b是int类型的数据
//希望a,b都是指针,可如下声明
int *a, *b;
3. 运算符
3.1. 取址运算符&
既然指针是用来操作内存的,那如何获取
一个变量的内存地址呢?
利用取址运算符&
。
int a = 100;
int *p = &a;
此时,p
就是a
的内存地址。
3.2. 间接运算符*
如何读写
一个指针指向的内存空间 ?
利用间接运算符*
int a = 5000;
int *p = &a;
*p = 500;
*p = 500;
就代表在a的内存地址里写入500。
3.3. 综合
int a = 5000;
int *p = &a;
*p = 100;
std::cout << "内存地址 p= " << p <<"\n *p = "<< *p << "\n a= " << a;
// p = 006FF81C
// *p = 100;
// a = 100;
4. 指针数组
指针的本质其实就是一种特殊的变量类型,因此指针也可以通过数组的方式声明。
int* pArray[10];
5. 指针的大小
int a{100};
int *p {&a};
std::cout << sizeof(p)<<std::endl; //4
char *cp{};
std::cout << sizeof(cp)<<std::endl; //4
- 在32位操作系统下,指针的寻址最大范围是2^32, 即4GB ,即0xFF FF FF FF;0xFF为1个字节,所以,
32位操作系统
的指针,4字节
即可满足寻址要求。 - 同上,
64位操作系统
下,指针的大小为8字节
;
6. 指针的运算
6.1 实验一
int a[]{1001, 2001, 3001, 4001};
int* ptr{ &a[0] };
std::cout << (*ptr)++ << std::endl; //1001 (*ptr) 即 a[0] 的值,先打印(*ptr),再做 ++ 运算
std::cout << a[0] << std::endl; //1002
6.2. 实验二
int a[]{ 1001, 2001, 3001, 4001 };
int* ptr{ &a[0] };
std::cout << ptr << std::endl; // 00F9FA50
std::cout << *ptr++ << std::endl; // 1001 先显示*ptr的值,然后让ptr++
std::cout << a[0] << std::endl; // 1001
std::cout << ptr << std::endl; // 00F9FA54 指针 + 1,就是 “指针 + 指针类型的大小”(本例就是 int类型的指针 ,4个字节)
std::cout << &a[1] << std::endl; // 00F9FA54
std::cout << *ptr << std::endl; //2001
6.3. 实验三
int a[]{ 1001, 2001, 3001, 4001 };
int* ptr{ &a[0] };
int** pptr{&ptr};
*pptr = &a[1];
std::cout << *ptr << std::endl;