当应用程序运行时,指针的位置如何跟踪?
指针被存储为任何其他变量;他们通常采用与unsigned long
相同的尺寸,但这绝不是保证,只是为了让您了解它们是如何实现的。编译器可以自由地进行各种各样的优化,因此指针可以存储在内存中,它们可以存储在寄存器中,或者它们可以仅作为假设的实体存在,如果它们是优化过的。
考虑下面的代码:
void foo(void) {
char *c;
char buf[100];
for (c=buf; c < buf+100; c++ {
c = '0';
}
}
在这种情况下,可变c
被用于写入ASCII字符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涵盖惊人的细节指针,是非常值得的钱。
我不认为我已经很好地解释了我的问题,对不起。我的意思是为什么object-c指针中的对象引用?为什么应用程序(运行时?)不使用实际对象的地址,而是使用指向对象的指针的地址?另外当你做'string = @“bye”''时,你正在改变指针的内容,如果指针位于内存位置1并且@“bye”的内存位置是2,则表示'设置内存的内容位置1到2'(据我所知你是回答),有没有办法做'设置内存位置2的内容到',而不需要指针? –
2012-04-29 00:33:52
'string'是一个指向'NSString'的类型变量。当你做'string = @“bye”'你把NSString'@“bye”'的地址赋给变量'string'。指针的使用允许你一次引用一些地方的一些数据(例如类,对象,模块),而不需要复制它。它还简化了幕后对象的工作并节省了大量空间。 – MByD 2012-04-29 00:39:06
当然,您可以直接使用对象的地址而不是指针?并避免重复数据的方式?另外为什么你不必在设置变量时使用运算符(&)的地址(为什么不是'string =&@“bye”')?感谢您的回答和耐心。 – 2012-04-29 00:53:20