我正在研究Obj-C中的指针。请考虑以下代码:

char c = 'Q';
char *charPtr;
charPtr = &c;

在第二行中,我们创建一个char类型的指针变量,并将其命名为charPtr。据我所知,这只是指向内存地址的指针,其中包含一些char类型的值。
在第三行中,我们将charPtr值(内存地址)分配给另一个包含值c的内存地址。
我的问题是,charPtr和*charPtr之间有什么区别?
当我写*charPtr = &c时,有一个“黄色”警告-Incompatible pointer to integer conversion assigning to 'char' from 'char *'; remove &
应用程序启动时崩溃(exc_bad_access
当我编写**charPtr = &c;时,编译器警告我有错误:Indirection requires pointer operand ('int' invalid)
总而言之,我想知道charPtr*charPtr之间的区别,以及什么是**charPtr(2个星号)。

最佳答案

charPtr是一个变量,它包含指向char类型值的指针。在第2行之后,它保存变量c的地址。
*charPtr是一个表达式,它取消对指针的引用并访问指向地址处的值。因为charPtr指向char类型的值,所以表达式具有*charPtr类型。如果你从中阅读,比如char,你会得到指向位置的char foo = *charPtr;。在本例中,得到char的值,即c。如果您像'Q'那样写入它,则会在指向的位置存储一个新值。在这种情况下,您可以更改*charPtr = 'A';的内容。
c是语法错误,因为**charPtr不是指向指针类型的指针。表达式具有双解引用的形式:第一个解引用是charPtr,正如上面所述。再次对其应用*charPtr运算符将尝试再次取消对它的引用,但*的类型是*charPtr。它不是指针,所以不能取消引用。
您可能有这样一个变量:

char **charPtrPtr = &charPtr;

现在,char是一个变量,它包含charPtrPtr变量的地址。它的类型是charPtr
char**取消引用它所保存的指针并获取它所指向的值。这是*charPtrPtr的值,它又是指向charPtr的指针。
c是双解引用。这是一元**charPtrPtr运算符在*中的应用。由于*charPtrPtr实际上与*charPtrPtr相同,charPtr实际上与**charPtrPtr相同,后者与*charPtr相同。

08-17 00:36