2012-04-29 131 views
3

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

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

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

我改变存储在名为string指针的值(是它被命名为string或NSString的对象的指针?)到的地址新的字符串(“再见”),对吧?
那么我会如何直接改变存储在指针所保存地址处的对象?

(还有什么用,我曾用“跟踪”正确的术语?)

感谢

回答

7

何必跟踪的指针,为什么不直接保留 跟踪指针持有的地址?在目标C

对象引用实际上是指针,所以每次使用一个对象(如NSString),可以使用一个指向它的指针 - 存储(NSString *

我改变的值在名为字符串的指针(是指 命名字符串的指针还是NSString对象?)到新字符串(“bye”)的地址 ,对不对?

没错。

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

对于这种字符串,它们是不可变的,并且在其他对象的情况下,您不能更改它们,您可以调用它们的方法或设置它们的属性。

+0

我不认为我已经很好地解释了我的问题,对不起。我的意思是为什么object-c指针中的对象引用?为什么应用程序(运行时?)不使用实际对象的地址,而是使用指向对象的指针的地址?另外当你做'string = @“bye”''时,你正在改变指针的内容,如果指针位于内存位置1并且@“bye”的内存位置是2,则表示'设置内存的内容位置1到2'(据我所知你是回答),有没有办法做'设置内存位置2的内容到',而不需要指针? – 2012-04-29 00:33:52

+0

'string'是一个指向'NSString'的类型变量。当你做'string = @“bye”'你把NSString'@“bye”'的地址赋给变量'string'。指针的使用允许你一次引用一些地方的一些数据(例如类,对象,模块),而不需要复制它。它还简化了幕后对象的工作并节省了大量空间。 – MByD 2012-04-29 00:39:06

+0

当然,您可以直接使用对象的地址而不是指针?并避免重复数据的方式?另外为什么你不必在设置变量时使用运算符(&)的地址(为什么不是'string =&@“bye”')?感谢您的回答和耐心。 – 2012-04-29 00:53:20

3

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

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

考虑下面的代码:

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

在这种情况下,可变c被用于写入ASCII字符0buf阵列中的每一个字符。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); 

这将覆盖hH在通过c指针可分配的空间。访问指针,好像他们是阵列是这样一样重新写指针访问:

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

而且,事实上,数组访问很相似 - 数组的名称是一样的指针它的第一个元素。

这有点复杂;书Expert C Programming涵盖惊人的细节指针,是非常值得的钱。

0

问:那么我会如何直接改变存储在指针所保存地址处的对象呢?

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

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

相关问题