C语言中用指针表示数组和用数组名表示数组的区别? 100
/*这段代码的目的是将逆波兰表示的计算器实现。其中函数getch()的目的是读取输入的文本流中的字符,ungetch()函数将判断时多读出来的字符再压回栈内。问题是:我在...
/*这段代码的目的是将逆波兰表示的计算器实现。
其中函数getch()的目的是读取输入的文本流中的字符,
ungetch()函数将判断时多读出来的字符再压回栈内。
问题是:我在ungetch()函数中表示栈的声明是int *cpointer。但是这样做,在计算浮点数的时候就不正确,如果改为int cpointer[ ]。那么就正确了。请问,用指针表示数组和用数组名有什么副作用的区别么?
请大师指点~~!*/
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#define NUMBER '0'
void ungetch(char c);
int getch();
int getop(char *s);
void push(double number);
double pop();
/*以上为声明说明部分*/
main()
{
char *s,c;
double op_temp;
while((c=getop(s))!=EOF)
{
switch(c)
{
case NUMBER :
printf("NUMBER:%s\n",s);
push(atof(s));
break;
case '+' :
push(pop()+pop());
break;
case '-' :
op_temp=pop();
push(pop()-op_temp);
break;
case '*' :
push(pop()*pop());
break;
case '/' :
if((op_temp=pop()));
push(pop()/op_temp);
break;
case '\n':
printf("result=%.8g\n",pop());
break;
default :
printf("error,unknown %c\n",c);
break;
}
}
}
/*分析文本流部分*/
int getop(char *s1)
{
char c;
int i=0;
while((c=getch())==' '||c=='\t')
;
s1[i]=c;
if(!isdigit(c))
{
i=0;
return c;
}
while((c=getch())!=EOF&&c!='\n')
{
if(isdigit(c))
{ s1[++i]=c;
s1[i+1]='\0';
}
else
{
if(c=='.')
{
s1[++i]=c;
continue;
}
else
{
ungetch(c);
s1[++i]='\0';
return NUMBER;
}
}
}
return c;
}
/*获取字符和回退字符部分*/
/*对缓存栈中的字符数不加限制*/
int cpointer[100];/*如果这里改为 int *cpointer ,计算浮点时就会出错*/
int c_count=0;
int getch()
{
return (c_count>0) ? cpointer[--c_count] : getchar();
}
void ungetch(char c)
{
cpointer[c_count++]=c;
}
/*进出栈部分*/
double *number_stack;
int n_count=0;
void push(double number)
{
number_stack[n_count++]=number;
}
double pop()
{
if(n_count>0)
return number_stack[--n_count];
else printf("error of pop");
} 展开
其中函数getch()的目的是读取输入的文本流中的字符,
ungetch()函数将判断时多读出来的字符再压回栈内。
问题是:我在ungetch()函数中表示栈的声明是int *cpointer。但是这样做,在计算浮点数的时候就不正确,如果改为int cpointer[ ]。那么就正确了。请问,用指针表示数组和用数组名有什么副作用的区别么?
请大师指点~~!*/
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#define NUMBER '0'
void ungetch(char c);
int getch();
int getop(char *s);
void push(double number);
double pop();
/*以上为声明说明部分*/
main()
{
char *s,c;
double op_temp;
while((c=getop(s))!=EOF)
{
switch(c)
{
case NUMBER :
printf("NUMBER:%s\n",s);
push(atof(s));
break;
case '+' :
push(pop()+pop());
break;
case '-' :
op_temp=pop();
push(pop()-op_temp);
break;
case '*' :
push(pop()*pop());
break;
case '/' :
if((op_temp=pop()));
push(pop()/op_temp);
break;
case '\n':
printf("result=%.8g\n",pop());
break;
default :
printf("error,unknown %c\n",c);
break;
}
}
}
/*分析文本流部分*/
int getop(char *s1)
{
char c;
int i=0;
while((c=getch())==' '||c=='\t')
;
s1[i]=c;
if(!isdigit(c))
{
i=0;
return c;
}
while((c=getch())!=EOF&&c!='\n')
{
if(isdigit(c))
{ s1[++i]=c;
s1[i+1]='\0';
}
else
{
if(c=='.')
{
s1[++i]=c;
continue;
}
else
{
ungetch(c);
s1[++i]='\0';
return NUMBER;
}
}
}
return c;
}
/*获取字符和回退字符部分*/
/*对缓存栈中的字符数不加限制*/
int cpointer[100];/*如果这里改为 int *cpointer ,计算浮点时就会出错*/
int c_count=0;
int getch()
{
return (c_count>0) ? cpointer[--c_count] : getchar();
}
void ungetch(char c)
{
cpointer[c_count++]=c;
}
/*进出栈部分*/
double *number_stack;
int n_count=0;
void push(double number)
{
number_stack[n_count++]=number;
}
double pop()
{
if(n_count>0)
return number_stack[--n_count];
else printf("error of pop");
} 展开
2个回答
展开全部
如果你是说你注释那里
改成
int *cpointer;
int c_count = 0;
如果是这样的话 那就是 cpointer并没有具体指向的空间
换成
int arr[100];
int *cpointer = arr;
int c_count = 0;
这样就好了 指针有了具体的指向了
改成
int *cpointer;
int c_count = 0;
如果是这样的话 那就是 cpointer并没有具体指向的空间
换成
int arr[100];
int *cpointer = arr;
int c_count = 0;
这样就好了 指针有了具体的指向了
追问
谢谢回复!
指针没有初始化具体指向的时候,会容易出现寻址错误么?我习惯于使用char *p来表示一个数组,因为这种方式不需要固定数组的长度。
另外下面也有个函数pop和push,这两个的缓存栈也是用的指针:
double *number_stack;
/*这里使用指针的时候,就没有出错,这里的寻址计算会比上面的ungetch要频繁*/
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询