什么指向指针?

时间:2012-04-29 00:09:54

标签: objective-c c pointers

据我所知,指针包含另一个内存位置的数据地址? 当应用程序运行时,指针的位置如何跟踪? 为什么不打算跟踪指针,为什么不直接跟踪指针所在的地址?

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

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

我将存储在名为string的指针(是指向string的指针还是NSString对象?)中的值更改为新字符串的地址(“bye”),对不对?
那么我将如何直接更改存储在指针所占地址的对象?

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

由于

3 个答案:

答案 0 :(得分:7)

  

为什么要记住指针,为什么不直接保持   指针所包含的地址轨迹?

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

  

我正在更改存储在名为string的指针中的值(就是它   指定字符串或NSString对象的指针?)到地址   新字符串(“再见”),对吧?

右。

  

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

对于这样的字符串,它们是不可变的,你不能改变它们,如果是其他对象,你可以调用它们的方法,或者设置它们的属性。

答案 1 :(得分:3)

  

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

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

请考虑以下代码:

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

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

请考虑以下代码:

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

在这种情况下,成员next是指向更多struct foo个对象的指针 - 比如这些东西的链接列表。这些指针必须存储在内存中,因为它们是这些对象的契约的一部分 - 它们必须存在。这些指针也没有办法 - 他们指向的对象可以被程序员突发奇想的其他对象替换。并且,由于这些对象的数量完全在运行时确定,因此编译器不能仅跟踪其symbol tables中的地址,就像堆栈分配的变量一样。

  

那么我该如何直接更改存储在指针所占地址的对象?

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

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

这将通过h指针在可用的已分配空间中覆盖H c。像访问指针一样访问指针就像重写指针访问一样:

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

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

有点复杂;这本书Expert C Programming涵盖了令人惊讶的细节,非常物有所值。

答案 2 :(得分:0)

问:那么如何直接更改存储在指针所占地址的对象?

Ans:如果要更改字符串指针指向的内存位置内容,请开始使用 NSMutableString

NSString是不可变类型,即您无法更改内容,但您可以将指针指向其他位置。 &#34;你好&#34; to&#34; bye&#34;在你的情况下。