C指针与Objective-C Pointers[英] C pointers vs. Objective-C pointers

本文是小编为大家收集整理的关于C指针与Objective-C Pointers的处理方法,想解了C指针与Objective-C Pointers的问题怎么解决?C指针与Objective-C Pointers问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我来自Objective-C背景,并试图在C中扩大我的知识.但是,我感到困惑,这就是C和OBJ-C中的指针之间的区别.正如您在下面的示例中看到的那样,两种语言之间的行为似乎有所不同,我想知道您是否可以帮助解释为什么?

C代码正常工作:

void myFunction()
{
    int x, *pointerX; 
    pointerX = &x;
    *pointerX = 5;

    // Prints: "x is 5"
    printf("x is: %i", x);
}

OBJ-C代码失败:

- (void)myMethod
{
    NSString *string = @"Caramel coffee", *stringPointer;
    stringPointer = &string;                    // Warning:   Assignemnt from incompatible pointer type
    *stringPointer = @"Chocolate milkshake";    // Exception: Incompatible types in assignment

    NSLog(@"string is: %@", string);
}

问题:为什么我不能将StringPointer分配给字符串的内存地址(stringPointer = &string;),为什么我能够在C下执行*pointerX = 5;,但我无法执行*stringPointer = @"Chocolate milkshake";在Objective-C?

我意识到OBJ-C涉及对象,C不会,但是我似乎无法弄清楚幕后细节,说明为什么它在OBJ-C中不起作用.任何帮助是极大的赞赏.谢谢! :)

推荐答案

在您的第一个示例中,x和pointerX具有不同的类型(分别为(int)和(int *)).在您的第二个示例中,string和stringPointer具有相同 type(NSString *).改用:

NSString *string = @"Caramel coffee", **stringPointer;

其他推荐答案

您的NSString *string本身就是指针.因此,为了指向它,您需要将stringPointer声明为指针指向指针.也就是说,声明stringPointer这样:

NSString **stringPointer;

那么一切都应该起作用.请注意,相同的指针语义适用于C和Objective-C.

其他推荐答案

事实是,当您创建对象时,您实际上总是通过分配给它的指针来操作它,因此(NSString *).

尝试在C中做同样的事情(使用字符串),也许变得更加清晰:

void myFunction()
{
    char *string = "this is a C string!";
    char **ptr=&string;


    // Prints: "this is a c string"
    printf("ptr points to %s: \n",  *ptr);
}

您可以看到,指针的工作方式与Objective-C完全相同.请记住,Objective-C中很少有原始图(INT是最明显的).在大多数情况下,您正在创建类型对象X的指针(例如NSString),然后分配一大堆内存(通过[[Object Alloc] Init]),并将该块的起始地址放在您的指针上.与我们的字符串中的C完全相同.

本文地址:https://www.itbaoku.cn/post/359309.html