- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2) 指针加 和减 运算 指针加1和减 和减1运算
指针的加1和减 运算 指针的加 和减1运算,只是指针与整 和减 运算, 数的加减运算的特例,例如: 数的加减运算的特例,例如: int *pn,n,m; , , ; pn = &n; ; m = *pn++; //先赋值再自加 ; 先赋值再自加
(3) 指针相减运算
同类型的指针变量p1和 相减 相减, 同类型的指针变量 和p2字节数。 例如: 例如: Type *p1, *p2 那么有: 那么有:p2-p1=(p2-p1)/sizeof(Type)
【例】使用指针将两个整数交换顺序 #include "stdio.h" 在引入指针运 main() 算后, 算后,数据交 { int m,n,*pm,*pn,temp; 换可通过指针 pm=&m; pn=&n; 所指向的存储 scanf("%d%d",&m,&n); 地址进行操作 temp=*pm; m和n的值改 *pm=*pn; 变了吗? 变了吗? *pn=temp; printf("%d,%d\n",m,n); printf("%d,%d\ printf("%d,%d\ printf("%d,%d\n",*pm,*pn); }
a[0]:第0行第 列元素的地址 即&a[0][0] 第 行第 列元素的地址,即 行第0列元素的地址 a[1]:第1行第零列元素的地址 即&a[1][0] 行第零列元素的地址,即 第 行第零列元素的地址 a[2]:第2行第零列元素的地址 即&a[2][0] 行第零列元素的地址,即 第 行第零列元素的地址 a[0]+1:第0行第 列地址是 行第1列地址是 第 行第 列地址是&a[0][1] a[1]+2:第1行第 列地址是 行第2列地址是 第 行第 列地址是&a[1][2] a[1]+2=> *(a+1)+2=> &a[1][2] ----不能写成 不能写成*(a+1+2) 不能写成
a[0]+1
a[0][1] a[1][1] a[2][1] a[0][2] a[0][3] a[1][2] a[1][3] a[2][2] a[2][3]
a
a+1 a+2
第零行首地址, 第零行首地址,即数组的首地址 第一行首地址, 第一行首地址,即a[1]首地址 首地址 第二行首地址, 第二行首地址,即a[2]的首地址 的首地址
8.2.2 指向多维数组的指针
(1)二维数组的指针 假设有如下数组: 二维数组的指针 假设有如下数组:
int a[3][4]={{1,3,5,7},{9,11,13,15}{17,19,21,23}}
a
(2000) a+1 (2008) a+2 (2016)
a[0][0] a[1][0] a[2][0]
第8章 指针及其应用
本章主要内容
指针的定义和引用 指针与数组 字符指针和字符串
8.1 指针与指针变量
8.1.1指针的基本概念 指针的基本概念
就像同 学与所 住宿舍 号码的 关系
8.1.2 指针的定义
指针定义的一般形式为: 指针定义的一般形式为: 指针名1[,*指针名 指针名2,…]; 类型标识符 *指针名 指针名 指针名
二维数组做函数参数) 例:求成绩的平均值 (二维数组做函数参数 二维数组做函数参数 #include “stdio.h” void average(float *p,int n) {float *p_end=p+n-1,sum=0, aver; for(;p<=p_end;p++) sum=sum+(*p); aver=sum/n; printf("average=%5.2f\n",aver);} main() {static float score[3][4]={{60,61,62,63}, {70,71,72,73},{80,81,82,83}}; average(score,12);}
8.2 指针与数组
数组名是数组在内存中的 首地址, 首地址,且数组的元素在内存 中占用连续的一片存储空间, 中占用连续的一片存储空间, 因此, 因此,可用指针访问数组元素
8.2.1 指向一维数组的指针
float x[10],*px;//定义数组和指针 , ; 定义数组和指针 px=x; 或px=&x[0]; //指针指向数组 //指针指向数组 访问数组元素方法: 访问数组元素方法: •偏移量法,如:*(px+2) //px值不变 偏移量法, 偏移量法 值不变 •指针移动法,如:px++ //px值变化 指针移动法, 指针移动法 值变化 •x++是不允许的,因为数组名是常量 x++是不允许的 x++是不允许的, *px就是x[0],*(px+i)就是x[i]。 *px就是x[0],*(px+i)就是x[i]。 就是x[0],*(px+i)就是x[i] x[i],*(px+i),*(x+i)都是等效的 x[i],*(px+i),*(x+i)都是等效的
8.1.4 指针运算符 “*” 指针运算符,表示“指向” 指针运算符,表示“指向” “&” 地址运算符 int n, *i_point; ; i_ point= &n; ; &(* i_ point)等效于 point 等效于i_ 等效于 *(&n)等效于 等效于n 等效于
应区分i_ 三者的区别: 应区分 point 、* i_ point 和& i_ point三者的区别: 三者的区别 i_ point:是指针变量,其内容是地址量 :是指针变量, • * i_ point:是指针变量的目标变量 : • & i_ point:是指针变量本身所占据的存储地址 :
定义: 定义: 例:int i; int *i_pointer; 引用: 引用: i=3 *i_pointer=3 &i_pointer=3010 i_pointer=2000
内存用户数据区
2000 2002
3 6
变量 i 变量 j 变量 i_pointer
3010
2000
i_pointer 2000
指向由m个元素组成的一维数组的 指向由 个元素组成的一维数组的 指针变量 例:static int a[4]={1,2,3,4}; int (*p)[4],i,j; p=a; int(*p)[4]表明 是一个指针变量, 表明p是一个指针变量 表明 是一个指针变量, 它指向包含4个元素的一维数组 个元素的一维数组, 它指向包含 个元素的一维数组, 若写成*p[4],则表明是指针数组 若写成 , 以后再讲) (以后再讲)
8.3 字符指针和字符串
两种 初始 化的 方法 在定义的同时进行初始化 例如: 例如:char *p =”a string”; ; 末尾自 动加 ‘\0’, , 标志结 束,不 计入总 长度
利用赋值语句初始化 char *s; ; s = “string”; ;
【例】使用指针编写程序,比较两个 使用指针编写程序, 字符串的大小(不使用字符串处理函数 不使用字符串处理函数) 字符串的大小 不使用字符串处理函数 步骤: 步骤: •定义两个指向字符串的指针 定义两个指向字符串的指针 •通过移动指针进行逐字符比较 通过移动指针进行逐字符比较 如有字符串ABCdEF和ABCDEF, 和 如有字符串 , 则认为ABCdEF比ABCDEF大 则认为 比 大 原因: 个字符一样, 个字符d的 原因:前3个字符一样,第4个字符 的 个字符一样 个字符 ASCII值比 的ASCII值大 值比D的 值比 值大
不能是普通整数。 不能是普通整数。 但赋0 但赋0值,表示空指针
算术
与整数的加减运算、 和 与整数的加减运算、加1和 运算、 减1运算、指针相减运算 运算
(1) 指针与整数的加、减运算 指针与整数的加、
指针point加上或减去一个整数 加上或减去一个整数 指针 n,将相对于当前位置前移或后移 ,将相对于当前位置前移或后移n 个存储单元。 个存储单元。 int * pn; ; 不妨设pn=0x0000,那么 不妨设 , pn+n=pn+n*sizeof(int)=0x0000+n*2
个数, 例:输入3个数,由大到小排序输出 输入 个数 main () { int a,b,c,*pa,*pb,*pc; scanf("%d,%d,%d",&a,&b,&c); exchange(int *q1,int *q2,int *q3) pa=&a; { if(*q1<*q2) swap(q1,q2); if(*q1<*q3) swap(q1,q3); pb=&b; if(*q2<*q3) swap(q2,q3); } pc=&c; exchange(pa,pb,pc); printf("%d,%d,%d\n",a,b,c); printf("%d,%d,%d\n", swap(int *a,int *b) {int p; *pa,*pb,*pc); } p=*a;*a=*b;*b=p;}
数据具有不同的类 型,定义指针时也 要定义该指针所指 向的数据类型
int *pn; char *pch; float *pf;
8.1.3 指针的初始化
指针是一种变量, 指针是一种变量,在定义的同时可 以赋给它初始值,称为指针的初始化。 以赋给它初始值,称为指针的初始化。 形式如下: 形式如下: 指针名=初始地址值 类型标识符 *指针名 初始地址值; 指针名 初始地址值; 例如, 例如, 变量地址作初值时, 变量地址作初值时, int m,n[8]; , ; 该变量在此之前已 char c; 说明过, 说明过,且类型应 int *pm = &m; ; 一致。 一致。可用已赋初 int *pn = n; ; 值的指针去初始化 char *pc = &c; ; 其他指针变量