c ++指针声明和赋值

c++ pointer declaration and assignment

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
int num1 = 8;   //okay
int *pointer;   //okay
*pointer = &num1;   //NOT okay, compiler says (Error:a value of type int* cannot be
                    //assigned to an entity of type"int")

int num2 = 8;   //okay
int *pointer = &num2;   //okay

我很困惑为什么第一部分会出错,而第二部分不会,在我看来它们是一样的。


在转让声明中:

1
*pointer = &num1;   //NOT okay

*pointerint型的pointer指向的值,&num1num1型的地址,int*型的地址。正如编译器所说,您不能将指针赋给整数。

pointer = &num1*pointer = num1都可以,这取决于您想修改指针本身还是它指向的值。

在声明中:

1
int *pointer = &num2;   //okay

尽管与赋值语句的外观相似,但这会初始化pointer,而不是*pointer。声明pointer为指针,与&num2类型相同。


拆下第三行中的*。它返回当前存储在变量指针中的位置/地址处的值,并将其解释为int。


以下更多的是一般性的描述,而不是直接回答您的问题…

如果声明某种类型的变量,那么也可以声明指向它的另一个变量。

例如:

int a;

int* b = &a;

有两种方法可以"查看"变量b(这可能会让大多数初学者感到困惑):

  • 您可以将b视为int*类型的变量。

  • 您可以将*b视为int类型的变量。

因此,一些程序员会声明int* b,而另一些程序员则声明int *b

但事实上,这两个声明是相同的(空格毫无意义)。

可以使用b作为指向整数值的指针,也可以使用*b作为实际的指向整数值。

您可以读取指向值(如int c = *b)并写入指向值(如*b = 5)。


1
int *pointer = &num2;

是一样的

1
2
int *pointer;
pointer = &num2;

1
2
int *pointer;
*pointer = &num2;

错误信息非常清楚:表达式*pointerint类型,表达式&num1int*类型。这两种类型不兼容(您尝试将指针分配给非指针)。

当您在指针上使用取消引用操作符*时,您会得到指针指向的内容,如果您使用操作符&的地址,则会得到某个对象的地址(即指针指向)。

要使pointer指向一个变量,然后只分配给它:

1
pointer = &num1;

操作符&给出了一个指向正在作用的变量的指针。&num1是指向int的指针(因为num1具有指向num1地址的int类型)。