Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 指针差 我正在研究Obj-C中的指针。考虑下面的代码: char c = 'Q'; char *charPtr; charPtr = &c;_Objective C_C_Pointers - Fatal编程技术网

Objective c 指针差 我正在研究Obj-C中的指针。考虑下面的代码: char c = 'Q'; char *charPtr; charPtr = &c;

Objective c 指针差 我正在研究Obj-C中的指针。考虑下面的代码: char c = 'Q'; char *charPtr; charPtr = &c;,objective-c,c,pointers,Objective C,C,Pointers,在第二行中,我们创建了一个char类型的指针变量,并将其命名为charPtr。在我的理解中,这只是指向内存地址的指针,其中包含类型为char的一些值 在第三行中,我们将charPtr值(内存地址)分配给另一个包含valuec的内存地址 我的问题是,charPtr和*charPtr之间有什么区别 当我编写*charPtr=&c时,有一个“黄色”警告-指向整数转换的不兼容指针,该指针从“char*”分配给“char”;删除& 应用程序启动时崩溃(exc\u bad\u access) 当我写**ch

在第二行中,我们创建了一个char类型的指针变量,并将其命名为
charPtr
。在我的理解中,这只是指向内存地址的指针,其中包含类型为
char
的一些值

在第三行中,我们将
charPtr
值(内存地址)分配给另一个包含value
c
的内存地址

我的问题是,
charPtr
和*
charPtr
之间有什么区别

当我编写
*charPtr=&c
时,有一个“黄色”警告-
指向整数转换的不兼容指针,该指针从“char*”分配给“char”;删除&

应用程序启动时崩溃(
exc\u bad\u access

当我写
**charPtr=&c编译器警告我错误:
间接寻址需要指针操作数('int'无效)


总之,我想知道
charPtr
*charPtr
之间的区别,以及
**charPtr
是什么(两个星号)。

charPtr
是一个变量,它包含指向
char
类型值的指针。在第2行之后,它保存变量
c
的地址

*charPtr
是一个表达式,用于解引用指针并访问指向地址的值。由于
charPtr
指向类型为
char
的值,因此表达式
*charPtr
具有类型
char
。如果你从中阅读,比如
charfoo=*charPtr
,您将在指向的位置获得
字符。在本例中,您将获得
c
的值,即
'Q'
。如果你写它,比如
*charPtr='A',则在指向的位置存储新值。在这种情况下,您可以更改
c
的内容

**charPtr
是一个语法错误,因为
charPtr
不是指向指针类型的指针。表达式的形式是双重解引用:第一个解引用是
*charPtr
,如上所述。再次对其应用
*
运算符将尝试再次取消引用它,但
*charPtr
的类型是
char
。它不是指针,所以不能取消引用

您可能有这样一个变量:

char **charPtrPtr = &charPtr;
现在,
charPtr
是一个保存
charPtr
变量地址的变量。它的类型是
char**

*charptrpter
取消引用它所持有的指针并获取它所指向的值。这是
charPtr
的值,它又是指向
c
的指针

**charPtrPtr
是一种双重解引用。这是一元
*
运算符对
*charPtrPtr
的应用。由于
*charPtr
charPtr
有效相同,
**charPtr
*charPtr
有效相同,后者与
c
  • char*charPtr-您正在声明一个名为charPtr的变量,类型为
    char*
    ,即“指向char的指针”
  • charPtr=&c-您正在为charPtr变量分配变量c的地址
  • *charPtr
    -在本例中,
    '*'
    字符是间接运算符,表示获取charPtr所指地址中的值。在这种情况下,*charPtr的类型是
    char
    (而不是
    char*
现在,根据上面语句
*charPtr=&c
中的说明,您正试图将变量c(
&c
)的地址分配给一个char(
*charPtr
),这就是为什么您会从“char*”中得到警告
指向整数转换的不兼容指针;删除&


运行应用程序时,您将尝试将地址(大小为4或8字节)分配给char类型的变量(通常为1或2字节),这就是应用程序在
exc\u bad\u访问时崩溃的原因。简单地说,
*charPtr
指的是
charPtr
指向的值。然而,由于答案需要比一句话长一点,我将试着给你们一个类比

正如您所知,指针有点像一个路标,上面写着“您要找的东西在a/B/C什么的”。指针可以用几种方式使用

首先,您可以将该标志指向其他位置,这相当于
charPtr=&c
,表示“现在使用c作为目的地,而不是A/B/c”

其次,您还可以使用指针更改它指向的任何对象,这相当于
*charPtr='Q'
,它实际上不会更改指针本身,而是更改它指向的字段的内容。与道路标志相似,该标志似乎能够改变城市名称(即var
c
的内容)


最后,指针本身也可以被指向,有点像指向下一个符号的符号。例如,
char**cc=&charPtr
将是指向原始符号的符号,在这种情况下,
**cc
可用于访问实际值,而
*cc
是第一个符号的内容(实际值的地址)。这可以扩展到眼睛能看到的地方,或者至少可以扩展到实际需要的地方。

charPtr
char*
类型的指针
*charPtr
属于
char
类型;指针指向的是
char
对象
**charPtr
是非法的,因为
*charPtr
不是指针。@KeithThompson在这种情况下可以使用两个星号,这意味着什么?感谢您的澄清。@evgeniykleban想象您有一些抽象的指针声明T*ptr;T可以是任何类型,ptr可以是指向