指针,解引用,空指针,野指针,常量指针(const+指针),指针常量(const+常量)

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

  1. const修饰指针 — 常量指针
  2. const修饰常量 — 指针常量
  3. 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值