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は 242 へのポインタとして渡されましたが、char代わりに 242 ではないはずですか?
2 行目:cout無限ループに陥っているように見えるので、これをコメントアウトする必要がありwhile (*pCur)ます。どういう意味ですか? そして、なぜこのループが必要なのでしょうか?
3 行目:何も出力されないのはなぜですか?
4 行目:何も出力されないのはなぜですか?
5 行目:デクリメントされた後に 2 が出力されるのはなぜですか?

4

2 に答える 2

3

なぜこれが起こるのかを理解するには、C++ で文字列がどのように機能するか、実際には文字の配列がどのように機能するかを理解する必要があります。文字列は実際には単なる文字の配列であり、null 文字 (数字の 0 ではなく値 0) で終わります。配列の最初の文字を指すことによって、この文字列を渡します。文字列を出力したいときは、指している文字を出力し、ポインタを増やし、ヌル文字に到達するまでこれを続けます。

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は実際には指している文字の値なので、が指す文字が 0 でないwhile (*ptr)限り継続します。増加することでポインターが増加し、ある時点で null バイトに到達します。ptrptr

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でなければポインタを増やします。これは基本的に、文字列の文字を反復する方法です。反復ごとに、指している文字を出力し (セクションをコメントアウトしたように)、ヌル文字に到達するまでポインターを増やします。

上記のポインターをヌル文字に到達するまで増やしたので、ループ後もヌル文字を指しています。そのため、ptr ポインターを印刷すると、上記のループが実際に実行され、null ポインターに到達するまですべての文字が印刷されます。しかし、あなたの場合、すでにヌル文字を指しています。

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 では、文字列を出力しpCurないように使用します。*pCur最初の形式では、これはへのポインタcharであり、最初の「ヌル バイト」( '\0') で終わる文字列と見なされます。2 番目の形式では、ポインタが指すメモリ アドレスが逆参照されているため、実際には 1 文字を出力しています。

行 2 の目的は、文字列の最後でループを終了することです。便利なことに、文字列は最初の「null バイト」で終わります。これは、false と評価される 0 で表されます。はpCur++、0 が見つかるまでポインタを文字列に沿って移動します。

3 行目でpCurは、null バイトを指しています。これは、基本的に空の文字列に変換されます。

4 行目で*pCurは、再びポインター アドレスを逆参照していますが、文字は印刷できない文字 で'\0'あるため、出力には何も表示されません。

5 行目では、ポインタを 1 スペース分戻して、「242」の 1 桁を指すようにしたため2、出力として表示されます。

于 2013-03-04T21:43:28.183 に答える