1. 指针是什么?
指针理解的2个要点:
1. 指针是内存中一个最小单元的编号,也就是地址
2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
那我们就可以这样理解:
内存
2.指针变量
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个
变量就是指针变量
3.总结:
指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
问题是:
1.一个小的单元到底是多大?(1个字节)
2.如何编址?
经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。
对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电
平(低电压)就是(1或者0);
那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
...
11111111 11111111 11111111 11111111
这里就有2的32次方个地址。
每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB ==
2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB) 4G的空间进行编址。
同样的方法,那64位机器,如果给64根地址线,那能编址多大空间,自己计算。
这里我们就明白:
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以
一个指针变量的大小就应该是4个字节。
那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地
址。
总结:
指针变量是用来存放地址的,地址是唯一标示一个内存单元的。
指针的大小在32位平台是4个字节,在64位平台是8个字节
2. 指针和指针类型
这里可以看到,指针的定义方式是: type + * 。
其实:
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
总结:指针类型决定了,指针在被解引用的时候,访问的权限
整型指针解引用访问4个字节
字符指针解引用1一个字节
这里char指针只能改变第一个字节的内容
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
数组传参
不管是一维数组还是二维数组,在传参的时候,都不会去创建数组,所以数组的大小不需要明确指定.二维数组不管是创建还是传参都不可以省略列.
如果创建一个整型数组,用字符型指针接收,那一定要强制类型转换.
野指针
创建一个空指针一定要初始化,小心指向数组的时候越界,避免传局部变量超过有效范围
这里的a是函数里的局部变量,出了函数就被销毁了,那么主函数指向a地址的指针就会变成一个野指针
数组与指针
p+i 其实计算的是数组 arr 下标为i的地址。
那我们就可以直接通过指针来访问数组。
二级指针
指针数组
是一个数组,只不过存放的是指针
反汇编
第一步,先调试窗口 F10
第二步再右击点反汇编
1.我的编译器
1.将1放到a(1)这个地址里
将a地址的内容放到eax这个寄存器里
前三行代码,意思就是将+1的值放入a的地址
这款里的意思就是将a(2)里的内容放入ecx寄存器里,然后ecx再放入b(6)里
这里就是分别对a进行++,放到edx再放入eax最后放到a(4)里面
总结.这里的编译器就是先计算第一个a括号里的内容,然后直接相加得b
2.别人的
结构体的简化声明
在主函数前使用typedef struct S 来声明结构体,在主函数里直接用
S->代表struct S
结构体的初始化
struct Stu s = {"zhangsan", 20};//初始化
跟数组类似
结构体传参=>
访问结构体
//结构成员访问操作符
//. 结构体变量.结构体成员
//-> 结构体指针->结构体成员
调试
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优
的,以便用户很好地使用。
可以发现,因为在数组中i9的时候,数组地址越界访问只能停留在原地,所以死循环
快捷键
F5
启动调试,经常用来直接跳到下一个断点处。
F9
创建断点和取消断点
断点的重要作用,可以在程序的任意位置设置断点。
这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最
长用的)
(2条消息) VS中常用的快捷键_MrLisky的博客-CSDN博客_vs快捷键
反汇编是底层代码,可以看到底层原理
而寄存器可以通过寄存器看到地址
调用堆栈可以看到函数调用情况