2015-11-26 136 views
0

我對使用指針算術有點困惑。我在代碼中提出混淆問題作爲評論。我認爲當它增加時,另一個也必須增加。有人可以解釋嗎?使用指針算術混淆

#include <stdio.h> 

int main() 
{ 
    const char *str = "abcde"; 

    const char *temp = str; // str is pointer to address of first element of temp isn't it? 

    printf("%d\n", temp - str); // zero okey 

    printf("temp str\n"); 

    printf("%d %d\n", temp, str); // shows same adresses 

    str++; // hard to understand a point is here 

    printf("%d %d\n", temp, str); // why weren't also temp increased? 

    temp++; 

    printf("%d %d\n", temp, str); // why weren't also str increased? 

    temp++; 

    printf("%d %d\n", temp, str); // why weren't also str increased? 

    return 0; 
} 

回答

1

tempstr都是不同的指針變量。修改它們中的任何一個都不會導致其他修改,但修改它們指向的數據將會起作用。

您應該記住,在您的情況下,您可以修改strtemp,但不能修改它們指向的字符串字面值,因爲字符串文字不可修改。

另請注意,對於指針數據類型%p被用作printf中的格式說明符來打印它們指向的地址。

0

temp將不會增加str,就像b不會增加aint a=0, b=0;中一樣。它們是自變量。

str爲指針,以解決"abcde"第一要素,它不會有因爲被定義temp之前它被定義與temp任何關係。

順便說一句,不要試圖用%d打印指針。這是未定義的行爲,因爲類型不匹配。

#include <stdio.h> 

int main(void) 
{ 
    const char *str = "abcde"; 

    const char *temp = str; // str is pointer to address of first element of temp isn't it? 

    printf("%ld\n", (long)(temp - str)); // zero okey 

    printf("temp str\n"); 

    printf("%p %p\n", (void*)temp, (void*)str); // shows same adresses 

    str++; // hard to understand a point is here 

    printf("%p %p\n", (void*)temp, (void*)str); // why weren't also temp increased? 

    temp++; 

    printf("%p %p\n", (void*)temp, (void*)str); // why weren't also str increased? 

    temp++; 

    printf("%p %p\n", (void*)temp, (void*)str); // why weren't also str increased? 

    return 0; 
} 
0

在你的代碼,tempstr自己兩個不同的變量,但是,數據,他們指出,相同

如果您修改其中任何一個指向的內容,則可以看到通過其他方式反映的更改。

此外,FWIW,打印地址,由侵犯于格式說明適當類型的參數要求改變

printf("%d %d\n", temp, str); 

printf("%p %p\n", (void *) temp, (void *)str); 

,否則,你會調用undefined behavior

0

const char * temp = str; 表示temp指針取得str指針的值。 他們沒有鏈接。 你可以在不改變temp的情況下改變str,因爲它就像 * temp = &(str [0]); * temp value是字符串「abcde」中'a'的地址 如果你是str ++ * temp值是字符串「abcde」中'a'的地址,* str是'b' 我不知道還有什麼我會爲你做的。

0

此聲明

const char *str = "abcde"; 

意味着以下內容。有分配內存變量str,它是由字符串字面"abcde"

的第一個字符的地址初始化在此聲明

const char *temp = str; 

分配有內存的另一個指針與名temp和指針變存儲在變量str中的值的副本

所以,現在你有兩個內存單元,每個單元都包含字符串文字的第一個字符的地址。

本聲明

str++; // hard to understand a point is here 

意味着存儲在str值增加。前面的值是字符串文字的第一個字符的地址。在增加值noe後,它等於字符串文字的第二個字符的地址。

你可以通過執行語句以調用此語句之前的printf函數,它

printf("%s\n", str); 

str++; // hard to understand a point is here 
printf("%s\n", str); 

存儲在變量temp值沒有改變後檢查。

該語句後

temp++; 

兩個變量有一個是指向字符串常量的第二個字符相同的值。存儲在名爲strtemp的不同存儲單元中的值。

第二條語句

temp++; 

變量temp將有值之後等於字符串字面的第三個字符的地址。存儲在變量str中的值未被更改。

正如你應該知道的字符串文字包括終止零。您可以輸出字符串文字的所有字符,直到遇到終止零。

考慮下面的代碼片斷

const char *str = "abcde"; 
const char *temp = str; 

while (*temp != '\0') printf("%s\n", temp++); 

循環變量temp之後將具有pointes的字符串字面的終止零值。與此同時,存儲在str中的值不會改變,並且會像以前一樣指向字符串文字的第一個字符。