3

据我了解,指针包含另一个内存位置的数据地址?
当应用程序运行时,如何跟踪指针的位置?为什么要费心跟踪指针,为什么不直接跟踪指针持有的地址呢?

此外,如果我有以下代码:

NSString *string = @"hello";
string = @"bye";

我正在将存储在命名指针string(是命名的指针string还是 NSString 对象?)中的值更改为新字符串的地址(“再见”),对吗?
那么我将如何直接更改存储在指针所持有的地址处的对象呢?

(此外,在我使用“跟踪”的地方使用的正确术语是什么?)

谢谢

4

3 回答 3

7

为什么要费心跟踪指针,为什么不直接跟踪指针持有的地址呢?

Objective C 中的对象引用实际上是指针,因此每次使用对象(例如NSString)时,都会使用指向它的指针 - ( NSString *)

我正在将存储在名为 string 的指针中的值(是名为 string 的指针还是 NSString 对象?)更改为新字符串的地址(“再见”),对吗?

正确的。

那么我将如何直接更改存储在指针所持有的地址处的对象呢?

对于此类字符串,它们是不可变的,您无法更改它们,对于其他对象,您可以调用它们的方法或设置它们的属性。

于 2012-04-29T00:14:31.200 回答
3

当应用程序运行时,如何跟踪指针的位置?

指针存储为任何其他变量;它们通常采用与 a 相同的大小unsigned long,但这绝不是保证,只是为了让您了解它们是如何实现的。编译器可以自由地进行各种各样的优化,因此指针可能存储在内存中,它们可能存储在寄存器中,或者如果它们被优化掉,它们可能仅作为假设实体存在。

考虑以下代码:

void foo(void) {
    char *c;
    char buf[100];
    for (c=buf; c < buf+100; c++ {
        c = '0';
    }
}

在这种情况下,该变量c用于将 ASCII 字符写入数组0中的每个字符。可能只存在于寄存器中,因为它不会超出此功能。(有更好的方法来编写此代码。)bufc

考虑以下代码:

struct foo {
    char name[10];
    struct foo *next;
}

在这种情况下,成员next是指向更多struct foo对象的指针——例如,这些事物的链表。这些指针必须存储在内存中,因为它们是这些对象契约的一部分——它们必须在那里。也没有办法绕过这些指针——它们指向的对象可以根据程序员的心血来潮替换为其他对象。而且,由于这些对象的数量完全在运行时确定,因此编译器不能只跟踪其符号表中的地址,就像对堆栈分配的变量一样。

那么我将如何直接更改存储在指针所持有的地址处的对象呢?

"foo"您的示例在代码中使用字符串使这变得复杂。它们保存在进程地址空间的只读内存中,因此您无法修改它们。(惊喜!)如果你用另一种方法初始化字符串,你可以通过指针修改数据:

char *c = malloc(10);
strcpy(c, "hello");
c[0] = 'H';
printf("c: %s\n", c);

这将覆盖通过指针可用的分配空间中的hwith 。像访问数组一样访问指针与像这样重写指针访问相同:Hc

c[0] = 'f';
c+0 = 'f';

而且,实际上,数组访问非常相似——数组的名称与指向其第一个元素的指针相同。

这有点复杂;Expert C Programming一书以惊人的细节涵盖了指针,非常物有所值。

于 2012-04-29T00:59:33.443 回答
0

问:那么我将如何直接更改存储在指针所持有的地址中的对象?

Ans:如果你想改变你的字符串指针指向的内存位置的内容,开始使用NSMutableString 。

NSString 是不可变类型,即您不能更改内容,但可以使指针指向其他地方。在你的情况下,“你好”到“再见”。

于 2012-12-13T09:02:11.883 回答