簡體   English   中英

指針和字符數組的混亂

[英]Pointer and char array confusion

#include <iostream>
using namespace std;
int main()
{
 char str[] {"TESTING"};
 char *p {str};
 cout << (p++, *++p);
 cout << *p++;
 cout << p;
 return 0;
}

返回“ SSTING”

我知道這篇文章可能不完全適用於stackoverflow,但我無法弄清楚它的作用,也找不到有關它的任何文檔。

 cout << (p++, *++p); 

第一次看到cout中帶有逗號的圓括號...它們的功能是什么?

並且不應該只在這行說“ TESTING”,但似乎只說TING

cout << p;

謝謝!

讓我們逐行進行:

char str[] {"TESTING"};

該行定義了一個名為str的變量,其類型數組為8個字符 ,並使用字符TESTING加上NUL字符對其進行初始化以標記結尾。

char *p {str};

這個變量定義了一個名為p的類型為char的類型指針的變量,並將其初始化為數組str的第一個char(第一個T )的地址。 發生這種情況是因為在大多數情況下,數組會自動衰減為指針。

cout << (p++, *++p);

這條線可以做幾件事。 ,運算符首先計算左側運算符p++ ,該運算符使指針遞增,現在指向E 然后它計算右手運算符*++p ,但這是一個預遞增運算符,因此它將再次增加指針(它指向S )。 最后, *運算符訪問p指向的內存,結果為S 並將該字符打印到STDOUT中。

cout << *p++;

這很容易。 *運算符訪問由p指向的字符(再次為S )並將其打印在STDOUT中。 然后,它遞增指針,因為它是后遞增運算符。 現在它指向第二個T

cout << p;

至少,此行打印p指向的字符串,直到找到NUL字符為止。 由於p指向數組的第二個T ,它將顯示TING

將所有這些輸出放在一起,就可以得到SSTING

不完全是答案,而是代碼的功能細分,

#include <iostream>

using namespace std;

int main()
{
    char str[]{"TESTING"};
    char *p{str}; // p points to: 'T'
    p++;          // p points to: 'E'
    ++p;          // p points to: 'S'
    cout << *p;   // output a single char: 'S'
    cout << *p;   // ouptut a single char: 'S'
    p++;          // p points to: 'T'
    cout << p;    // output a (char *) type pointer, AKA a C-string, "TING";

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM