指针:通过指针保存一个变量的地址(指针就是地址),进而操控它。
#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关键字
有三种情况:
- const来修饰指针 -->常量指针
- const来修饰常量 -->指针常量(区分1、2就是要分清谁是常量,谁是变量)
- 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既修饰指针,又修饰常量:那么指针的指向和指针指向的值都不可以改。