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