【指针~】

前言

对指针的理解会更新在这里,希望自己能一直保持对指针的好奇兴趣,而不是三分钟热度;指针是C/C++语言的精髓,从指针的理解深度可以一定程度上看出一个程序员的编程水平。

一.指针

基于前面的基本数据类型自己写代码去猜测和验证后,你会发现指针存储的是内存地址,都是4个字节,输出(控制台)的时候字符指针会当成字符处理,经过acsii字符表转换后输出数字对应的符号,而不会直接输出内存地址;指针包含了两个重要信息:要操作的内存地址,要操作的内存大小;

在这里插入图片描述

#include <iostream>
using namespace std;	
int main(int argCount/*有效参数个数*/, char* argv[], char* env[])
{
	char num2{ 65 };
	char* ptrB{ &num2 };
	std::cout << ptrB << (char)10;
	ptrB++;
	std::cout << ptrB << (char)10;
}
二.指针数组

一维数组

#include <iostream>
using namespace std;	
int main(int argCount, char* argv[], char* env[])
{
	int students[2]{ 1001,1002 };
	int* ptrStudens[3];
	for (int i = 0; i < 3; i++)
	{
		ptrStudens[i] = &students[i];
		std::cout << "内存地址:" << ptrStudens[i] << "值:" << *ptrStudens[i] << (char)10;
	}
	return 0;
}

二维数组

#include <iostream>
int main()
{
	int studentId[2][2]
	{ 
		{10001,10002},
	    {20001,20002}
	};

	int* ptrStudentId[2][2];

	for (int x = 0; x < 2; x++)
	{
		for (int y = 0; y < 2; y++)
		{
			ptrStudentId[x][y] = &studentId[x][y];

			std::cout << "内存地址:" << ptrStudentId[x][y] << "值" << *ptrStudentId[x][y] << "\n";
		}
	}

}

三.指针补充
  • 为什么所有的指针大小都是4个字节(x86架构下)?
    答:指针的本质就是一个内存地址,内存地址的本质是一个整数,而这个整数的意义在于表达你的内存的总共范围是多少!在x86架构下内存范围为[0-2^32],而4个字节刚好可以存储这个范围;

  • 类型转换
    不同类型的指针不能相互赋值,在保证安全转换的前提上可以进行强制类型转换;(反复练习,反复理解)

五.指针运算(++,–)

指针+1 => 整数值 + 1*指针类型的大小

六.多级指针

游戏基址中去体会这种用法;
指针变量也是变量,也是占内存地址的!

七.指针中难理解的概念
  • 常量指针:const在基本数据类型结构体之前;
#include <iostream>
using namespace std;
int main(int argCount, char* argv[], char* env[])
{
	const int a{ 1000 };
	const int b{ 2000 };
	const int* cPtr{ &a };
	int num = 8;
	//*cPtr = 3000;
	cPtr = &b;
	return 0;
}
  • 指针常量:const在指针名之前;
#include <iostream>
using namespace std;
int main(int argCount, char* argv[], char* env[])
{
	int a{ 1000 };
	int b{ 2000 };
	int* const cPtr{ &a };
	*cPtr = 3000;
	//cPtr = &b;
	return 0;
}
  • 指向常量的常量指针
#include <iostream>
using namespace std;
int main(int argCount, char* argv[], char* env[])
{
	const int a{ 1000 };
	const int b{ 2000 };
	const int* const ptr{ &a };
	//*ptr = 900;
	//ptr = &b;
	return 0;
}
  • 思考题:为啥a值还是1000
#include <iostream>
using namespace std;
int main(int argCount/*有效参数个数*/, char* argv[], char* env[])
{
	const int a{ 1000 };
	const int b{ 2000 };
	int* ptrA{ (int*)&a };
	*ptrA = 9500;
	cout << *ptrA << (char)10;
	cout << a << (char)10;
	return 0;
}
八.指针和数组

从汇编的角度去看指针和数组

八.引用

用于函数的参数类型中,提高运行效率
在这里插入图片描述

九.从项目的角度看指针
十.函数指针

函数指针可以解耦(远控项目服务端)

六.栈

栈的本质是一段提前分配好的的内存空间,主要就是用来存放临时变量,这样子我们只需要管理好栈的读写就可以避免频繁的内存分配和不必要的内存浪费

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值