1

这是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 行:为什么 cout 是 2?*pStr是作为指向char242 的指针传入的,不应该是 242 吗?
第 2 行:我必须注释掉它,cout因为它看起来像是处于无限循环中。这while (*pCur)是什么意思?为什么我们需要这个循环?
第 3 行:为什么它不打印任何内容?
第 4 行:为什么它不打印任何内容?
第 5 行:为什么它减少后现在打印出 2?

4

2 回答 2

3

要理解为什么会发生这种情况,您需要了解字符串在 C++ 中是如何工作的,实际上,字符数组是如何工作的。字符串实际上只是一个字符数组,以空字符(值 0,而不是数字 0)结尾。我们通过指向数组中的第一个字符来传递这个字符串。当我们希望打印字符串时,我们只需打印指向的字符,增加指针,然后继续,直到我们到达空字符。

第 1 行:您取消引用指针,它实际上是一个指向字符数组的指针。所以指针指向第一个字符。它看起来像这样:

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 行:这不是一个无限循环,您检查指向的 char 的值,如果它不为 0,则增加指针。这本质上就是迭代字符串字符的方式。对于每次迭代,您将打印出指向的字符(正如您 commted 部分所做的那样),并增加指针,直到到达空字符。

由于您已经增加了上面的指针直到它到达空字符,所以它也将在循环之后指向空字符。因此,当您打印 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)
于 2013-03-04T21:34:45.880 回答
1

在第 1 行中,您将使用pCurnot*pCur来输出字符串。在第一种形式中,它是指向 a 的指针char它被视为以第一个“空字节”( '\0') 结尾的字符串。在第二种形式中,指针指向的内存地址被取消引用,因此您实际上是在打印单个字符。

在第 2 行中,目的是在字符串末尾退出循环。方便的是,字符串在第一个“空字节”处结束,用 0 表示,其计算结果为 false。pCur++沿字符串移动指针,直到找到 0 。

在第 3 行中,pCur现在指向空字节,它本质上转换为空字符串。

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

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

于 2013-03-04T21:43:28.183 回答