2016-01-17 79 views
4

當我運行下面的代碼時,我的輸出不是我所期望的。指針算法陣列

我的理解方式是ptr指向Str數組的第一個元素的地址。我認爲ptr + 5應該導致+5號元素是f。所以輸出只能顯示f而不能同時顯示fg

爲什麼顯示fg?它是否與cout顯示數組有關?

#include <iostream> 
using namespace std; 

int main() 
{ 
    char *ptr; 
    char Str[] = "abcdefg"; 

    ptr = Str; 
    ptr += 5; 

    cout << ptr; 

    return 0; 
} 

預期輸出:f

實際輸出:fg

+3

ptr - 指向字符串的指針。如果你想打印字符,使用* ptr:cout << * ptr; – SashaMN

+0

用更合適的「指向」替換「主角」,你就會明白。 – Drop

回答

6

當你聲明:

char Str[] = "abcdefg" 

字符串abcdefg與一個多餘的字符\0這標誌着結束隱含存儲字符串。

所以,當你cout一個char*輸出將存儲的所有字符,其中char *點並存儲在連續的內存位置的char*後,直到\0字符在存儲位置之一中遇到的所有字符!因爲在你的例子中\0字符在g之後,因此打印了2個字符。

在你只想打印當前字符的情況下,你應該這樣做::

cout << *ptr; 
2

爲什麼顯示fg

爲什麼std::cout << char*打印字符串直到結束,而不是一個字符串的單個字符是,是因爲std::cout對待一個char *爲指針,以C風格的字符串,並打印出來這樣的第一個字符。

你的陣列:

char Str[] = "abcdefg"; 

被隱式地分配一個'\0'在端部和它被當作一個C風格串。

它與std::cout如何顯示數組有關嗎?

這具有做與如何處理std::coutC-style strings,測試這個陣列類型更改爲int,看到了差異,即,其將打印的單個元素。


1。這是因爲在C中沒有字符串類型,並且通過類型爲char的指針操縱字符串,指示開始和終止字符:'\0',指示結束。