2013-03-04 47 views
1

這是一個atoi()我想了解。爲了與不存在的庫進行編譯,我將其稱爲m()atoi()方法,char * cout

有幾行代碼我很困惑,主要是char *問題。

我的問題是在代碼後上市:

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int m(char* pStr) { 
    int iRetVal = 0; 
    int iTens = 1; 
    cout << "* pStr: " << * pStr << endl; // line 1 
    if (pStr) {  
     char* pCur = pStr; 
     cout << "* pCur: " << * pCur << endl; 
     while (*pCur) {  
      //cout << "* pCur: " << * pCur << endl; //line 2 
      pCur++; } 
     cout << "pCur: " << pCur << endl;  //line 3 
     cout << "* pCur: " << * pCur << endl; //line 4 
     pCur--;  
     cout << "pCur: " << pCur << endl;  //line 5 
     while (pCur >= pStr && *pCur <= '9' && *pCur >= '0')  {  
      iRetVal += ((*pCur - '0') * iTens);  
      pCur--;  
      iTens *= 10;  } } 
    return iRetVal; } 


int main(int argc, char * argv[]) 
{ 
    int i = m("242"); 
    cout << i << endl; 
    return 0; 
} 

輸出:

* pStr: 2 
* pCur: 2 
pCur: 
* pCur: 
pCur: 2 
242 

問題

第1行:爲什麼cout是2? * pStr作爲指向char的指針傳入242,不應該是242而是?
第2行:我必須註釋掉這個cout,因爲它看起來像處於無限循環中。while (*pCur)是什麼意思?爲什麼我們需要這個循環?
第3行:爲什麼它不打印出任何東西?
第4行:爲什麼它不打印出任何東西?
第5行:爲什麼現在打印出2之後就減少了?

回答

1

在1號線,你會用pCur*pCur輸出字符串。在第一種形式中,它是指針char,其被視爲在第一個「空字節」('\0')處結束的字符串。在第二種形式中,指針所指向的內存地址被解除引用,因此您實際上正在打印單個字符。

在第2行中,意圖是在字符串末尾退出循環。方便的是,字符串以第一個「空字節」結束,該空字符表示爲0,其值爲假。 pCur++將指針沿着字符串移動,直到找到0。

在第3行中,pCur現在指向空字節,它基本上轉換爲空字符串。

在4號線,*pCur再次—解引用指針地址,但字符是一個非打印字符,'\0',這樣你就不會看到你的任何輸出。

在第5行,則移動指針背面一個空間—指向的「242」個位,所以你看到2作爲輸出。

+0

從現在開始,while(pCur> = pStr ...)中的另一個快速問題是pCur = 242和pStr = 2,這是怎麼回事? – HoKy22 2013-03-04 22:43:11

+0

@ HoKy22 - 注意'(pCur> = pStr)'和'(* pCur> = * pStr)'之間的區別。在後者中,您取消引用每一側以檢索字符:'2'和'2'。然而在前者中,你正在比較_memory addresses_。這種情況只是簡單地檢查'pCur'沒有指向字符串開頭之前的地址'pStr'。換句話說,你通過'pCur ++'通過字符串向前遍歷,直到找到空字節,然後通過'pCur - '向後遍歷字符串,直到你太過分了('pCur' < 'pStr')。 – 2013-03-04 23:10:55

3

要理解爲什麼發生這種情況,您需要了解字符串如何在C++中工作,以及字符數組如何工作。一個字符串實際上只是一個字符數組,以空字符結尾(值爲0,而不是數字0)。我們通過指向數組中的第一個字符來傳遞此字符串。當我們希望打印字符串時,只需打印指向的字符,增加指針並繼續,直到達到空字符。

line 1:你對指針取消引用,它實際上是一個指向字符數組的指針。所以指針指向char的第一個。它看起來像這樣:

char 1: 2 <-- The pointer points to this 
char 2: 4 
char 3: 2 
char 4: \0 (null byte) 

通過前面加上*指針您檢索它指向的值,這是字符2

線2:正如我所提到的1號線, *ptr實際上是指向的字符的值,所以while (*ptr)將繼續,只要ptr指向的字符不爲0。通過增加ptr我們增加指針,並在某一點達到空字節。

char 1: 2 
char 2: 4 
char 3: 2 
char 4: \0 (null byte) <-- After the loop, this is what we point at 

線3:這不是一個無限循環,你檢查炭的價值指向,如果不爲0,你增加了指針。這基本上是你迭代字符串的字符的方式。對於每一次迭代,你都會打印出指向的字符(如你所指出的那樣)並增加指針,直到你到達空字符。

由於您增加了上面的指針直到它到達空字符,它也將指向循環後的空字符。所以當你打印ptr指針時,你真的執行上面的循環,打印所有字符,直到你到達一個空指針。但在你的情況下,你已經指向空字符。

char 1: 2 
char 2: 4 
char 3: 2 
char 4: \0 (null byte) <-- We are still point to the null character, 
          so it is treated as an empty string 

線4:您嘗試打印出來的字符指向ptr,但這是空字符所以沒有打印。

char 1: 2 
char 2: 4 
char 3: 2 
char 4: \0 (null byte) <-- We are still point to the null character so no 
          printing is done. 

線5:您減少對上面的行的指針,這意味着它指向數組中的前一個元素。所以你現在指向最後的'2'字符,所以它被打印出來。

char 1: 2 
char 2: 4 
char 3: 2 <-- You decreased it by one, so now we are pointing at 2. 
char 4: \0 (null byte)