再探指针与结构体

指针

指针是什么?

电脑内存单元中有许多编号被称为地址,也叫做指针

口头语中说的指针通常指指针变量,是用来存放地址的变量

指针和指针的类型

我们再看下面的操作

这里的int类型的pa指针代码运行时操作了4个字节的数据,而char类型的指针只操作了1个字节的数据

指针类型决定了指针在进行操作时他的权限有多大

指针加减整数

我们看看这段代码

这里的pa+1就跳过了4个字节,pc+1则是跳过了1个字节,说明了类型不同跳过的字节数也不同,-1也同理

野指针

野指针就可以类比成野狗,十分危险

野指针的成因

指针未初始化

指针的越界访问

这里误把for循环的条件写成了

指针指向的空间被释放

这里的num只是个局部变量,当test函数调用完成后num所处的空间就会被释放,但指针p还指向num原先的地址,这个地址不属于num了,这里的p就是野指针

如何规避野指针

指针初始化

小心指针越界

指针指向空间释放,及时置NULL

避免返回局部变量的地址

指针使用前检查有效性

指针运算

指针加减整数

我们可以通过指针加减整数来使指针产生偏移

还有这个

这里*vp++,是先解引用vp,然后将它赋值为0,因为++是后置的,所以赋值完成后才会++,vp才会指向下一个元素

这个vp则刚好相反,是先---,再进行解引用和赋值

写成这样也是能跑的

指针-指针

指针-指针就是计算指针之间的元素个数

两个指针相减的前提是:指针指向的同一块连续的空间

也可以用指针相减来模拟实现一下strlen函数

数组和指针

我们首先来看看下面的代码

这里的p就是指针变量,一级指针变量

pp就是二级指针

a的类型是int;p的类型是int*,这里的 * 则表示p是一个指针,前面的int的意思就是p指向的对象的类型是int;pp的类型是int**,*的意思就是pp是一个指针,int*则表示pp指向的对象的类型是int*

p里面存的是a的地址,pp里面存的是p的地址

指针数组

存放指针的数组

也能写成这样

结构体

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以使不同类型的变量。

结构的声明

结构体变量

这样创建出来的是全局变量

如果上面的是学生类型的话,s1,s2,s3,就是三个不同的学生

而我们一般是使用局部变量,就是s4,这里的s5也是全局变量

结构体的定义和初始化

也可以结构体里面嵌套结构体

或者我们想改数值,这里的age可以改,但是name改了就会报错

要想改name,就得使用strcpy函数

结构体传参和结构体成员访问

这个就属于结构体传参了

这里打印的时候就会用到结构体成员访问,就会用到 .

或者传址,当使用传址时访问结构体 成员就需要用到->

相对于传参,传址能节省空间,推荐传址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值