一·指针的引入与定义
1.计算机把内存划分为一个个小单元格,每个单元格占一个字节。
2.每个内存都有一个编号,这个编号叫做地址,C语言中把地址叫做“指针”。
编号=地址=指针
二·指针的大小
**指针变量的大小取决于存放地址需要多大空间,与指向的变量类型无关。**如32位机器上,地址线是32条,存放地址的二进制顺序就是32bit位。因此要把这个地址存起来,需要4个字节,也就是32个比特位空间。所以32位机器的指针大小就是4个字节。
三·指针的解引用
指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节
四·指针±整数
指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)
char 类型的指针变量+1跳过1个字节, int 类型的指针变量+1跳过了4个字节。**
这就是指针变量的类型差异带来的变化。
注意:
pa是指针变量,里面存放地址
*pa是对变量的解引用,相当于a
五·void*指针
void*指针是无类型指针,可以接受任意类型指针。
但也有局限性:该种指针不能进行指针±整数和解引用运算。
六·const修饰指针
1.const常属性---->值不变
2.const修饰指针
(1)
const在*左侧,限制的是 * p,意思是指针所指向的内容不能通过指针来修改,但对指针变量本身没有影响。
*p=20;//err
int b=0;
p=&b;//ok
(2)
const在 * 右侧,限制的是p,意思是指针的内容不能修改,但指针指向的内容可以通过指针进行修改。
*p=20;//ok
p=&b;//err
3.都被限制了
4.注意:
七·指针运算
1.指针±整数(指针加整数就是指针相应的往后走几个字节,之后还是指针)
2.指针-指针(指针-指针的绝对值是指针与指针之间的元素个数,前提是两个指针指向同一块空间)
3.指针的关系运算(其实就是指针比较大小,地址比较大小)
p一开始存的是数组第一个元素的地址,arr+sz也是地址
八·野指针
1.野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
2.野指针成因:
(1)指针未初始化;
(2)指针越界访问;
(3)指针指向的空间释放。
(图中n为局部变量,出了函数就被销毁了,所以p变成了野指针)
3.如何规避野指针
(1)给指针初始化
(2)指针变量不再使用时,即使置NULL,等到再使用时检查其有效性。
九·assert断言
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报
错终⽌运⾏。这个宏常常被称为“断⾔”。
注意:
1.assert使用前加 #include <assert.h>
2.assert()中加入语句,如果语句为真,则对程序没什么用;若为假,则会终止程序运行并报错。
3.如果已经消除了bug,可以在程序最前面加上 #define NDEBUG便可消除assert对程序影响。