- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
二级培训C讲义3
二级考试C培训讲义
第6章 指针 + 数组
6.1 指针 + 一维(整数、浮点数、结构)数组
6.1.1 数组元素的引用方式:下标法、指针法
设有数组a[N],引用数组元素的方式:
下标法a[i] []为下标运算符 指针法*(a+i) 注意:*(a++) 错!
6.1.2 下标法和指针法的相通之处
main()
{ int a[10],i,*p;
for(i=0; i10; i++)
scanf(%d,a+i); /* scanf(%d,a[i]) */
for(i=0; i10; i++)
printf(%d,*(a+i)); /* printf(%d,a[i]) */
for(p=a; pa+10; p++)
printf(%d,*p);
}
6.1.3 指针法的小心之处:指针指到哪里了?
例:改错
main()
{ int a[10],i,*p;
p=a;
for(i=0; i10; i++) scanf(%d, p++);
for(i=0; i10; i++,p++) printf(%d,*p);
}
6.2 指针 + 一维字符数组
6.2.1 容易混淆的字符串初始化
正确的字符串初始化方式 char s[]=abcdef; s是地址常量,不能变动。 char *p=abcdef; p是地址变量,可以变动。 char *p;
p=abcdef; 将abcdef的地址赋给变量p。
错误方式! char s[10];
s=abcdef; 错! 数组名是常数 char s[10];
s[]=abcdef; 错! s[]是什么! char s[10];
s[10]=abcdef; 错! s[10]是越界的数组元素! char *p;
*p=abcdef; 错! *p所指的是一个字符单元;
并且p未赋值。
基本合理的形式: *p=a;
6.2.2 下标法和指针法的相通之处
例1、复制字符串
数组方式
void strcopy(char from[],char to[])
{ int i;
for(i=0; to[i]=from[i]; i++);
} 指针方式
void strcopy(char *from,char *to)
{ int i;
for(i=0; *(to+i)=*(from+i); i++);
} 例2:根据字符串比较运算的定义,完善该函数:
数组方式
int strcmp(char s[ ], char t[ ])
{ int i;
for(i=0; s[i] t[i]; i++)
if(s[i]!=t[i]) ;
;
} 指针方式
int strcmp(char *p1,char *p2)
{ for(; *p1 *p2; p1++,p2++)
if(*p1!=*p2) return(*p1-*p2);
return(*p1-*p2);
}
6.2.3 指针法的灵巧之处
例:读程序写结果。设输入123456789。
main()
{ char s1[10],s2[10],*p1; int i;
gets(s1);
for(p1=s1,i=0; i10; i++,p1++)
{ strcpy(s2,p1); puts(s2); }
for(p1=s1,i=0; i9; i++,p1++)
printf(%c\n,p1[0]);
}
6.3 数组指针 + 二维数组
指针的两个含义:地址、对象。
6.3.1指针的加减运算
int *p; p++ 地址加2 int (*p)[10]; p++ 地址加20
6.3.2 二维数组中元素的表示方式
设有数组int a[M][N];
基本引用 a[i][j] /* 一个整数 */
a[i] /* 一个一维数组:a[i][0] */ 整数指针引用 int *p=a;
*(p+i*N+j); 数组指针引用 int (*p)[N]; p=a;
p+i /* a[i]的地址,指向一维数组 */
*(p+i) /* a[i][0]的地址,指向整数*/
*(p+i)+j /* a[i][j]的地址 */
*(*(p+i)+j) /* a[I][j]的值 */ 提醒:p+i和*(p+i)的值相等,但对象不一样。
int a[M][N];
int (*p)[N];
p=a; 类型 对象 等价形式 P
文档评论(0)