2012-04-29 101 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是不可改變的類型,即你不能改變內容,但你可以使指針指向別的地方。 「你好」再到「再見」你的情況。

相關問題