深入指针1

1、内存和地址

内存:储存数据的空间。

地址:位置编号。

举一个生活的例子:你在学生宿舍,你的朋友要找到你,只要他知道你的寝室号就可以很快的找到你,类比与计算机,每一个学生就是一个数据,这些数据存放在内存中(内存类比宿舍),而你可以通过地址来找到这个数据(地址类比寝室号)。

在C语言中给地址取名叫指针。

2、指针变量和地址

1、取地址操作符(&)

假如我们有一个变量a那么如何取得它的地址呢?这里就要用到我们的取地址操作符

a的址=&a

2、指针变量和解引用操作符(*)

指针变量也是一种变量,是用于存放地址的变量。

如何创造一个指针变量呢?

void main()
{
	int a = 0;
	int* p = &a;
}

如上p就是一个指针变量,p的类型为int*,存放了a的地址。

我们如何通过p来找到a呢?

这里我们只需要用解引用操作符*即可。

通过这个代码可以看出:*p==a

3、指针变量的意义

我们知道指针变量是储存地址的,长度固定为4/8个字节,那为什么定义指针时还要有不同的类型呢?其实这是为了查找完整的数据,其实指针变量储存的只是第一个字节的地址,那这个数据到底多大?占几个字节?都是不知道的,因此我们需要给指针变量各种不同的类型,

例如:int a=10;int* p=&a;

这里我们就可以知道,在*p的基础上往下再读取3个字节就可以读取完整的数据。

4、const修饰指针

const修饰指针有两种情况

1、const int*p==int const *p

意思是不能改变p指向的变量即不能改变a的量

2、int* const p

意思是不能改变p的指向,即p一种指向a

5、指针的运算

指针的加减

p+1:表示在指向的位置上向后移一个字节。

可以将两个指针变量进行相减得出两个指针相隔几个字节。

也可以将两个字节进行相加,但没有意义。

6、野指针

概念:野指针就是指向的位置不可知,随机的,不确定的。

野指针有三种成因:

1.指针未初始化

2.指针越界访问

3.指针指向的空间释放

7、assert断言

assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报
错终⽌运⾏。这个宏常常被称为“断⾔”。
assert() 的使⽤对程序员是⾮常友好的,使⽤ assert() 有⼏个好处:它不仅能⾃动标识⽂件和
出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问
题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG
⼀般我们可以在 Debug 中使⽤,在 Release 版本中选择禁⽤ assert 就⾏,在 VS 这样的集成开
发环境中,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,
Release 版本不影响⽤⼾使⽤时程序的效率。

  • 31
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值