指针引用:数字1和2中的指针引用有什么区别?

时间:2018-07-31 16:03:37

标签: c pointers

为什么第一个显示正常,而第二个显示错误。 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);
}   

2 个答案:

答案 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;之类的声明说*ptr1char,意味着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之后,表达式*ptr1char。指向已声明的char的实际指针是ptr1,而不是*ptr1

当初始化出现在声明中时,它将初始化声明的对象(ptr1),而不是声明中的示例表达式(不是*ptr1)。