
程序设计基础 第9章 指 针 1120
1/20 第9章 指 针 程序设计基础

指针的故事 该程序执行了非法操作,即将关闭”。 ◆这种错误几乎全是由指针和数组导致的。 ■ 黑客攻击服务器利用的bug绝大部分都是 指针和数组造成的。 某些用C的人,尽量避免使用指针。 t Dbeng6 San16 该程序执行了非法操作,即将关闭。 如果仍有问题,请与程序供应商联系, 该程序执行了非法操作,即将关闭。 夫团C 如果仍有问题,请与程序供应商联系。 产光模 详细资料鱼) -3rr8960 -00000872-018r21二00098-0080 220
指针的故事 ◼ “该程序执行了非法操作,即将关闭”。 ◆ 这种错误几乎全是由指针和数组导致的。 ◼ 黑客攻击服务器利用的bug绝大部分都是 指针和数组造成的。 ◼ 某些用C的人,尽量避免使用指针。 2/20

指针的故事 1nH8无 ■是“稀饭”最挚爱的武器 ◆稀饭=C Fans ■很多“Mission Impossible'” 由指针完成 ◆大多数语言都有无数 的“不可能” alads ◆而C语言是 ■“一切皆有可能”一 ■'Impossible is Nothing” 冯 3/20
指针的故事 ◼ 是“稀饭”最挚爱的武器 ◆ 稀饭 == C Fans ◼ 很多“Mission Impossible” 由指针完成 ◆ 大多数语言都有无数 的“不可能” ◆ 而C语言是 ◼ “一切皆有可能” —— ◼ “Impossible is Nothing” —— 3/20

关于指针的原则 ■学习原则 ◆一定要“Enjoy it!! ◆其实通常的应用很简单。 ■就是一个变量。 ◆复杂的应用也不建议使用。 KISS-Keep It Simple Stupid ■使用原则 ◆永远要清楚每个指针指向了哪里? ◆永远要清楚每个指针指向的地方存放的是什么? ■了解程序实现,掌握底层细节 ◆C语言都是通过地址来存取数据或指令的。 ◆对地址的存储是通过指针变量来实现的。 恩 4/20
关于指针的原则 ◼ 学习原则 ◆ 一定要“Enjoy it!” ◆ 其实通常的应用很简单。 ◼ 就是一个变量。 ◆ 复杂的应用也不建议使用。 ◼ KISS——Keep It Simple & Stupid ◼ 使用原则 ◆ 永远要清楚每个指针指向了哪里? ◆ 永远要清楚每个指针指向的地方存放的是什么? ◼ 了解程序实现,掌握底层细节 ◆ C语言都是通过地址来存取数据或指令的。 ◆ 对地址的存储是通过指针变量来实现的。 4/20

案例 #include int main( { +多绘古架力方案并关闭程等 int a[3]; ◆关用明 ◆两形左序 for(int i=0;i<=3;i++) scanf("%d",&a[i]); return 0 冯 5/20
案例 5/20 #include int main() { int a[3]; for(int i=0;i<=3;i++) scanf("%d",&a[i]); return 0 }

本章知识点 ■9.1地址和指针 ■9.2指针变量 ■9.3指向数组的指针变量 ■9.4函数指针变量 ■9.5回指针值的函数 ■9.6指针数组和指向指针的指针 6/20
本章知识点 ◼ 9.1 地址和指针 ◼ 9.2 指针变量 ◼ 9.3 指向数组的指针变量 ◼ 9.4 函数指针变量 ◼ 9.5回指针值的函数 ◼ 9.6指针数组和指向指针的指针 6/20

9.1地址与指针 ■宿舍(变量) 内存用户数据区 ■宿舍编号(变量的地址) ■存放宿舍编号的宿舍(指针变量) 变量对应一个内存单元 2000 3 变量i 2004 6 变量j ■变量类型决定对应内存单元的长度。 2008 9 变量k ◆整型变量一4个字节。 ◆单精度浮点型变量一4个字节。 3010 2000 变量ipointer ◆字符型变量一1个字节。 : ■地址:内存中每个字节的编号 ■变量的指针:该变量的地址 内存单元的地址 ■指针变量:存放另一个变量地址(即指针)的 Vs. 变量 内存单元的内容 7120
9.1 地址与指针 ◼ 宿舍 (变量) ◼ 宿舍编号(变量的地址) ◼ 存放宿舍编号的宿舍(指针变量) ◼ 变量对应一个内存单元 ◼ 变量类型决定对应内存单元的长度。 ◆ 整型变量——4个字节。 ◆ 单精度浮点型变量——4个字节。 ◆ 字符型变量——1个字节。 ◼ 地址:内存中每个字节的编号 ◼ 变量的指针:该变量的地址 ◼ 指针变量:存放另一个变量地址(即指针)的 变量 7/20

内存单元的访问方式 ■直接存取(直接访问)方式直接用编号 ◆通过变量名来对内存单元进行存取操作的方式。 ■间接存取(间接访问)方式先找放编号的地方,拿编号 ◆通过指针变量中保存的地址,找到对应的存储单元,并对 该单元进行操作的方式。 p *p i 3 2000 &i 二3 2000 3000 2000 直接访问 间接访问 int i; int i,*i pointer; i=3; i_pointer=&i; *i pointer=3; 恩 8/20
内存单元的访问方式 ◼ 直接存取(直接访问)方式 直接用编号 ◆ 通过变量名来对内存单元进行存取操作的方式。 直接访问 间接访问 2000 3 ◼ 间接存取(间接访问)方式 先找放编号的地方,拿编号 ◆ 通过指针变量中保存的地址,找到对应的存储单元,并对 该单元进行操作的方式。 8/20 2000 &i p *p i 2000 3 3000

9.2指针变量 类型说明符*变量名; 指针变量所指 表示定义指针变量 向数据类型 不是*’运算符 合法标识符 先定义后使用,在定义时必须指定指针变量所指向变量的类型 ◆inti,j;l定义整型变量i,j ·int*pointer_1,*pointer.2;∥定义指向整型变量的指针变量 ◆float*pointer3∥定义指向单精度型数据的指针变量 ◆char*pointer.4∥定义指向字符型数据的指针变量 系统为指针变量分配4个字节的存储单元,用来存放变量的地址(整型值) p *p a b 两个与指针变量有关的运算符: ◆&取地址运算符 2000 ◆*指针运算符(或称间接访问运算符) &a ■ 例如: ◆inta=3;1&为变量的a的地址,a的值为33000 2000 ·int*p=&a;∥变量p的值初始化为变量a的地址 ◆intb=*p+4/b的值? 恩 920
9.2 指针变量 ◼ 先定义后使用,在定义时必须指定指针变量所指向变量的类型 ◆ int i, j;//定义整型变量i,j ◆ int *pointer_1, *pointer_2; //定义指向整型变量的指针变量 ◆ float*pointer_3 //定义指向单精度型数据的指针变量 ◆ char *pointer_4 //定义指向字符型数据的指针变量 ◼ 系统为指针变量分配4个字节的存储单元,用来存放变量的地址(整型值) 类型说明符 *变量名; 合法标识符 表示定义指针变量 不是‘*’运算符 指针变量所指 向数据类型 9/20 ◼ 两个与指针变量有关的运算符: ◆ & 取地址运算符 ◆ * 指针运算符(或称间接访问运算符) ◼ 例如: ◆ int a=3; //&为变量的a的地址,a的值为3 ◆ int *p=&a; //变量p的值初始化为变量a的地址 ◆ int b=*p+4 //b的值? p a 2000 3 3000 b 7 *p 2000 &a

指针变量的赋值 > 初始化赋值 类型说明符*指针名=初始地址值; 例inti; 变量必须已说明 过类型应一政 int *p=&i; 例 int i; 用已初始化指 int *p=&i; 针变量作初值 int *q=p9 2000 ←整型变量a 赋值语句赋值 20 例inta; int ←指针变量p >.2000 例inta=20; ←指针变量q int *p,*q; 2000 p=&a; q=p; 10/20
例 int i; int *p = &i; 指针变量的赋值 ➢ 初始化赋值 类型说明符 *指针名 = 初始地址值; 变量必须已说明 过类型应一致 例 int i; int *p = &i; int *q = p; 用已初始化指 针变量作初值 10/20 例 int a; int *p; p = &a; ➢ 赋值语句赋值 例 int a = 20 ; int *p, *q; p = &a; q = p; 整型变量a 指针变量p 指针变量q . . 2000 . . 20 2000 2000