1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C程序设计语言现代方法11:指针

C程序设计语言现代方法11:指针

时间:2019-08-18 19:23:35

相关推荐

C程序设计语言现代方法11:指针

目录

1. 指针变量

1.1 指针变量含义

1.2 int *p含义

1.3 指针变量4句圣经

2. 指针与函数

2.1 指针作为函数参数

2.2 指针作为函数返回值

3. 指针的四大用途

4. 什么是NULL指针

4.1 NULL的定义

4.2 NULL的作用

4.3 什么时候将指针变量赋值为NULL

4.4 和if语句配合使用

5. 野指针

5.1 什么是野指针

5.2 野指针的来源

1. 指针变量

1.1 指针变量含义

指针就是地址,指针变量就是存储地址的变量

说明1:不能使用普通整型变量存储地址的原因

① 类型尺寸不同(64位架构中,地址为8B,但int可能仍为4B)

② 取值范围不同(比如地址不会是负数)

说明2:可用printf + %p 输出指针变量的值

1.2 int *p含义

① p指向int类型的对象

② p的属性,

a. p的值,即地址

b. p指向对象的类型(用于指针的算术运算)

说明:指针的基类型

正是因为在C语言中,指针包含了他所指向数据的类型信息(进而可以知道该数据占有的内存字节数),所以对于指针的运算只需要给出指针偏移的位置就行,而不需要我们计算具体的字节数。(以指向的数据类型为单位,不以内存字节为单位)

1.3 指针变量4句圣经

① 如果p指向一个对象,*p就是这个对象

② &对象,得到一个指向该对象的指针,且该指针指向类型就是对象的类型

③ 数组名在表达式中被解释为指向第一个数组元素的指针,该指针指向类型就是元素的类型

④ 对指针的算术运算(如p + 1)以指针指向对象的类型为单位

注意:&只能取左值的地址

2. 指针与函数

int *max(int *a, int *b){if (*a > *b)return a;elsereturn b;}

2.1 指针作为函数参数

指针作为函数参数,如果要表明函数不会修改指针所指向的对象,可用const修饰(const int *a)

好处:

① 给阅读者明显提示

② 防止函数对a指向对象的错误修改(此类错误编译器可检查)

2.2 指针作为函数返回值

可返回的指针类型如下,

① 指向实参的指针(如上例)

② 指向全局变量的指针

③ 指向声明为static的局部变量的指针

④ 指向malloc分配的内存的指针

绝对不能返回指向自动局部变量的指针!!!

关键:函数返回后,函数返回的指针所指向的内存是否有效

说明1:以指针变量作为形参依然是值传递,只不过这个值是一个地址而已(C语言只有值传递这一种参数传递方式)

说明2:跟指针用作函数参数是为了向函数传递较大体积的数据一样,用指针作为函数的返回值,很多时候也同样是为了向函数外传递较大体积的数据,以减少函数返回时传递的数据量,提高效率

3. 指针的四大用途

① 通过指针访问他所指向的数据

② 通过指针的加减运算,使得指针发生偏移,进而访问某一个范围内的批量数据

③ 通过指针在函数间传递数据

a. 尤其是传递大体积数据

b. 如果想在函数内容部修改函数外部的数据,则必须使用指针

④ 通过指针在函数之间传递操作,调用函数(回调函数)

如果指针指向的是某个函数,我们也可以通过这个指针调用他所指向的函数。通过向函数传递指向另一个函数的指针,进而在函数中通过这个指针调用他所指向的函数,可以起到向函数传递操作,对函数的动作进行自定义的效果。而这也正是那些通用函数之所以能够通用(能够根据不同情况执行不同动作)的最重要原因

典型实例:qsort函数

#include <stdlib.h>void qsort(void *base, size_t nmemb, size_t size,int (*compare)(const void *, const void *));

4. 什么是NULL指针

4.1 NULL的定义

实际上NULL是一个宏,定义如下,

4.2 NULL的作用

因为0值的特殊性,我们常常用NULL表示一个指针变量是一个空指针,他并没有指向一个正确的内存地址,而是一个无效的不可访问的指针

4.3 什么时候将指针变量赋值为NULL

① 指针变量尚无法使用的时候

e.g. 指针变量刚定义完成

② 指针变量已经使用完毕,他所指向的内存已经被释放

e.g. 在使用free函数释放内存资源后,将指向这一内存资源的指针变量赋值为NULL

4.4 和if语句配合使用

在使用指针变量之前,用if语句检查这些指针变量的值是否为NULL,从一定程度上可以避免对于无效指针的访问

说明:还可以使用assert断言来判断这些条件,assert断言判断失败时,会向stderr打印错误信息并终止进程

5. 野指针

5.1 什么是野指针

指向不在本程序管理范围内的内存的指针

5.2 野指针的来源

① 指针变量没有被合理的初始化

任何局部指针变量的缺省初始值为随机值

② 指针变量错误地指向已经被释放的内存

a. 指向已经被free函数释放掉的动态内存

在C语言中,free函数只是把指针所指向的内存释放掉,但并没有把指向这一内存区域的指针本身也设置为NULL

b. 指针访问超越了他所指向的变量的生存期

最典型的就是返回指向函数内自动局部变量的指针

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。