我正在学习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个星号)。
答案 0 :(得分:3)
charPtr
是一个变量,它包含指向类型char
的值的指针。在第2行之后,它保存变量c
的地址。
*charPtr
是一个表达式,它取消引用指针并访问指向地址的值。由于charPtr
指向char
类型的值,因此表达式*charPtr
的类型为char
。如果您从char foo = *charPtr;
开始阅读,则会在指向的位置获得char
。在这种情况下,您获得c
的值,即'Q'
。如果您对其进行写入操作,例如*charPtr = 'A';
,则会在指向的位置存储新值。在这种情况下,您可以更改c
。
**charPtr
是语法错误,因为charPtr
不是指向指针的类型。表达式具有双重取消引用的形式:第一个取消引用是*charPtr
,就像上面一样。再次应用*
运算符会尝试再次取消引用它,但*charPtr
的类型为char
。它不是指针,因此无法解除引用。
您可能有这样的变量:
char **charPtrPtr = &charPtr;
现在,charPtrPtr
是一个保存charPtr
变量地址的变量。它的类型是char**
。
*charPtrPtr
取消引用它所持有的指针并获取它指向的值。这是charPtr
的值,而c
又指向**charPtrPtr
的指针。
*
是双重引用。这是将一元*charPtrPtr
运算符应用于*charPtrPtr
。由于charPtr
实际上与**charPtrPtr
相同,*charPtr
实际上与c
相同,与{{1}}相同。
答案 1 :(得分:3)
简而言之,*charPtr
指的是charPtr
指向的值。但是,由于StackOverflow的答案需要比单个句子长一点,我会尝试给你一个类比。
如你所知,指针有点像路标,说"你要找的东西是A / B / C无论什么"。指针可以用多种方式使用。
首先,您可以将标志指向其他地方,相当于charPtr = &c
,说"而不是A / B / C,现在使用c作为目的地"。
其次,您也可以使用指针来更改指向的内容,这相当于*charPtr = 'Q'
,它不会真正改变指针本身,但会更改字段的内容指着。保持道路标志类比,就好像标志能够改变城市的名称(即var c
的内容)
最后,指针本身也可以指向,有点像指向下一个标志的标志。例如char **cc = &charPtr
将是指向原始符号的符号,在这种情况下**cc
可用于访问实际值,而*cc
是第一个符号的内容(地址)实际价值)。这可以扩展到眼睛可以看到的范围,或者至少在实际需要的范围内。
答案 2 :(得分:1)
char *charPtr;
- 您正在声明一个名为charPtr的变量char *
,即“指向char的指针”charPtr = &c;
- 您正在为charPtr变量分配变量c *charPtr
- 在这种情况下,'*'
字符是间接运算符,这意味着在charPtr指向的地址中获取值。在这种情况下,* charPtr的类型为char
(并且不 char*
)现在,根据语句*charPtr = &c
中的上述内容,您尝试将变量c(&c
)的地址分配给char(*charPtr
),这就是为什么你得到了警告Incompatible pointer to integer conversion assigning to 'char' from 'char *'; remove &
。
当您运行应用程序时,您将尝试将一个地址(大小为4或8个字节)分配给char类型的变量(通常为1或2个字节),这就是您的应用程序崩溃{{{ 1}}