首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》2.11 指针的困惑

关灯直达底部

【例2.17】分析下面程序的运行结果。


#include <stdio.h>void main ( ){       int a=2,b,c;    int x=25,*p;    p=&x;     b=a**p;    c=b*x/*p;      //***********    //*  输出   *    //**********/;    printf("%d,%d/n",b,c);}  

这个程序运行后给出一个奇怪的输出“50,1250”。“a**p”的表达式是对的,即“2*25=50”。但“b*x/*p”应是“50*25/25=50”,为何变成1250了呢?原来程序多了一个“;”号,使计算c的表达式变为


c=b*x;  

也就是原来“/*”被作为注释语句的开始,一直遇到“*/”才结束注释。如果没有多出的符号“;”,编译系统会给出如下错误信息。


error C2146: syntax error : missing ';' before identifier 'printf'  

这个信息也够人琢磨的,其实是“/”遇到“*”,有理说不清。

在碰到含有指针的表达式时,在前后留一个空格就可以有效地避免这类问题。例如,把这两条语句改为


b=a * *p;c=b*x / *p;    

或者用括号明确表达式的含义,即


b=a*(*p);c=b*x/(*p);    

这样既容易理解,又能正确编译。

【例2.18】下面的程序实现将输入字符串给t的内容复制到s中,这个程序能正确实现将输入“You and we”复制到s中吗?


#include <stdio.h>#include <malloc.h>void strcpy1 ( char *, char *);void  main ( ){    char   *s, *t;    s=(char*)malloc(100);    t=(char*)malloc(100);    scanf ( "%s", t );    strcpy1 ( s, t );    printf ( "%s/n", s );  }  void strcpy1 ( char *s, char *t)  {  while ( *s++ = *t++ ); }  

【解答】不能。理由如2.7节所述。解决的办法之一是使用gets函数。如果需要保留t,可以像下面这样实现。


#include <stdio.h>#include <malloc.h>void strcpy1 ( char *, char *);void  main ( ){   char   a[100], *t,*s;   s=(char*)malloc(100);   t=(char*)malloc(100);   gets(a);   t=a;   strcpy1 ( s, t );   printf ( "%s/n", s ); } void strcpy1 ( char *s, char *t) { while ( *s++ = *t++ ); }  

如果不需要保留t,可以直接实现复制操作,实现的程序如下。


#include <stdio.h>#include <malloc.h>void strcpy1 ( char *, char *);void  main ( ){   char   a[100], *s;   s=(char*)malloc(100);   gets(a);   strcpy1 ( s, a );   printf ( "%s/n", s ); } void strcpy1 ( char *s, char *t) { while ( *s++ = *t++ ); }  

记住:字符数组的指针也不能接受带空格的输入。

顺便提醒一下:指针比较复杂,本节只是从输入输出数据的角度讨论,以后将把它分到不同应用场合,结合实例说明。