前言
对指针的理解会更新在这里,希望自己能一直保持对指针的好奇
和兴趣
,而不是三分钟热度
;指针是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;
}
八.指针和数组
从汇编的角度去看指针和数组
八.引用
用于函数的参数类型
中,提高运行效率
;
九.从项目的角度看指针
十.函数指针
函数指针可以解耦
(远控项目服务端)
六.栈
栈的本质是一段提前分配好
的的内存空间
,主要就是用来存放临时变量,这样子我们只需要管理好栈的读写
就可以避免频繁的内存分配
和不必要的内存浪费
。