指针变量通过*操作符,操作指针变量指向的内存空间,被称为解引用。
所有指针类型在32位操作系统下是4个字节,64位是8个字节。
int a = 10;
int *p; // 定义了一个整型指针p。 *表示p是一个指针
p = &a; // 将变量a的地址赋给指针p。 &是取地址运算符
cout << "a的地址为:" << &a << endl;
cout<<"指针p为:" << p << endl;
// 使用指针 :指针前面加个*
// 这种方式被称为解引用
cout << "a为:" << a << endl;
cout << "*p为:" << *p << endl;
*p = 1000;
cout << "*p为:" << *p << endl;
// 通过&符号获取变量地址
// 通过指针记录地址
// 普通变量存放数据,指针变量存放地址
// 指针变量通过*操作符,操作指针变量指向的内存空间,被称为解引用
int b = 2;
int* q = &b;
cout << "sizeof int * = " << sizeof(int*) << endl;
cout << "sizeof double * = " << sizeof(double*) << endl;
cout << "sizeof char * = " << sizeof(char*) << endl;
cout << "sizeof float * = " << sizeof(float*) << endl;
cout << "sizeof string * = " << sizeof(string*) << endl;
// 所有指针类型在32位操作系统下是4个字节,64位是8个字节
输出:
a的地址为:000000C7419BFA04
指针p为:000000C7419BFA04
a为:10
*p为:10
*p为:1000
sizeof int * = 8
sizeof double * = 8
sizeof char * = 8
sizeof float * = 8
sizeof string * = 8
空指针:指针变量p指向内存地址编号为0的空间。
去酒店前台询问房间,但是前台给了一个不存在的房间号,比如“0号房间”。当你尝试去找这个房间时,会发现酒店根本没有这个房间,因为“0号房间”通常用来表示没有分配房间。可以安全地持有这个空指针,但是你不能尝试访问它所指向的“房间”,因为这样的“房间”根本不存在。
野指针: 指针变量q指向非法内存空间。
类比为去酒店开房间,本应该打开自己开的房间,但是却要去开其他客人的房间。每个房间(内存地址)都属于某个客人(程序或系统的一部分),如果你试图进入别人的房间(访问不属于你的内存地址),那么这是不被允许的,可能会导致安全问题或冲突。
#include <iostream>
using namespace std;
int main()
{
// 1.空指针: 指针变量p指向内存地址编号为0的空间
int* p = NULL;
// 空指针是不可访问的
// 内存地址编号0-255为系统占用,不可访问
cout << *p << endl; //报错 空指针
// 2.野指针: 指针变量q指向非法内存空间
int* p1 = (int*)0x1100;//报错 指向未知或未初始化内存的指针
// 尝试访问一个未经分配的地址会导致崩溃
// 实际编程中 应当避免直接访问特定的内存地址
// 正确做法是 先将内存地址分配给某个变量,再去进行访问
int i = (int)0x1100;
int* q = &i;
cout << *q << endl;
//int* ptr = new int; // 分配内存
//*ptr = 5; // 初始化内存
int* ptr = new int(5); //分配并初始化内存
cout << *ptr << endl; // 使用内存
delete ptr; // 释放内存
system("pause");
return 0;
}
const修饰指针有三种情况
- const修饰指针 — 常量指针
- const修饰常量 — 指针常量
- const即修饰指针,又修饰常量
int main()
{
int i = 10;
int j = 10;
// 当const修饰指针时, 指针指向可以改,指针指向的值不可改
const int* p = &i;
p = &j;
cout << *p << endl;
// 当const修饰常量时,指针指向的值可以改,指针指向不可改
int* const q = &i;
*q = 1200;
cout << *q << endl;
// const既修饰指针也修饰常量时
const int* const q1 = &i;
// 指针指向的值和指针指向都不可改
system("pause");
return 0;
}
输出:
10
1200