C语言---指针(1)

在这里插入图片描述

一·指针的引入与定义

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对程序影响。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值