2010-02-25 168 views
7

我讀the following text from Stanford's Programming Paradigms class,我注意到,當筆者使用string類的構造函數的函數調用,看起來像這樣:小學C++類型混淆

string::string(const char* str) { 
    initializeFrom(str, str + strlen(str)); 
} 

如果initializeFrom函數有兩個char *參數,第二個參數怎麼會傳遞一個(char * + int)到一個char *並讓它正常工作?類型系統如何解釋這個陳述?

在此先感謝。

+0

'strlen()'實際上返回一個'size_t',而不是'int'。其中一個重要的區別是'size_t'是一個無符號類型,即它只能保持正數。這是有道理的 - 字符串長度可以是0,1或30000個字符,但從不是-7。 – MSalters 2010-02-25 08:54:56

回答

11

這就是所謂的指針算術。 char * + int會導致char *在內存中的int值更高。

+1

+1用於正確命名。 :) – 2010-02-25 02:31:53

+0

如果'int'是-ve,它在內存中可能會更低;所以它應該是一個'unsigned int',結果在內存中總是* always *。 [對不起,如果這是挑剔;] – legends2k 2010-02-25 02:55:42

+0

@ legends2k這是真的,雖然strlen()不應該返回一個負值,所以在這裏分析的特定代碼將導致第二個參數總是大於或等於第一個。 – ChrisH 2010-02-25 03:07:37

0

第一個參數指向char數組的開始,第二個參數指向char數組末尾的NULL char。

const char *str = "abc"; 
char *start = str; // start now points to the first char. 
char *end = str + strlen(str); // end now points to the null char at the end. 

您可以通過印刷證實了這一點:

printf("%c %d",*start,*end); // will output: a 0 
0

怎麼來的第二個參數可以通過一個(字符* + INT)

它仍然是傳遞一個char *指點到strlen(str)過去最初指出的位置。

2

請記住,指針只是一個保存內存地址的變量。所以你可以將值添加到內存地址。內存地址是一個數字。

當您將1添加到某個類型的指針時,它實際上會添加1 * sizeof(type)。當你添加任何值N時,它實際上會添加N * sizeof(type)。

考慮下面的例子:

int x[5] = {0,1,2,3,4}; 
int *p = &(x[0]);//point to the first element 
p = p + 1;//p now points to the second element. 
4

二進制加法運算符+-時可以使用一個參數是一個指向任何完整的類型(比如,T* p)和其他參數的整數(比如, i)。他們實現了所謂的指針運算

編譯器假定指針指向某個數組的元素(例如,T array[N])。該操作會生成一個指向數組另一個元素的指針,該元素與原始元素相距i個元素。可以在任一方向上「移動」指針,即朝向陣列的開始或朝向陣列的末尾。例如,如果p指向array[3],則p + 4將指向array[7]

該操作僅在結果指向數組的現有元素或超過數組的最後一個元素時有效,即給定數組T array[N],可以創建指向元素從array[0]到虛數元素的指針array[N]。任何使用指針算術來跨越這些界限的嘗試都會導致未定義的行爲。

類型T必須是完整的,這意味着指針運算不能與void *指針被用於一個示例中,即使一些編譯器允許此作爲一個擴展(處理void *指針作爲相當於char *指針)。

除了二進制加法運算符,指針運算也包括前綴和後綴的一元++--運算符(應用到指針)以及化合物賦值運算符+=-=(與它們的左手側和整數上的指針右側)。

在你的情況下,str + strlen(str)表達式將產生一個指針char *類型,指向終止\0字符串str

0

我認爲這可能是過度的回答。

在:

initializeFrom(str, str + strlen(str)); 

str是一個指針串的開始。

(str + strlen(str))是一個指向字符串末尾的指針。

請記住str(字符指針)只是一個整數((int),(long),(long long),具體取決於體系結構),用於標識內存中的位置。

+0

指針不是(總是)一個整數。例如,在x86-16上,它是一對整數。 – MSalters 2010-02-25 08:57:51