这是我想了解的atoi()。为了与不存在的库进行编译,我将其称为m()

我对几行代码感到困惑,主要是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行中,您将使用pCur而非*pCur输出字符串。在第一种形式中,它是指向char的指针,该指针被视为以第一个“空字节”('\0')结尾的字符串。在第二种形式中,指针所指向的内存地址已被取消引用,因此您实际上是在打印单个字符。

在第2行中,目的是在字符串末尾退出循环。方便地,字符串以第一个“空字节”结尾,该字节由0表示,其值为false。 pCur++沿着字符串移动指针,直到找到0。

在第3行中,pCur现在指向空字节,该字节实际上转换为空字符串。

在第4行中,*pCur再次取消引用指针地址,但是该字符是不可打印的字符'\0',因此您在输出中看不到任何内容。

在第5行中,您将指针向后移了一个空格,以指向“242”的一位,因此您将2视为输出。

08-26 17:06