指针变量通过*操作符,操作指针变量指向的内存空间,被称为解引用。
所有指针类型在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