第16讲数组的指针和字符串的指针 、数组的指针 1数组与地址 2数组元素的访问 、字符串指针 1.字符串指针的定义 2字符指针与字符数组的区别 、指针作为函数参数 1数组名作为函数参数 2字符指针作为函数参数
一、数组的指针 1.数组与地址 2.数组元素的访问 二、字符串指针 1.字符串指针的定义 2.字符指针与字符数组的区别 三、指针作为函数参数 1.数组名作为函数参数 2.字符指针作为函数参数 第16讲 数组的指针和字符串的指针
、数组的指针 >C语言规定: 数组名代表数组(元素)的首地址,即第 一个元素的地址。 若有:inta10, D=8 则:a与&a|0是等价的 指针变量p为数组的指针 数组的指针:数组的起始地址,即数组元素的 首地址。 >数组元素的指针:数组元素的地址
➢C语言规定: 数组名代表数组(元素)的首地址,即第 一个元素的地址。 若有:int a[10], *p=a; 则: a 与 &a[0] 是等价的 指针变量 p 为数组的指针 ➢数组的指针:数组的起始地址,即数组元素的 首地址。 ➢数组元素的指针:数组元素的地址。 一、数组的指针
1数组与地址 对数组的首地址加上偏移量x就可以得到其它 元素的地址。 例:&a[表示数组元素a的地址 等价于a+1、p+1 &ax表示数组元素ax的地址 等价于a+x、p+x
1.数组与地址 ➢对数组的首地址加上偏移量x就可以得到其它 元素的地址。 例: &a[1] 表示数组元素a[1]的地址 等价于 a+1、 p+1 &a[x] 表示数组元素a[x]的地址 等价于 a+x、 p+x
2数组元素的访问 下标法 用ail的形式存取数组元素。 地址法: 用*(a+i)的形式存取数组元素。 >指针法: 用指针变量p指向数组的首地址,然后通 过移动指针存取数组元素。 如p=a,p+i
2.数组元素的访问 ➢下标法: 用 a[i] 的形式存取数组元素。 ➢地址法: 用 *(a+i)的形式存取数组元素。 ➢指针法: 用指针变量p指向数组的首地址,然后通 过移动指针存取数组元素。 如 p=a, p+i
例a用下标法存取数组元素 main( f int a[10l, i; for(i=0;i<10;i++) scanf(%od,&al; for(i=0;i<10;i++) printf(od", aiD printf( in")
例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() f int a[10l for(i=0;i<10;i++) scanf(%od", a+i); for(i=0;i<10;i++ printf(%d",*(a+D); printf( in");
例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( maino fint a[10,"p, i; f int a[10, "p for(i=0,p=a;i<10;i++) for(p=a; p<a+10; p++) scanf(%od",p+i); scanf(%d",p); for(i=0,p=a;i<10;i++) for(p=a; p<a+10; p++) printf("%od", (p+i)) printf("%d",* p); printf("n; 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 p=& a 2002 2 等价于p 2003 p+十 2004 p++ 4 2005 2006 6 2007 2008 8 2009
例c 说明 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 02468 p = & a *p++ 0462 * p p++ 等价于 8
数组元素的访问小结: int i, a 10 *D=a9 表现形式 义 &aro] a p 维数组首地址 &ai]a+ip+i一维数组下标为的元素地址 a[o] p|一维数组下标为0的元素的值 a[i]*(a+i)*(P+)一维数组下标为i的元素的值
数组元素的访问小结: 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均表示数组元素a的地址,均指向 ali (p+i和*(a+均表示p+和a+i所指对象的内容, 即a团i] >p++:等价于*p++)。其作用:先得到,再 使p=p+1
注意: ➢ 数组名是一个常量,不允许重新赋值。 指针变量是一个变量,可以重新赋值。 ➢ p+i和a+i均表示数组元素a[i]的地址,均指向 a[i]。 *(p+i)和*(a+i)均表示p+i和a+i所指对象的内容, 即a[i]。 ➢ *p++:等价于*(p++)。其作用:先得到*p,再 使p=p+1