我正在研究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
相同。