第7章指 白雪飞 baixfaustc. edu.cn 中国科学技术大学电子科学与技术系 Dept of Elec. Sci. Tech, USTC Fal22003
白 雪 飞 baixf@ustc.edu.cn 中国科学技术大学电子科学与技术系 Dept. of Elec. Sci. & Tech., USTC Fall, 2003 第7章 指 针
目录 指针概念 ●指针变量和指针运算 指向数组的指针 ●指向字符串的指针 指向函数的指针 返回指针值的函数 指针数组和指向指针的指针 C语言程序设计-第7章指针2
C语言程序设计 - 第7章 指针 2 目 录 ⚫ 指针概念 ⚫ 指针变量和指针运算 ⚫ 指向数组的指针 ⚫ 指向字符串的指针 ⚫ 指向函数的指针 ⚫ 返回指针值的函数 ⚫ 指针数组和指向指针的指针
指针( Pointer) 指针表示变量等的存储地址 ●使用指针可以获得紧凑、高效的代码 使用指针也可能使程序晦涩难懂 ●指针的使用灵活方便 指针操作容易出错且难以调试 指针与数组关系密切 C语言程序设计-第7章指针
C语言程序设计 - 第7章 指针 3 指针 (Pointer) ⚫ 指针表示变量等的存储地址 ⚫ 使用指针可以获得紧凑、高效的代码 ⚫ 使用指针也可能使程序晦涩难懂 ⚫ 指针的使用灵活方便 ⚫ 指针操作容易出错且难以调试 ⚫ 指针与数组关系密切
指针与地址 低地址 地址 2034H37H ■通过首地址和数 short s:/*0xA637*/ 2035HA6H 据类型可以访问 内存中某一数据308s[45 char c /*0x45*/ ■数据类型决定所 占用存储单元数42334 short *ps;/*0x2034*/ 4237H20H ●指针 ■就是地址 5702H88H char*pc;/*0x3088*/ ■和类型有关 5703H30H 高地址 C语言程序设计-第7章指针
C语言程序设计 - 第 7 章 指针 4 指针与地址 ⚫ 地址◼ 通过首地址和数 据类型可以访问 内存中某一数据 ◼ 数据类型决定所 占用存储单元数 ⚫ 指针◼ 就是地址 ◼ 和类型有关 3 7 H 4 5 H A 6 H . . . . . . . . . . . . . . . } s h o r t s ; / * 0 xA 6 3 7 * / c h a r c ; / * 0 x 4 5 * / } s h o r t * p s ; / * 0 x 2 0 3 4 * / } c h a r * p c ; / * 0 x 3 0 8 8 * / 3 4 H 低 地 址 高 地 址 2 0 H 8 8 H 3 0 H 2 0 3 4 H 2 0 3 5 H 3 0 8 8 H 4 2 3 6 H 4 2 3 7 H 5 7 0 2 H 5 7 0 3 H
指针变量和指针运 变量的指针和指针变量 指针变量的定义 。地址运算符和指针运算符 指针变量的引用 指针的运算 C语言程序设计-第7章指针5
C语言程序设计 - 第7章 指针 5 指针变量和指针运算 ⚫ 变量的指针和指针变量 ⚫ 指针变量的定义 ⚫ 地址运算符和指针运算符 ⚫ 指针变量的引用 ⚫ 指针的运算
变量的指针和指针变量 ●变量的指针 内存中存储某个变量的存储单元的首地址 ■指针(地址)实质上是一个整数(不是C的整型) ■可以通过变量的地址来间接的访问变量 指针变量 ■指针(地址)是一个数据,也可以用另一个变 量来存放,即指针变量 ■通过指针变量可以间接访问变量或内存数据 C语言程序设计-第7章指针6
C语言程序设计 - 第7章 指针 6 变量的指针和指针变量 ⚫ 变量的指针 ◼ 内存中存储某个变量的存储单元的首地址 ◼ 指针(地址)实质上是一个整数(不是C的整型) ◼ 可以通过变量的地址来间接的访问变量 ⚫ 指针变量 ◼ 指针(地址)是一个数据,也可以用另一个变 量来存放,即指针变量 ◼ 通过指针变量可以间接访问变量或内存数据
指针变量的定义 般形式 ■基类型*指针变量名; ●说明 “基类型”表示该指针指向的数据的类型 ■可以定义基类型为空类型void的指针变量 举例 int *pii ■char*pc1,c,*pc2 ■void*p; C语言程序设计-第7章指针7
C语言程序设计 - 第7章 指针 7 指针变量的定义 ⚫ 一般形式 ◼ 基类型 *指针变量名; ⚫ 说明 ◼ “基类型”表示该指针指向的数据的类型 ◼ 可以定义基类型为空类型void的指针变量 ⚫ 举例 ◼ int *pi; ◼ char *pc1, c, *pc2; ◼ void *p;
地址运算符( Address operator) 地址运算符& 获得操作数的地址(指针) ■单目运算符,自右向左结合,优先级较高 ■操作数应为各种类型的内存变量、数组元素 结构体成员等 ■操作数不能是表达式、常量、寄存器变量 ●举例 scanf("f &score)i ■inti,*p=&1; C语言程序设计-第7章指针8
C语言程序设计 - 第7章 指针 8 地址运算符 (Address Operator) ⚫ 地址运算符 & ◼ 获得操作数的地址(指针) ◼ 单目运算符,自右向左结合,优先级较高 ◼ 操作数应为各种类型的内存变量、数组元素、 结构体成员等 ◼ 操作数不能是表达式、常量、寄存器变量 ⚫ 举例 ◼ scanf("%f", &score); ◼ int i, *p=&i;
指针运算符( direction Operator) 指针运算符* 获得指针指向的内存数据 ■又称“间接访问运算符” 单目运算符,自右向左结合,优先级较高 ■操作数为具有指针(地址)意义的值 ●举例 ■inti,*p=&i; (*p)++;/*立++;*/ C语言程序设计-第7章指针9
C语言程序设计 - 第7章 指针 9 指针运算符 (Indirection Operator) ⚫ 指针运算符 * ◼ 获得指针指向的内存数据 ◼ 又称“间接访问运算符” ◼ 单目运算符,自右向左结合,优先级较高 ◼ 操作数为具有指针(地址)意义的值 ⚫ 举例 ◼ int i, *p=&i; (*p)++; /* i++; */
指针变量的引用 。指针变量也要“先赋值,后使用” 没有赋值的指针变量所存储的地址数据 是不确定的,对它的引用非常危险 对指针的赋值要注意类型匹配,必要时 可以使用强制类型转换,但要慎重使用 *p可以用于与指针p的基类型相同类型 的变量可以使用的任何场合 ●指针变量可以作为函数的参数 C语言程序设计-第7章指针
C语言程序设计 - 第7章 指针 10 指针变量的引用 ⚫ 指针变量也要“先赋值,后使用” ⚫ 没有赋值的指针变量所存储的地址数据 是不确定的,对它的引用非常危险 ⚫ 对指针的赋值要注意类型匹配,必要时 可以使用强制类型转换,但要慎重使用 ⚫ *p可以用于与指针p的基类型相同类型 的变量可以使用的任何场合 ⚫ 指针变量可以作为函数的参数