分类: C/C++
2008-06-02 23:52:34
C语言 指针学习笔记 5
Author:yuexingtian
Date:Sunday, June 02, 2008
/*指向多维数组的指针变量*/ main() { int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}; int (*p)[4]; int i,j; p=a; for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%2d ",*(*(p+i)+j)); printf("\n"); } getch(); } |
测试结果:
1、输出字符串中n个字符以后的所有字符。
程序如下:
/* */ main() { char *ps="The auther is yuexingtian"; int n=14; printf("%s\n",ps); printf("The leave's numbers are:\n"); ps=ps+n; printf("%s\n",ps); getch(); } |
测试结果:
2、在输入的字符串中查找有无‘y’字符。
main() { char st[20],*ps; int i; printf("input a string:\n"); ps=st; scanf("%s",ps); for(i=0;ps[i]!='\0';i++) if(ps[i]=='y') { printf("there is a 'y' in the string\n"); break; } if(ps[i]=='\0') printf("There is no 'y' in the string\n"); getch(); } |
测试结果:
3、把一个字符串的内容复制到另一个字符串中(把字符串指针作为函数参数的使用)。
要求:不能使用strcpy函数。
/*把字符串指针作为函数参数的使用*/ main() { char *pa="yuexingtian",b[20],*pb; pb=b; cpystr(pa,pb); printf("string a=%s\nstring b=%s\n",pa,pb); getch(); } cpystr(char *pss,char *pds) { while((*pds=*pss)!='\0') { pds++; pss++; } } |
测试结果:
说明:
函数cprstr的形参为两个字符指针变量,pss指向源字符串,pds指向目标字符串。
学习表达式(*pds=*pss)!=’\
程序完成了两项工作:一是把pss指向的源字符串复制到pds所指向的目标字符串中,二是判断所复制的字符是否为`\0',若是则表明源字符串结束,不再循环。否则,pds和pss都加1,指向下一字符。在主函数中,以指针变量pa,pb为实参,分别取得确定值后调用cprstr函数。由于采用的指针变量pa和pss,pb和pds均指向同一字符串,因此在主函数和cprstr函数中均可使用这些字符串。也可以把cprstr函数简化为以下形式:
cprstr(char *pss,char*pds)
{while ((*pds++=*pss++)!=`\0');}
即把指针的移动和赋值合并在一个语句中。 进一步分析还可发现`\0'的ASCⅡ码为0,对于while语句只看表达式的值为非0就循环,为0则结束循环,因此也可省去“!=`\0'”这一判断部分,而写为以下形式:
cprstr (char *pss,char *pds)
{while (*pdss++=*pss++);}
表达式的意义可解释为,源字符向目标字符赋值,移动指针,若所赋值为非0则循环,否则结束循环。这样使程序更加简洁。
yuexingtian2008-06-03 23:08:28
第3小题简化后的程序如下所示: main() { char *pa="yuexingtian",b[20],*pb; pb=b; cpystr(pa,pb); printf("string a=%s\nstring b=%s\n",pa,pb); getch(); } cpystr(char *pss,char *pds) { while(*pds++=*pss++); }