Objective c 指针差 我正在研究Obj-C中的指针。考虑下面的代码: char c = 'Q'; char *charPtr; charPtr = &c;
在第二行中,我们创建了一个char类型的指针变量,并将其命名为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
charPtr
。在我的理解中,这只是指向内存地址的指针,其中包含类型为char
的一些值
在第三行中,我们将charPtr
值(内存地址)分配给另一个包含valuec
的内存地址
我的问题是,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'
,它实际上不会更改指针本身,而是更改它指向的字段的内容。与道路标志相似,该标志似乎能够改变城市名称(即varc
的内容)
最后,指针本身也可以被指向,有点像指向下一个符号的符号。例如,char**cc=&charPtr
将是指向原始符号的符号,在这种情况下,**cc
可用于访问实际值,而*cc
是第一个符号的内容(实际值的地址)。这可以扩展到眼睛能看到的地方,或者至少可以扩展到实际需要的地方。charPtr
是char*
类型的指针*charPtr
属于char
类型;指针指向的是char
对象**charPtr
是非法的,因为*charPtr
不是指针。@KeithThompson在这种情况下可以使用两个星号,这意味着什么?感谢您的澄清。@evgeniykleban想象您有一些抽象的指针声明T*ptr;T可以是任何类型,ptr可以是指向