为什么第一个显示正常,而第二个显示错误。 1。
char *reverse(char *ara)
{
char *ptr1=ara,*ptr2=ara;
}
2。
char *reverse(char *ara)
{
char *ptr1,*ptr2;
*ptr1=ara,*ptr2=ara;
}
主要功能如下所示
int main()
{
char ara[100]="Programming";
reverse(ara);
}
答案 0 :(得分:3)
第一个等效于:
char *ptr1;
char *ptr2;
ptr1 = ara; // ptr1 points to the same place as ara
ptr2 = ara; // ptr2 points to the same place as ara
而第二个等效于:
char *ptr1;
char *ptr2;
*ptr1 = ara; // Problems
*ptr2 = ara; // Problems
问题1:
这些行是编译时的问题,因为*ptr1
和*ptr2
的赋值类型为char
,而char*
的求值为ptr1
。
问题2:
如果编译器将忽略该错误,那么您将遇到运行时错误,因为ptr2
和*ptr1
都没有指向任何有效的东西,并且您正在使用*ptr2
或{{1} }分配值。
答案 1 :(得分:0)
诸如char *ptr1;
之类的声明说*ptr1
是char
,意味着ptr1
是指向char
的指针。
当声明包含初始化时,如char *ptr1 = ara;
一样,这意味着指向ptr1
的指针char
被初始化为值ara
。
在诸如*ptr1 = ara
的分配中,*ptr1
表示ptr1
所指向的事物。因此,此分配正在尝试将ara
的指针值char
分配给char
所指向的ptr1
。您的编译器对此表示抱怨,因为char
不是指向char
的指针的合适目的地。
您应该清楚名称在声明中的外观以及它们在表达式中的外观。在声明中,该名称与运算符一起使用以显示如何使用该名称的示例。例如,char foo()
说foo
将用作函数,因此它是一个返回char
的函数,而char foo[]
说foo
将被使用作为数组,所以它是char
的数组。
当您以与在声明中相同的方式使用标识符时,它将形成具有声明类型的表达式。因此,在声明char *ptr1
之后,表达式*ptr1
是char
。指向已声明的char
的实际指针是ptr1
,而不是*ptr1
。
当初始化出现在声明中时,它将初始化声明的对象(ptr1
),而不是声明中的示例表达式(不是*ptr1
)。