文档介绍:一、数组的指针
二、字符串指针
三、指针作为函数参数
第16讲数组的指针和字符串的指针
C语言规定:
数组名代表数组(元素)的首地址,即第一个元素的地址。
若有:int a[10], *p=a;
则: a 与&a[0] 是等价的
指针变量 p 为数组的指针
数组的指针:数组的起始地址,即数组元素的首地址。
数组元素的指针:数组元素的地址。
一、数组的指针
对数组的首地址加上偏移量x就可以得到其它元素的地址。
例: &a[1] 表示数组元素a[1]的地址
等价于 a+1、 p+1
&a[x] 表示数组元素a[x]的地址
等价于 a+x、 p+x
下标法:
用 a[i] 的形式存取数组元素。
地址法:
用*(a+i)的形式存取数组元素。
指针法:
用指针变量p指向数组的首地址,然后通过移动指针存取数组元素。
如 p=a, p+i。
例a 用下标法存取数组元素
main( ) { int a[10], i;
for ( i=0; i<10; i++ ) scanf("%d", &a[i]);
for ( i=0; i<10; i++ ) printf("%d", a[i]);
printf("\n"); }
例b 用地址法存取数组元素
main( ) { int a[10], i; for ( i=0; i<10; i++ ) scanf("%d", a+i );
for ( i=0; i<10; i++ ) printf("%d", *(a+i));
printf("\n"); }
数组元素的访问举例
例c 用指针法存取数组元素。(即通过指针指向数组的首地址,然后通过移动指针存取数组元素。)
main( ) { int a[10], *p, i;
for (i=0, p=a; i<10; i++) scanf("%d", p+i);
for (i=0, p=a; i<10; i++) printf("%d", *(p+i)); printf("\n"); }
main( ) { int a[10], *p;
for ( p=a; p<a+10; p++) scanf("%d", p);
for ( p=a; p<a+10; p++) printf("%d", *p); printf("\n"); }
例c 说明
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
0
2
4
6
8
p = & a
*p++
0
4
6
2
*p
p++
等价于
8
数组元素的访问小结:
int i,a[10],*p=a;
表现形式
含义
&a[0] a p
一维数组首地址
&a[ i ] a+i p+i
一维数组下标为 i 的元素地址
a[0] *a *p
一维数组下标为 0 的元素的值
a[ i ] *(a+i) *(p+i)
一维数组下标为 i 的元素的值
注意:
数组名是一个常量,不允许重新赋值。
指针变量是一个变量,可以重新赋值。
p+i和a+i均表示数组元素a[i]的地址,均指向a[i]。
*(p+i)和*(a+i)均表示p+i和a+i所指对象的内容,即a[i]。
*p++:等价于*(p++)。其作用:先得到*p,再使p=p+1。