指针
指针是什么?

电脑内存单元中有许多编号被称为地址,也叫做指针
口头语中说的指针通常指指针变量,是用来存放地址的变量




指针和指针的类型
我们再看下面的操作
这里的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函数
![]()
结构体传参和结构体成员访问
这个就属于结构体传参了


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

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


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

被折叠的 条评论
为什么被折叠?



