當應用程序運行時,指針的位置如何跟蹤?
指針被存儲爲任何其他變量;他們通常採用與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