一、指针
1.指针的概念
指针就是地址,口语中说的指针通常指的是指针变量。
指针变量,就是用来存放地址的变量。
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。
2.指针的类型
char*
int*
short*
long*
float*
double*
1)指针的类型决定了指针向前或向后走一步有多大(距离)。
2)指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如:char*的指针解引用就只能访问一个字节,而int*的指针解引用就能访问四个字节。
3.野指针
定义:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
成因:1)指针未初始化;2)指针越界访问;3)指针指向的空间释放。
如何规避:
1)指针初始化
2)小心指针越界
3)指针指向空间释放及时置NULL
4)避免返回局部变量的地址
5)指针使用之前检查有效性
4.指针运算
指针—指针得到的是两个指针之间的元素个数。
注:指针和指针相减的前提:两个指针指向同一块空间。
标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针比较。
5.指针数组
指针数组是数组,是存放指针的数组。
int* arr[5];
arr是一个数组,有5个元素,每个元素都是一个整型指针。
6.const的作用
const修饰指针变量的时候:
1)const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变,但是指针变量本身的内容可变。
2)const如果放在*的右边,修饰的是指针变量本身,保证指针变量的内容不能修改,但是指针指向的内容可以通过指针改变。
二、结构体
1.结构体的概念
结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
例如描述一本书:
struct Book
{
char name[20];//书名
int price;//价格
char id[12];//书号
};
2.结构体的定义和初始化
struct Book
{
char name[20];
int price;
char id[12];
}b4, b5, b6;//b4,b5,b6是全局变量
int main()
{
//b1,b2,b3是局部变量
struct Book b1 = {"三体", 20, 123456};//初始化
struct Book b2;
struct Book b3;
return 0;
}
3.结构体成员的访问
. 结构体.成员名
-> 结构体指针->成员名
4.结构体传参
结构体传参的时候,要传结构体的地址。
原因:1)函数传参的时候,参数是需要压栈的;2)如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,会导致性能的下降。
三、实用调试技巧
常用快捷键
F5
启动调试,经常用来直接跳到下一个断点处。
F9
创建断点和取消断点。
可以在程序的任意位置设置断点,这样就可以让程序在想要的位置随意停止执行,继而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11
逐语句,就是每次执行一条语句,可以使我们的执行逻辑进入函数内部(这是最常用的)。
CTRL+F5
开始执行不调试。