指针差异

时间:2015-04-05 20:31:19

标签: objective-c c pointers

我正在学习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个星号)。

3 个答案:

答案 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}}