C语言指针

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指针的关系运算
两个指向同一组相同类型数据的指针之间可以进行各种关系运算。两个指 针之间的关系运算表示它们的目标变量的地址位置之间的关系。
指针的关系运算应注意以下几点:
两个不同数据类型的指针之间的关系运算是无意义的。 指针与一般整数之间的关系运算也是无意义的。 指针可以和0进行“= =”或“!=”比较,用以判断其是否为空指针。 关系运算符有: 小于 大于 等于 大于等于 < > = = > =
地址
2000 2002 2004 2006 2008 2010 2012 2014 2016 2018
内存
a[i]
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
p[i]
p[0] p[1] p[2] p[3] p[4] p[5] p[6] p[7] p[8] p[9]
说明: 1、虽然上述的三种方法都能输出同样的结果,但它们的效率 是不同的。 用下标法访问数组时,是转换成地址法处理的,即先计算出 数组元素的地址,然后再找到它指向的存储单元,读出或写入它 的值。而用指针变量指向数组元素时则不必每次计算数组元素地 址。 2、使用指针访问数组元素时,完全根据地址来访问,而不作 “下标是否越界”的检查。 3、使用指向数组元素的指针变量时,应当注意指针变量的当 前值。例如: int a[5]; int *p = a; for(i=0; i<5; i++) scanf(“%d”, p++);
返回主菜单
5.4
指针与数组
5.4 指针与数组 5.4.1 指向数组的指针 5.4.2 指向数组的指针的应用
返回主菜单
5.4
指针与数组
5.4.1
指向数组的指针
数组名就是数组元素的首地址,数组元素是连续存放在一片内存空间中, C语言可以用指针访问数组的元素。用指针访问数组的元素的作法是,根 据前面所述的数组、指针的概念,首先定义一个数组和指针并使指针指向该 数组,例如: float x[10],*px; px=x; px=&x[0]; 访问数组的元素还有其它特殊的方法。介绍如下: 设(定义一个一维数组a和指针pa ): int a[10],*pa; 使指针pa指向数组a pa = a;
px>py
px= =py px>=py
px<=py
px!=py
5.3
指针的运算
5.3.3
指针的赋值运算
对指针可以进行赋值运算,所赋的值一定是地址量,一般不能是数据。 赋值形式有以下几种: 可以把一个变量的地址赋给与其具有相同数据类型的指针。 例: int x,*px; px=&x; 具有相同数据类型的两个指针可以相互赋值。 例: float *px,*py,y; px=&y; py=px; 可以把一个数组的地址赋给与其具有相同数据类型的指针。 例: double a[30],*pa,*pb; pa=a; pb=&a[0];
小于等于
不等于
< =
! =
5.3
指针的运算
例: int *px,*py; px<py
若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之前。 若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之后。 若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置相同。 若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之后或相同。 若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之前或相同。 若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置不同。
下标法(用下标符): 引用数组某元素的方法是: 地址法: 引用数组某元素的方法是: 指针法(用指针运算符): a[i]。 例如:a[0],a[1]…a[9]。 *(a+i)。例如: *(a+0), *(a+1), …*(a+9)。
引用数组某元素的另一种方法是:*(pa+i)。例: *(pa+0), *(pa+1), ..*(pa+9). 用指针加下标的方法引用数组某元素:pa[i]。例如:pa[0], pa[1], …pa[9]。
}
5.4
指针与数组
5.4.2
二维数组的指针表示方法
一个二维数组可以认为由若干个一维数组所组成, 其中每一个一维数组包含若干个元素。 例: int a[3][3];
a 是二维数组,共有9个元素 (3 3=9),它们是:
第一下标
a[0]: a[0][0], a[0][1], a[0][2], a
a[1]: a[1][0], a[1][1], a[1][2]。
a[2]: a[2][0], a[2][1], a[2][2]。
第二下标
其全部元素数值均为 int 型。
5.4
指针与数组
分析二维数组名a和a[0]、a[1]、a[2]的关系 数组名a就是数组的起始地址。a+1是在a的基础上加上一行的 字节数。 一个二维数组可以认为由若干个一维数组组成。对数组名a而 言,它的每一个“元素”是一行而不是一个基本元素,因此a[0]、 a[1]、a[2]只是一个地址。它们代表的是每一行起始元素的地址, 也就是每行的第一列元素的地址。 a[0]+0 a[0]+1 a[0]+2 *a *a+1 *a+2
*(a+i)
*(a+0) *(a+1) *(a+2) *(a+3) *(a+4) *(a+5) *(a+6) *(a+7) *(a+8) *(a+9)
*(p+i)
*(p+0) *(p+1) *(p+2) *(p+3) *(p+4) *(p+5) *(p+6) *(p+7) *(p+8) *(p+9)
用指针访问数组元素 注意不要使数组
应 注 意 指 针 变 量 当 前 的 指 向
设有如下定义 int a[5], i , *p; for(p=a; p<a+5; p++)
下标越界或使指 针指向数组外
数组a aa[0]Fra bibliotekp p p
scanf("%d", p );
for(p=a; p<a+5;p++)
a+1
二维数组的 地址有行地址和 列地址的区别, 那么如果设指针 变量,也应该确 定是指向行还是 指向列,二者不 能混淆。
a
a+0
a[0][0]
a[0][1]
a[0][2]
a[1]+0 *(a+1)
a[1]+1 a[1]+2 *(a+1)+1 *(a+1)+2
a[1][1] a[1][2]
例: 如果 px和py是指针变量 px=2048 py=1024 px和py的目标变量的数据类型为double, 则 px-py=((px)-(py))/sizeof(double) =(2048-1024)/8 =128 即px和py之间有128个double类型的数。
5.3
指针的运算
5.3.2
long a[3], *p = a;
内存数据区 地址 p, a ... 10 p+1,a+1 20 p+2,a+2 30 ... 数组指针和元素的关系 a[2],*(a+2) p[2],*(p+2) a[1],*(a+1) p[1],*(p+1) 元素 a[0],*a p[0],*p
5.4
指针与数组
printf("%d", a[i] *(a+i) *(p+i) p[i] ); p p p p ); p p
数组a a
a[0]
a+1
a[1] a[2] a[3] a[4]
for( ; p<a+5; p++) printf("%d", *p
a+2
a+3
a+4 a+5
倒序输出一个数组中的元素
#include <stdio.h> void main() { int i,a[10]; for ( i=0; i<=9;i++) a[i]=i; for( i=9;i>=0; i-- ) printf("%d ″,a[i]); printf("\n″); } #include <stdio.h> void main() { int i,a[10]; for ( i=0; i<=9;i++) a[i]=i; for( i=9;i>=0; i-- ) printf("%d ″,*(a+i)); printf("\n″); }
5.4
指针与数组
数组名是地址常量,不能对其进行赋值和其它运算。 下面的操作是非法的: int x[10],b=2; x++; x - -; x=b;
指针在使用前必须赋初值,而数组名不需要赋初值。
多种方法访问数组元素
设有如下定义 int a[5]={1, 3, 5, 7, 9}, i , *p; p=a; for(i=0;i<5;i++)
倒序输出一个数组中的元素
#include <stdio.h> void main() { int i,a[10]; for ( i=0; i<=9;i++) a[i]=i; for( i=9;i>=0; i-- ) printf("%d ″,a[i]); printf("\n″); } #include <stdio.h> void main() { int i,a[10], *pa = a; for ( i=0; i<=9;i++) pa[i]=i; for( i=9;i>=0; i-- ) printf("%d ″,*(pa+i)); printf("\n″); }

夏涛

5.3
指针的运算
(3)指针相减运算
假设指针px和py是指向同一组数据类型相同的数据,则px-py的运算结果 是两个指针间数据的个数。所以px和py之差并不是px和py两指针内所包含地
址量之差,而是由如下公式计算决定:
px-py=((px)-(py))/sizeof(指针的目标变量的数据类型)
地址、地址量
数组元素、数据量
5.4
指针与数组
指针和数组在使用时应注意以下几点:
用指针名和数组名在访问地址中的数据时,它们的表达形式是等价的, 因为指针名和数组名都是地址量。
例如: int x[10],*px=x,i;
引用数组x[10]中的某个元素,可以这样作: x[i]、px[i] 、*(x+i) 、 *(px+i)它们的作用是等效的。 指针名和数组名在本质上是不同的。 指针是地址变量,其值可以发生变化,可以对其进行赋值和其它的运 算。指针的以下运算是合法的: int x[10],*px,n; px=x; px++; px - -; px+=n;
a[1] a[2] a[3] a[4]
a+2
p
p pp
a+3
a+4 a+5
printf("%d ", * p );
*p++ 的使用
main() { int a[5]={2,3,4,5,6}; int *p=a,c; c=*p++; printf("%d,%d\n",c, *p); }
main() { int a[5]={2,3,4,5,6}; int *p=a,c; c=*(++p); printf("%d,%d\n",c, *p); }
5.3
指针的运算
其他常用的赋值运算 设px和py是具有相同数据类型的两个指针,则以下赋值是合法的。 px=py+n; px=py-n; px+=n; px-=n; n是地址量。 对指针的目标变量的赋值 对指针的目标变量所赋的值一定是数据。要注意数据类型的统一。 例:int x,*p,y; p=&x; *p=10; 等效于x=10 y=*p-5; 最后y=5
结果:
结果:
2,3
3,3
#include <stdio.h> void main() { int iarray[10]={0,2,4,6,8,10,12,14,16,18};
求数组元素的和
int sum=0; int *iptr=iarray; /*指针指向数组*/ for(int i=0;i<10;i++) { sum+=*iptr; iptr是“野指针” iptr++; sum is 90 } printf(”sum is %d\n”,sum);
5.4
指针与数组
int a[10],*p; p=a;
a
p+i
p+0 p+1 p+2 p+3 p+4 p+5 p+6 p+7 p+8 p+9
a+I
a+0 a+1 a+2 a+3 a+4 a+5 a+6 a+7 a+8 a+9
&a[i]
&a[0] &a[1] &a[2] &a[3] &a[4] &a[5] &a[6] &a[7] &a[8] &a[9]
相关文档
最新文档