C语言程序设计 清华大学郑莉安颖莲 第大讲 指针 参考书《C程序设计》第九章 Page 1
C语言程序设计 清华大学 郑莉 安颖莲 Page 1 第六讲 指针 参考书《C程序设计》第九章
C语言程序设计 清华大学郑莉安颖莲 本讲主要内容 指针变量 。 指向数组元素的指针 字符指针与字符串 ·指针数组 。 指向一维数组的指针 。多级指针 。 以指针作为函数参数 指针型函数 ·指向函数的指针 Page 2
C语言程序设计 清华大学 郑莉 安颖莲 Page 2 本讲主要内容 • 指针变量 • 指向数组元素的指针 • 字符指针与字符串 • 指针数组 • 指向一维数组的指针 • 多级指针 • 以指针作为函数参数 • 指针型函数 • 指向函数的指针
C语言程序设计 清华大学郑莉安颖莲 指针变量概念及定义 内存用户数据区 。 概念 -指针:另一个变量的地址 用于间接访问变量 2000 3 变量i -指针变量: 2002 6 变量j 用于存放地址的变量 定义 变量 例:static int i; 3010 2000 1 pointer static int *i pointer=&i; 指向整型变量的指针 引用 1 pointer *i pointer 例1: i=3; 2000 3 例2: *i pointer=3; Page 3 2000
C语言程序设计 清华大学 郑莉 安颖莲 Page 3 • 定义 例:static int i; static int *i_pointer=&i; 指向整型变量的指针 指针变量 —概念及定义 • 概念 - 指针:另一个变量的地址 用于间接访问变量 - 指针变量: 用于存放地址的变量 2000 3 i_pointer *i_pointer i 2000 内存用户数据区 变量 i 变量 j 变量 i_pointer 3 6 2000 2000 2002 3010 • 引用 例1: i=3; 例2: *i_pointer=3;
C语言程序设计 清华大学郑莉安颖莲 指针变量 初始化 语法形式 存储类型 数据类型*指针名=初始地址: 例: int *pa=&a; ·注意事项 -用变量地址作为初值时,该变量必须在指针初始化之前已 说明过,且变量类型应与指针类型一致。 可以用一个已赋初值的指针去初始化另一个指针变量。 不能用一个内部auto型变量去初始化static型指针。 例1 Page 4
C语言程序设计 清华大学 郑莉 安颖莲 Page 4 指针变量 ——初始化 • 语法形式 存储类型 数据类型 *指针名=初始地址; 例: int *pa=&a; • 注意事项 - 用变量地址作为初值时,该变量必须在指针初始化之前已 说明过,且变量类型应与指针类型一致。 - 可以用一个已赋初值的指针去初始化另一个指针变量。 - 不能用一个内部 auto 型变量去初始化 static 型指针。 例 1
C语言程序设计 清华大学郑莉安颖莲 指针变量 算术运算 ·指针与整数的加减运算 -指针p加上或减去n,其意义是指针当前指向 位置的前方或后方第n个数据的地址。 -这种运算的结果值取决于指针指向的数据类型。 ·指针加一,减一运算 指向下一个或前一个数据。 例如:y=px+相当于y=*(px+) (*和+优先级 相同,自右向左运算)。 Page 7
C语言程序设计 清华大学 郑莉 安颖莲 Page 7 指针变量 ——算术运算 • 指针与整数的加减运算 -指针 p 加上或减去 n ,其意义是指针当前指向 位置的前方或后方第 n 个数据的地址。 -这种运算的结果值取决于指针指向的数据类型。 • 指针加一,减一运算 指向下一个或前一个数据。 例如:y=*px++ 相当于 y=*(px++) (*和++优先级 相同,自右向左运算)
C语言程序设计 清华大学郑莉安颖莲 short *pa pa-2 *(pa-2) pa-l *(pa-1) pa *pa pa+l *(pa+1) pa+2 *(pa+2) pa+3 *(pa+3) Page 8
C语言程序设计 清华大学 郑莉 安颖莲 Page 8 pa pa-2 pa-1 pa+1 pa+2 pa+3 *(pa-2) *pa *(pa+1) *(pa+2) *(pa+3) *(pa-1) short *pa
C语言程序设计 清华大学郑莉安颖莲 long *pb pb-1 *(pb-1) pb *pb pb+1 *(pb+1) pb+2 *(pb+2) Page 9
C语言程序设计 清华大学 郑莉 安颖莲 Page 9 pb-1 pb pb+1 pb+2 *(pb-1) *pb *(pb+1) *(pb+2) long *pb
C语言程序设计 清华大学郑莉安颖莲 指针变量 关系运算和赋值运算 关系运算 一指向相同类型数据的指针之间可以进行各种关系运 算。 指向不同数据类型的指针,以及指针与一般整数变 量之间的关系运算是无意义的。 指针可以和零之间进行等于或不等于的关系运算。 例如:p=0或p!=0 赋值运算 向指针变量赋的值必须是地址常量或变量,不能是 普通整数。但可以赋值为整数0,表示空指针。 Page 10
C语言程序设计 清华大学 郑莉 安颖莲 Page 10 • 关系运算 - 指向相同类型数据的指针之间可以进行各种关系运 算。 - 指向不同数据类型的指针,以及指针与一般整数变 量之间的关系运算是无意义的。 - 指针可以和零之间进行等于或不等于的关系运算。 例如:p==0或p!=0 • 赋值运算 - 向指针变量赋的值必须是地址常量或变量,不能是 普通整数。但可以赋值为整数0,表示空指针。 指针变量 ——关系运算和赋值运算
C语言程序设计 清华大学郑莉安颖莲 指向数组元素的指针 ·定义与赋值 例: int a[10]; int *pa; pa=&a[0];或pa=a; ·通过指针引用数组元素 例2 经过上述定义及赋值后: *pa就是a[0],*(pa+l)就是a[1],.,*(pa+i)就是a[i]。 a[i],*(pa+i),*(a+i),pa[i]都是等效的。 不能写a++,因为a是数组首地址是常量。 Page 11
C语言程序设计 清华大学 郑莉 安颖莲 Page 11 指向数组元素的指针 • 定义与赋值 例: int a[10]; int *pa; pa=&a[0]; 或 pa=a; • 通过指针引用数组元素 经过上述定义及赋值后: - *pa就是a[0],*(pa+1)就是a[1],.,*(pa+i)就是a[i]。 - a[i], *(pa+i), *(a+i), pa[i]都是等效的。 - 不能写 a++,因为a是数组首地址是常量。 例 2
C语言程序设计 清华大学郑莉安颖莲 字符指针与字符串 ·字符指针的定义及使用 -定义和初始化。 例:char*pa="ABC”: 与数组不同,在程序中可以直接把字符串常量赋给 一个指针变量。例: char *name; name="c program"; ·使用字符指针处理字符串 Page 16
C语言程序设计 清华大学 郑莉 安颖莲 Page 16 字符指针与字符串 • 字符指针的定义及使用 - 定义和初始化。 例: char *pa="ABC"; - 与数组不同,在程序中可以直接把字符串常量赋给 一个指针变量。例: char *name; name="c program"; • 使用字符指针处理字符串